diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/migrate.ant b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/migrate.ant
index 215e05a..6f5b07e 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/migrate.ant
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/migrate.ant
@@ -122,8 +122,8 @@
 				-->
 				<replacestring from="private static final int ADAPTING = 1 &lt;&lt; 7;" to="private boolean adapting;" />
 				<replacestring from="(eFlags &amp; ADAPTING) == 0" to="!adapting" />
-				<replacestring from="eFlags |= ADAPTING;" to="adapting = true;" />
-				<replacestring from="eFlags &amp;= ~ADAPTING;" to="adapting = false;" />
+				<replacestring from="eFlags |= ADAPTING;" to="adapting = true; org.eclipse.emf.spi.cdo.InternalCDOView view = cdoView(); if (view != null &amp;&amp; !view.isClosed()) {" />
+				<replacestring from="eFlags &amp;= ~ADAPTING;" to="adapting = false; }" />
 
 				<tokenfilter>
 					<filetokenizer />
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AbstractionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AbstractionImpl.java
index 02a7322..d33fb30 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AbstractionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AbstractionImpl.java
@@ -1,18 +1,20 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -21,6 +23,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -87,20 +91,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.ABSTRACTION__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ABSTRACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.ABSTRACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ABSTRACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -109,9 +106,7 @@
 	 * @generated
 	 */
 	public OpaqueExpression getMapping() {
-		return (OpaqueExpression) eDynamicGet(
-			UMLPackage.ABSTRACTION__MAPPING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ABSTRACTION__MAPPING, true, true);
+		return (OpaqueExpression) eDynamicGet(UMLPackage.ABSTRACTION__MAPPING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ABSTRACTION__MAPPING, true, true);
 	}
 
 	/**
@@ -120,9 +115,7 @@
 	 * @generated
 	 */
 	public OpaqueExpression basicGetMapping() {
-		return (OpaqueExpression) eDynamicGet(
-			UMLPackage.ABSTRACTION__MAPPING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ABSTRACTION__MAPPING, false, true);
+		return (OpaqueExpression) eDynamicGet(UMLPackage.ABSTRACTION__MAPPING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ABSTRACTION__MAPPING, false, true);
 	}
 
 	/**
@@ -132,8 +125,7 @@
 	 */
 	public NotificationChain basicSetMapping(OpaqueExpression newMapping,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newMapping,
-			UMLPackage.ABSTRACTION__MAPPING, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newMapping, UMLPackage.ABSTRACTION__MAPPING, msgs);
 		return msgs;
 	}
 
@@ -143,8 +135,7 @@
 	 * @generated
 	 */
 	public void setMapping(OpaqueExpression newMapping) {
-		eDynamicSet(UMLPackage.ABSTRACTION__MAPPING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ABSTRACTION__MAPPING, newMapping);
+		eDynamicSet(UMLPackage.ABSTRACTION__MAPPING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ABSTRACTION__MAPPING, newMapping);
 	}
 
 	/**
@@ -153,8 +144,7 @@
 	 * @generated
 	 */
 	public OpaqueExpression createMapping(String name, Type type) {
-		OpaqueExpression newMapping = (OpaqueExpression) create(
-			UMLPackage.Literals.OPAQUE_EXPRESSION);
+		OpaqueExpression newMapping = (OpaqueExpression) create(UMLPackage.Literals.OPAQUE_EXPRESSION);
 		setMapping(newMapping);
 		if (name != null)
 			newMapping.setName(name);
@@ -172,20 +162,18 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ABSTRACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ABSTRACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ABSTRACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ABSTRACTION__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.ABSTRACTION__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.ABSTRACTION__MAPPING :
-				return basicSetMapping(null, msgs);
+		case UMLPackage.ABSTRACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ABSTRACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ABSTRACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ABSTRACTION__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.ABSTRACTION__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.ABSTRACTION__MAPPING:
+			return basicSetMapping(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -198,54 +186,54 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ABSTRACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ABSTRACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ABSTRACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ABSTRACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ABSTRACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ABSTRACTION__NAME :
-				return getName();
-			case UMLPackage.ABSTRACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ABSTRACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ABSTRACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ABSTRACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ABSTRACTION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.ABSTRACTION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.ABSTRACTION__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.ABSTRACTION__SOURCE :
-				return getSources();
-			case UMLPackage.ABSTRACTION__TARGET :
-				return getTargets();
-			case UMLPackage.ABSTRACTION__CLIENT :
-				return getClients();
-			case UMLPackage.ABSTRACTION__SUPPLIER :
-				return getSuppliers();
-			case UMLPackage.ABSTRACTION__MAPPING :
-				if (resolve)
-					return getMapping();
-				return basicGetMapping();
+		case UMLPackage.ABSTRACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ABSTRACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ABSTRACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ABSTRACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ABSTRACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ABSTRACTION__NAME:
+			return getName();
+		case UMLPackage.ABSTRACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ABSTRACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ABSTRACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ABSTRACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ABSTRACTION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.ABSTRACTION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.ABSTRACTION__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.ABSTRACTION__SOURCE:
+			return getSources();
+		case UMLPackage.ABSTRACTION__TARGET:
+			return getTargets();
+		case UMLPackage.ABSTRACTION__CLIENT:
+			return getClients();
+		case UMLPackage.ABSTRACTION__SUPPLIER:
+			return getSuppliers();
+		case UMLPackage.ABSTRACTION__MAPPING:
+			if (resolve)
+				return getMapping();
+			return basicGetMapping();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -259,44 +247,40 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ABSTRACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ABSTRACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ABSTRACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ABSTRACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ABSTRACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ABSTRACTION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ABSTRACTION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ABSTRACTION__CLIENT :
-				getClients().clear();
-				getClients()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.ABSTRACTION__SUPPLIER :
-				getSuppliers().clear();
-				getSuppliers()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.ABSTRACTION__MAPPING :
-				setMapping((OpaqueExpression) newValue);
-				return;
+		case UMLPackage.ABSTRACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ABSTRACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ABSTRACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ABSTRACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ABSTRACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ABSTRACTION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ABSTRACTION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ABSTRACTION__CLIENT:
+			getClients().clear();
+			getClients().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.ABSTRACTION__SUPPLIER:
+			getSuppliers().clear();
+			getSuppliers().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.ABSTRACTION__MAPPING:
+			setMapping((OpaqueExpression) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -309,36 +293,36 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ABSTRACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ABSTRACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ABSTRACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ABSTRACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ABSTRACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ABSTRACTION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ABSTRACTION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ABSTRACTION__CLIENT :
-				getClients().clear();
-				return;
-			case UMLPackage.ABSTRACTION__SUPPLIER :
-				getSuppliers().clear();
-				return;
-			case UMLPackage.ABSTRACTION__MAPPING :
-				setMapping((OpaqueExpression) null);
-				return;
+		case UMLPackage.ABSTRACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ABSTRACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ABSTRACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ABSTRACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ABSTRACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ABSTRACTION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ABSTRACTION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ABSTRACTION__CLIENT:
+			getClients().clear();
+			return;
+		case UMLPackage.ABSTRACTION__SUPPLIER:
+			getSuppliers().clear();
+			return;
+		case UMLPackage.ABSTRACTION__MAPPING:
+			setMapping((OpaqueExpression) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -351,44 +335,42 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ABSTRACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ABSTRACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ABSTRACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ABSTRACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.ABSTRACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ABSTRACTION__NAME :
-				return isSetName();
-			case UMLPackage.ABSTRACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ABSTRACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ABSTRACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ABSTRACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ABSTRACTION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.ABSTRACTION__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.ABSTRACTION__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.ABSTRACTION__SOURCE :
-				return isSetSources();
-			case UMLPackage.ABSTRACTION__TARGET :
-				return isSetTargets();
-			case UMLPackage.ABSTRACTION__CLIENT :
-				return !getClients().isEmpty();
-			case UMLPackage.ABSTRACTION__SUPPLIER :
-				return !getSuppliers().isEmpty();
-			case UMLPackage.ABSTRACTION__MAPPING :
-				return basicGetMapping() != null;
+		case UMLPackage.ABSTRACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ABSTRACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ABSTRACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ABSTRACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.ABSTRACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ABSTRACTION__NAME:
+			return isSetName();
+		case UMLPackage.ABSTRACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ABSTRACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ABSTRACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ABSTRACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ABSTRACTION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.ABSTRACTION__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.ABSTRACTION__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.ABSTRACTION__SOURCE:
+			return isSetSources();
+		case UMLPackage.ABSTRACTION__TARGET:
+			return isSetTargets();
+		case UMLPackage.ABSTRACTION__CLIENT:
+			return !getClients().isEmpty();
+		case UMLPackage.ABSTRACTION__SUPPLIER:
+			return !getSuppliers().isEmpty();
+		case UMLPackage.ABSTRACTION__MAPPING:
+			return basicGetMapping() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -401,10 +383,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.ABSTRACTION__OWNED_COMMENT,
-		UMLPackage.ABSTRACTION__NAME_EXPRESSION,
-		UMLPackage.ABSTRACTION__MAPPING};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.ABSTRACTION__OWNED_COMMENT, UMLPackage.ABSTRACTION__NAME_EXPRESSION, UMLPackage.ABSTRACTION__MAPPING };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -414,7 +393,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.ABSTRACTION__MAPPING);
+				|| eIsSet(UMLPackage.ABSTRACTION__MAPPING);
 	}
 
 } //AbstractionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AcceptCallActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AcceptCallActionImpl.java
index 6e6749b..13a6d55 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AcceptCallActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AcceptCallActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,8 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +29,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -105,19 +109,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						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>(OutputPin.class, this,
-			UMLPackage.ACCEPT_CALL_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.ACCEPT_CALL_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -126,11 +124,7 @@
 	 * @generated
 	 */
 	public OutputPin getReturnInformation() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACCEPT_CALL_ACTION__RETURN_INFORMATION, true,
-			true);
+		return (OutputPin) eDynamicGet(UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACCEPT_CALL_ACTION__RETURN_INFORMATION, true, true);
 	}
 
 	/**
@@ -139,11 +133,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetReturnInformation() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACCEPT_CALL_ACTION__RETURN_INFORMATION, false,
-			true);
+		return (OutputPin) eDynamicGet(UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACCEPT_CALL_ACTION__RETURN_INFORMATION, false, true);
 	}
 
 	/**
@@ -153,8 +143,7 @@
 	 */
 	public NotificationChain basicSetReturnInformation(
 			OutputPin newReturnInformation, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newReturnInformation,
-			UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newReturnInformation, UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION, msgs);
 		return msgs;
 	}
 
@@ -164,11 +153,7 @@
 	 * @generated
 	 */
 	public void setReturnInformation(OutputPin newReturnInformation) {
-		eDynamicSet(
-			UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACCEPT_CALL_ACTION__RETURN_INFORMATION,
-			newReturnInformation);
+		eDynamicSet(UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACCEPT_CALL_ACTION__RETURN_INFORMATION, newReturnInformation);
 	}
 
 	/**
@@ -177,8 +162,7 @@
 	 * @generated
 	 */
 	public OutputPin createReturnInformation(String name, Type type) {
-		OutputPin newReturnInformation = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newReturnInformation = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setReturnInformation(newReturnInformation);
 		if (name != null)
 			newReturnInformation.setName(name);
@@ -194,8 +178,7 @@
 	 */
 	public boolean validateResultPins(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AcceptCallActionOperations.validateResultPins(this, diagnostics,
-			context);
+		return AcceptCallActionOperations.validateResultPins(this, diagnostics, context);
 	}
 
 	/**
@@ -205,8 +188,7 @@
 	 */
 	public boolean validateTriggerCallEvent(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AcceptCallActionOperations.validateTriggerCallEvent(this,
-			diagnostics, context);
+		return AcceptCallActionOperations.validateTriggerCallEvent(this, diagnostics, context);
 	}
 
 	/**
@@ -216,8 +198,7 @@
 	 */
 	public boolean validateUnmarshall(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AcceptCallActionOperations.validateUnmarshall(this, diagnostics,
-			context);
+		return AcceptCallActionOperations.validateUnmarshall(this, diagnostics, context);
 	}
 
 	/**
@@ -229,45 +210,34 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ACCEPT_CALL_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACCEPT_CALL_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACCEPT_CALL_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.ACCEPT_CALL_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACCEPT_CALL_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACCEPT_CALL_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACCEPT_CALL_ACTION__RESULT :
-				return ((InternalEList<?>) getResults()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACCEPT_CALL_ACTION__TRIGGER :
-				return ((InternalEList<?>) getTriggers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION :
-				return basicSetReturnInformation(null, msgs);
+		case UMLPackage.ACCEPT_CALL_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_CALL_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_CALL_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.ACCEPT_CALL_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_CALL_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_CALL_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_CALL_ACTION__RESULT:
+			return ((InternalEList<?>) getResults()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_CALL_ACTION__TRIGGER:
+			return ((InternalEList<?>) getTriggers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION:
+			return basicSetReturnInformation(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -280,84 +250,84 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ACCEPT_CALL_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ACCEPT_CALL_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ACCEPT_CALL_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ACCEPT_CALL_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ACCEPT_CALL_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ACCEPT_CALL_ACTION__NAME :
-				return getName();
-			case UMLPackage.ACCEPT_CALL_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ACCEPT_CALL_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ACCEPT_CALL_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACCEPT_CALL_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ACCEPT_CALL_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.ACCEPT_CALL_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.ACCEPT_CALL_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.ACCEPT_CALL_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.ACCEPT_CALL_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.ACCEPT_CALL_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.ACCEPT_CALL_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.ACCEPT_CALL_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.ACCEPT_CALL_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.ACCEPT_CALL_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.ACCEPT_CALL_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.ACCEPT_CALL_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.ACCEPT_CALL_ACTION__IS_UNMARSHALL :
-				return isUnmarshall();
-			case UMLPackage.ACCEPT_CALL_ACTION__RESULT :
-				return getResults();
-			case UMLPackage.ACCEPT_CALL_ACTION__TRIGGER :
-				return getTriggers();
-			case UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION :
-				if (resolve)
-					return getReturnInformation();
-				return basicGetReturnInformation();
+		case UMLPackage.ACCEPT_CALL_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ACCEPT_CALL_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ACCEPT_CALL_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ACCEPT_CALL_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ACCEPT_CALL_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ACCEPT_CALL_ACTION__NAME:
+			return getName();
+		case UMLPackage.ACCEPT_CALL_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ACCEPT_CALL_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ACCEPT_CALL_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACCEPT_CALL_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ACCEPT_CALL_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.ACCEPT_CALL_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.ACCEPT_CALL_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.ACCEPT_CALL_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.ACCEPT_CALL_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.ACCEPT_CALL_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.ACCEPT_CALL_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.ACCEPT_CALL_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.ACCEPT_CALL_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.ACCEPT_CALL_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.ACCEPT_CALL_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.ACCEPT_CALL_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.ACCEPT_CALL_ACTION__IS_UNMARSHALL:
+			return isUnmarshall();
+		case UMLPackage.ACCEPT_CALL_ACTION__RESULT:
+			return getResults();
+		case UMLPackage.ACCEPT_CALL_ACTION__TRIGGER:
+			return getTriggers();
+		case UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION:
+			if (resolve)
+				return getReturnInformation();
+			return basicGetReturnInformation();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -371,91 +341,81 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ACCEPT_CALL_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__IS_UNMARSHALL :
-				setIsUnmarshall((Boolean) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__RESULT :
-				getResults().clear();
-				getResults().addAll((Collection<? extends OutputPin>) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__TRIGGER :
-				getTriggers().clear();
-				getTriggers().addAll((Collection<? extends Trigger>) newValue);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION :
-				setReturnInformation((OutputPin) newValue);
-				return;
+		case UMLPackage.ACCEPT_CALL_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__IS_UNMARSHALL:
+			setIsUnmarshall((Boolean) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__RESULT:
+			getResults().clear();
+			getResults().addAll((Collection<? extends OutputPin>) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__TRIGGER:
+			getTriggers().clear();
+			getTriggers().addAll((Collection<? extends Trigger>) newValue);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION:
+			setReturnInformation((OutputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -468,69 +428,69 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACCEPT_CALL_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__IS_UNMARSHALL :
-				setIsUnmarshall(IS_UNMARSHALL_EDEFAULT);
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__RESULT :
-				getResults().clear();
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__TRIGGER :
-				getTriggers().clear();
-				return;
-			case UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION :
-				setReturnInformation((OutputPin) null);
-				return;
+		case UMLPackage.ACCEPT_CALL_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__IS_UNMARSHALL:
+			setIsUnmarshall(IS_UNMARSHALL_EDEFAULT);
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__RESULT:
+			getResults().clear();
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__TRIGGER:
+			getTriggers().clear();
+			return;
+		case UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION:
+			setReturnInformation((OutputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -543,72 +503,70 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACCEPT_CALL_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ACCEPT_CALL_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ACCEPT_CALL_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ACCEPT_CALL_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.ACCEPT_CALL_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ACCEPT_CALL_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.ACCEPT_CALL_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ACCEPT_CALL_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ACCEPT_CALL_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ACCEPT_CALL_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ACCEPT_CALL_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.ACCEPT_CALL_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.ACCEPT_CALL_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.ACCEPT_CALL_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.ACCEPT_CALL_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.ACCEPT_CALL_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.ACCEPT_CALL_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.ACCEPT_CALL_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.ACCEPT_CALL_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.ACCEPT_CALL_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.ACCEPT_CALL_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.ACCEPT_CALL_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.ACCEPT_CALL_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.ACCEPT_CALL_ACTION__IS_UNMARSHALL :
-				return isUnmarshall() != IS_UNMARSHALL_EDEFAULT;
-			case UMLPackage.ACCEPT_CALL_ACTION__RESULT :
-				return !getResults().isEmpty();
-			case UMLPackage.ACCEPT_CALL_ACTION__TRIGGER :
-				return !getTriggers().isEmpty();
-			case UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION :
-				return basicGetReturnInformation() != null;
+		case UMLPackage.ACCEPT_CALL_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ACCEPT_CALL_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ACCEPT_CALL_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ACCEPT_CALL_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.ACCEPT_CALL_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ACCEPT_CALL_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.ACCEPT_CALL_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ACCEPT_CALL_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ACCEPT_CALL_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ACCEPT_CALL_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ACCEPT_CALL_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.ACCEPT_CALL_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.ACCEPT_CALL_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.ACCEPT_CALL_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.ACCEPT_CALL_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.ACCEPT_CALL_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.ACCEPT_CALL_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.ACCEPT_CALL_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.ACCEPT_CALL_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.ACCEPT_CALL_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.ACCEPT_CALL_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.ACCEPT_CALL_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.ACCEPT_CALL_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.ACCEPT_CALL_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.ACCEPT_CALL_ACTION__IS_UNMARSHALL:
+			return isUnmarshall() != IS_UNMARSHALL_EDEFAULT;
+		case UMLPackage.ACCEPT_CALL_ACTION__RESULT:
+			return !getResults().isEmpty();
+		case UMLPackage.ACCEPT_CALL_ACTION__TRIGGER:
+			return !getTriggers().isEmpty();
+		case UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION:
+			return basicGetReturnInformation() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -623,179 +581,146 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ACCEPT_CALL_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ACCEPT_CALL_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ACCEPT_CALL_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ACCEPT_CALL_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ACCEPT_CALL_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACCEPT_CALL_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.ACCEPT_CALL_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.ACCEPT_CALL_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.ACCEPT_CALL_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.ACCEPT_CALL_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.ACCEPT_CALL_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_ONE_OUTPUT_PIN__DIAGNOSTICCHAIN_MAP :
-				return validateOneOutputPin((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_NO_INPUT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateNoInputPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_NO_OUTPUT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateNoOutputPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_UNMARSHALL_SIGNAL_EVENTS__DIAGNOSTICCHAIN_MAP :
-				return validateUnmarshallSignalEvents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_CONFORMING_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateConformingType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_RESULT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateResultPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_TRIGGER_CALL_EVENT__DIAGNOSTICCHAIN_MAP :
-				return validateTriggerCallEvent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_UNMARSHALL__DIAGNOSTICCHAIN_MAP :
-				return validateUnmarshall((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ACCEPT_CALL_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ACCEPT_CALL_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ACCEPT_CALL_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ACCEPT_CALL_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ACCEPT_CALL_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACCEPT_CALL_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACCEPT_CALL_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.ACCEPT_CALL_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.ACCEPT_CALL_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.ACCEPT_CALL_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.ACCEPT_CALL_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_ONE_OUTPUT_PIN__DIAGNOSTICCHAIN_MAP:
+			return validateOneOutputPin((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_NO_INPUT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateNoInputPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_NO_OUTPUT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateNoOutputPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_UNMARSHALL_SIGNAL_EVENTS__DIAGNOSTICCHAIN_MAP:
+			return validateUnmarshallSignalEvents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_CONFORMING_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateConformingType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_RESULT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateResultPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_TRIGGER_CALL_EVENT__DIAGNOSTICCHAIN_MAP:
+			return validateTriggerCallEvent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_CALL_ACTION___VALIDATE_UNMARSHALL__DIAGNOSTICCHAIN_MAP:
+			return validateUnmarshall((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -808,9 +733,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.ACCEPT_CALL_ACTION__RESULT,
-		UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.ACCEPT_CALL_ACTION__RESULT, UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -820,7 +743,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION);
+				|| eIsSet(UMLPackage.ACCEPT_CALL_ACTION__RETURN_INFORMATION);
 	}
 
 } //AcceptCallActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AcceptEventActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AcceptEventActionImpl.java
index 88f56c3..f05d04f 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AcceptEventActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AcceptEventActionImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,8 +29,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -120,19 +124,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						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>(OutputPin.class, this,
-			UMLPackage.ACCEPT_EVENT_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.ACCEPT_EVENT_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -141,10 +139,7 @@
 	 * @generated
 	 */
 	public boolean isUnmarshall() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.ACCEPT_EVENT_ACTION__IS_UNMARSHALL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACCEPT_EVENT_ACTION__IS_UNMARSHALL, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.ACCEPT_EVENT_ACTION__IS_UNMARSHALL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACCEPT_EVENT_ACTION__IS_UNMARSHALL, true, true);
 	}
 
 	/**
@@ -153,11 +148,7 @@
 	 * @generated
 	 */
 	public void setIsUnmarshall(boolean newIsUnmarshall) {
-		eDynamicSet(
-			UMLPackage.ACCEPT_EVENT_ACTION__IS_UNMARSHALL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACCEPT_EVENT_ACTION__IS_UNMARSHALL,
-			newIsUnmarshall);
+		eDynamicSet(UMLPackage.ACCEPT_EVENT_ACTION__IS_UNMARSHALL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACCEPT_EVENT_ACTION__IS_UNMARSHALL, newIsUnmarshall);
 	}
 
 	/**
@@ -167,9 +158,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<OutputPin> getResults() {
-		return (EList<OutputPin>) eDynamicGet(
-			UMLPackage.ACCEPT_EVENT_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACCEPT_EVENT_ACTION__RESULT, true, true);
+		return (EList<OutputPin>) eDynamicGet(UMLPackage.ACCEPT_EVENT_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACCEPT_EVENT_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -178,8 +167,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		getResults().add(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -204,18 +192,14 @@
 	 */
 	public OutputPin getResult(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		resultLoop : for (OutputPin result : getResults()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(result.getName())
-				: name.equals(result.getName())))
+		resultLoop: for (OutputPin result : getResults()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(result.getName()) : name.equals(result.getName())))
 				continue resultLoop;
 			if (type != null && !type.equals(result.getType()))
 				continue resultLoop;
 			return result;
 		}
-		return createOnDemand
-			? createResult(name, type)
-			: null;
+		return createOnDemand ? createResult(name, type) : null;
 	}
 
 	/**
@@ -234,9 +218,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Trigger> getTriggers() {
-		return (EList<Trigger>) eDynamicGet(
-			UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACCEPT_EVENT_ACTION__TRIGGER, true, true);
+		return (EList<Trigger>) eDynamicGet(UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACCEPT_EVENT_ACTION__TRIGGER, true, true);
 	}
 
 	/**
@@ -268,16 +250,12 @@
 	 */
 	public Trigger getTrigger(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		triggerLoop : for (Trigger trigger : getTriggers()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(trigger.getName())
-				: name.equals(trigger.getName())))
+		triggerLoop: for (Trigger trigger : getTriggers()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(trigger.getName()) : name.equals(trigger.getName())))
 				continue triggerLoop;
 			return trigger;
 		}
-		return createOnDemand
-			? createTrigger(name)
-			: null;
+		return createOnDemand ? createTrigger(name) : null;
 	}
 
 	/**
@@ -287,8 +265,7 @@
 	 */
 	public boolean validateOneOutputPin(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AcceptEventActionOperations.validateOneOutputPin(this,
-			diagnostics, context);
+		return AcceptEventActionOperations.validateOneOutputPin(this, diagnostics, context);
 	}
 
 	/**
@@ -298,8 +275,7 @@
 	 */
 	public boolean validateNoInputPins(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AcceptEventActionOperations.validateNoInputPins(this,
-			diagnostics, context);
+		return AcceptEventActionOperations.validateNoInputPins(this, diagnostics, context);
 	}
 
 	/**
@@ -309,8 +285,7 @@
 	 */
 	public boolean validateNoOutputPins(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AcceptEventActionOperations.validateNoOutputPins(this,
-			diagnostics, context);
+		return AcceptEventActionOperations.validateNoOutputPins(this, diagnostics, context);
 	}
 
 	/**
@@ -320,8 +295,7 @@
 	 */
 	public boolean validateUnmarshallSignalEvents(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AcceptEventActionOperations.validateUnmarshallSignalEvents(this,
-			diagnostics, context);
+		return AcceptEventActionOperations.validateUnmarshallSignalEvents(this, diagnostics, context);
 	}
 
 	/**
@@ -331,8 +305,7 @@
 	 */
 	public boolean validateConformingType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AcceptEventActionOperations.validateConformingType(this,
-			diagnostics, context);
+		return AcceptEventActionOperations.validateConformingType(this, diagnostics, context);
 	}
 
 	/**
@@ -344,43 +317,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ACCEPT_EVENT_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACCEPT_EVENT_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.ACCEPT_EVENT_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACCEPT_EVENT_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACCEPT_EVENT_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACCEPT_EVENT_ACTION__RESULT :
-				return ((InternalEList<?>) getResults()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER :
-				return ((InternalEList<?>) getTriggers()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.ACCEPT_EVENT_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_EVENT_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.ACCEPT_EVENT_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_EVENT_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_EVENT_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_EVENT_ACTION__RESULT:
+			return ((InternalEList<?>) getResults()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER:
+			return ((InternalEList<?>) getTriggers()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -393,80 +355,80 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ACCEPT_EVENT_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ACCEPT_EVENT_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ACCEPT_EVENT_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ACCEPT_EVENT_ACTION__NAME :
-				return getName();
-			case UMLPackage.ACCEPT_EVENT_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ACCEPT_EVENT_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ACCEPT_EVENT_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACCEPT_EVENT_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ACCEPT_EVENT_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.ACCEPT_EVENT_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.ACCEPT_EVENT_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.ACCEPT_EVENT_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.ACCEPT_EVENT_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.ACCEPT_EVENT_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.ACCEPT_EVENT_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.ACCEPT_EVENT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.ACCEPT_EVENT_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.ACCEPT_EVENT_ACTION__IS_UNMARSHALL :
-				return isUnmarshall();
-			case UMLPackage.ACCEPT_EVENT_ACTION__RESULT :
-				return getResults();
-			case UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER :
-				return getTriggers();
+		case UMLPackage.ACCEPT_EVENT_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ACCEPT_EVENT_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ACCEPT_EVENT_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ACCEPT_EVENT_ACTION__NAME:
+			return getName();
+		case UMLPackage.ACCEPT_EVENT_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ACCEPT_EVENT_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ACCEPT_EVENT_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACCEPT_EVENT_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ACCEPT_EVENT_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.ACCEPT_EVENT_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.ACCEPT_EVENT_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.ACCEPT_EVENT_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.ACCEPT_EVENT_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.ACCEPT_EVENT_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.ACCEPT_EVENT_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.ACCEPT_EVENT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.ACCEPT_EVENT_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.ACCEPT_EVENT_ACTION__IS_UNMARSHALL:
+			return isUnmarshall();
+		case UMLPackage.ACCEPT_EVENT_ACTION__RESULT:
+			return getResults();
+		case UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER:
+			return getTriggers();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -480,88 +442,78 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ACCEPT_EVENT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__IS_UNMARSHALL :
-				setIsUnmarshall((Boolean) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__RESULT :
-				getResults().clear();
-				getResults().addAll((Collection<? extends OutputPin>) newValue);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER :
-				getTriggers().clear();
-				getTriggers().addAll((Collection<? extends Trigger>) newValue);
-				return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__IS_UNMARSHALL:
+			setIsUnmarshall((Boolean) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__RESULT:
+			getResults().clear();
+			getResults().addAll((Collection<? extends OutputPin>) newValue);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER:
+			getTriggers().clear();
+			getTriggers().addAll((Collection<? extends Trigger>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -574,66 +526,66 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACCEPT_EVENT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__IS_UNMARSHALL :
-				setIsUnmarshall(IS_UNMARSHALL_EDEFAULT);
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__RESULT :
-				getResults().clear();
-				return;
-			case UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER :
-				getTriggers().clear();
-				return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__IS_UNMARSHALL:
+			setIsUnmarshall(IS_UNMARSHALL_EDEFAULT);
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__RESULT:
+			getResults().clear();
+			return;
+		case UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER:
+			getTriggers().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -646,70 +598,68 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACCEPT_EVENT_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ACCEPT_EVENT_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.ACCEPT_EVENT_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ACCEPT_EVENT_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.ACCEPT_EVENT_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ACCEPT_EVENT_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ACCEPT_EVENT_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ACCEPT_EVENT_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ACCEPT_EVENT_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.ACCEPT_EVENT_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.ACCEPT_EVENT_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.ACCEPT_EVENT_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.ACCEPT_EVENT_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.ACCEPT_EVENT_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.ACCEPT_EVENT_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.ACCEPT_EVENT_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.ACCEPT_EVENT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.ACCEPT_EVENT_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.ACCEPT_EVENT_ACTION__IS_UNMARSHALL :
-				return isUnmarshall() != IS_UNMARSHALL_EDEFAULT;
-			case UMLPackage.ACCEPT_EVENT_ACTION__RESULT :
-				return !getResults().isEmpty();
-			case UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER :
-				return !getTriggers().isEmpty();
+		case UMLPackage.ACCEPT_EVENT_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ACCEPT_EVENT_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ACCEPT_EVENT_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.ACCEPT_EVENT_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ACCEPT_EVENT_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.ACCEPT_EVENT_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ACCEPT_EVENT_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ACCEPT_EVENT_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ACCEPT_EVENT_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ACCEPT_EVENT_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.ACCEPT_EVENT_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.ACCEPT_EVENT_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.ACCEPT_EVENT_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.ACCEPT_EVENT_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.ACCEPT_EVENT_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.ACCEPT_EVENT_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.ACCEPT_EVENT_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.ACCEPT_EVENT_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.ACCEPT_EVENT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.ACCEPT_EVENT_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.ACCEPT_EVENT_ACTION__IS_UNMARSHALL:
+			return isUnmarshall() != IS_UNMARSHALL_EDEFAULT;
+		case UMLPackage.ACCEPT_EVENT_ACTION__RESULT:
+			return !getResults().isEmpty();
+		case UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER:
+			return !getTriggers().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -724,169 +674,140 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ACCEPT_EVENT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ACCEPT_EVENT_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ACCEPT_EVENT_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ACCEPT_EVENT_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ACCEPT_EVENT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACCEPT_EVENT_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.ACCEPT_EVENT_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.ACCEPT_EVENT_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.ACCEPT_EVENT_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.ACCEPT_EVENT_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.ACCEPT_EVENT_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_ONE_OUTPUT_PIN__DIAGNOSTICCHAIN_MAP :
-				return validateOneOutputPin((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_NO_INPUT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateNoInputPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_NO_OUTPUT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateNoOutputPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_UNMARSHALL_SIGNAL_EVENTS__DIAGNOSTICCHAIN_MAP :
-				return validateUnmarshallSignalEvents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_CONFORMING_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateConformingType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ACCEPT_EVENT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ACCEPT_EVENT_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ACCEPT_EVENT_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ACCEPT_EVENT_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ACCEPT_EVENT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACCEPT_EVENT_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACCEPT_EVENT_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.ACCEPT_EVENT_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.ACCEPT_EVENT_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.ACCEPT_EVENT_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.ACCEPT_EVENT_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_ONE_OUTPUT_PIN__DIAGNOSTICCHAIN_MAP:
+			return validateOneOutputPin((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_NO_INPUT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateNoInputPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_NO_OUTPUT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateNoOutputPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_UNMARSHALL_SIGNAL_EVENTS__DIAGNOSTICCHAIN_MAP:
+			return validateUnmarshallSignalEvents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACCEPT_EVENT_ACTION___VALIDATE_CONFORMING_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateConformingType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -899,8 +820,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.ACCEPT_EVENT_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.ACCEPT_EVENT_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -913,21 +833,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.ACCEPT_EVENT_ACTION__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ACCEPT_EVENT_ACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.ACCEPT_EVENT_ACTION__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ACCEPT_EVENT_ACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -938,15 +850,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.ACCEPT_EVENT_ACTION__OWNED_COMMENT,
-		UMLPackage.ACCEPT_EVENT_ACTION__NAME_EXPRESSION,
-		UMLPackage.ACCEPT_EVENT_ACTION__HANDLER,
-		UMLPackage.ACCEPT_EVENT_ACTION__INPUT,
-		UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_POSTCONDITION,
-		UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_PRECONDITION,
-		UMLPackage.ACCEPT_EVENT_ACTION__OUTPUT,
-		UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.ACCEPT_EVENT_ACTION__OWNED_COMMENT, UMLPackage.ACCEPT_EVENT_ACTION__NAME_EXPRESSION, UMLPackage.ACCEPT_EVENT_ACTION__HANDLER, UMLPackage.ACCEPT_EVENT_ACTION__INPUT,
+			UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_POSTCONDITION, UMLPackage.ACCEPT_EVENT_ACTION__LOCAL_PRECONDITION, UMLPackage.ACCEPT_EVENT_ACTION__OUTPUT, UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -956,7 +861,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.ACCEPT_EVENT_ACTION__RESULT);
+				|| eIsSet(UMLPackage.ACCEPT_EVENT_ACTION__RESULT);
 	}
 
 	/**
@@ -967,7 +872,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER);
+				|| eIsSet(UMLPackage.ACCEPT_EVENT_ACTION__TRIGGER);
 	}
 
 } //AcceptEventActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActionExecutionSpecificationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActionExecutionSpecificationImpl.java
index efffc05..fd6fe4e 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActionExecutionSpecificationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActionExecutionSpecificationImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,11 +17,17 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.uml2.uml.Action;
 import org.eclipse.uml2.uml.ActionExecutionSpecification;
 import org.eclipse.uml2.uml.Comment;
@@ -81,11 +87,7 @@
 	 * @generated
 	 */
 	public Action getAction() {
-		return (Action) eDynamicGet(
-			UMLPackage.ACTION_EXECUTION_SPECIFICATION__ACTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTION_EXECUTION_SPECIFICATION__ACTION, true,
-			true);
+		return (Action) eDynamicGet(UMLPackage.ACTION_EXECUTION_SPECIFICATION__ACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTION_EXECUTION_SPECIFICATION__ACTION, true, true);
 	}
 
 	/**
@@ -94,11 +96,7 @@
 	 * @generated
 	 */
 	public Action basicGetAction() {
-		return (Action) eDynamicGet(
-			UMLPackage.ACTION_EXECUTION_SPECIFICATION__ACTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTION_EXECUTION_SPECIFICATION__ACTION, false,
-			true);
+		return (Action) eDynamicGet(UMLPackage.ACTION_EXECUTION_SPECIFICATION__ACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTION_EXECUTION_SPECIFICATION__ACTION, false, true);
 	}
 
 	/**
@@ -107,11 +105,7 @@
 	 * @generated
 	 */
 	public void setAction(Action newAction) {
-		eDynamicSet(
-			UMLPackage.ACTION_EXECUTION_SPECIFICATION__ACTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTION_EXECUTION_SPECIFICATION__ACTION,
-			newAction);
+		eDynamicSet(UMLPackage.ACTION_EXECUTION_SPECIFICATION__ACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTION_EXECUTION_SPECIFICATION__ACTION, newAction);
 	}
 
 	/**
@@ -121,8 +115,7 @@
 	 */
 	public boolean validateActionReferenced(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActionExecutionSpecificationOperations
-			.validateActionReferenced(this, diagnostics, context);
+		return ActionExecutionSpecificationOperations.validateActionReferenced(this, diagnostics, context);
 	}
 
 	/**
@@ -133,56 +126,56 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME :
-				return getName();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__COVERED :
-				return getCovereds();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND :
-				if (resolve)
-					return getEnclosingOperand();
-				return basicGetEnclosingOperand();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION :
-				if (resolve)
-					return getEnclosingInteraction();
-				return basicGetEnclosingInteraction();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__GENERAL_ORDERING :
-				return getGeneralOrderings();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__FINISH :
-				if (resolve)
-					return getFinish();
-				return basicGetFinish();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__START :
-				if (resolve)
-					return getStart();
-				return basicGetStart();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ACTION :
-				if (resolve)
-					return getAction();
-				return basicGetAction();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME:
+			return getName();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__COVERED:
+			return getCovereds();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND:
+			if (resolve)
+				return getEnclosingOperand();
+			return basicGetEnclosingOperand();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION:
+			if (resolve)
+				return getEnclosingInteraction();
+			return basicGetEnclosingInteraction();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__GENERAL_ORDERING:
+			return getGeneralOrderings();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__FINISH:
+			if (resolve)
+				return getFinish();
+			return basicGetFinish();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__START:
+			if (resolve)
+				return getStart();
+			return basicGetStart();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ACTION:
+			if (resolve)
+				return getAction();
+			return basicGetAction();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -196,49 +189,46 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__COVERED :
-				getCovereds().clear();
-				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) newValue);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				getGeneralOrderings()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__FINISH :
-				setFinish((OccurrenceSpecification) newValue);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__START :
-				setStart((OccurrenceSpecification) newValue);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ACTION :
-				setAction((Action) newValue);
-				return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__COVERED:
+			getCovereds().clear();
+			getCovereds().addAll((Collection<? extends Lifeline>) newValue);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) newValue);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			getGeneralOrderings().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__FINISH:
+			setFinish((OccurrenceSpecification) newValue);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__START:
+			setStart((OccurrenceSpecification) newValue);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ACTION:
+			setAction((Action) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -251,42 +241,42 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__COVERED :
-				getCovereds().clear();
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) null);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) null);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__FINISH :
-				setFinish((OccurrenceSpecification) null);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__START :
-				setStart((OccurrenceSpecification) null);
-				return;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ACTION :
-				setAction((Action) null);
-				return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__COVERED:
+			getCovereds().clear();
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) null);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) null);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__FINISH:
+			setFinish((OccurrenceSpecification) null);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__START:
+			setStart((OccurrenceSpecification) null);
+			return;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ACTION:
+			setAction((Action) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -299,42 +289,40 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME :
-				return isSetName();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__COVERED :
-				return !getCovereds().isEmpty();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND :
-				return basicGetEnclosingOperand() != null;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION :
-				return basicGetEnclosingInteraction() != null;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__GENERAL_ORDERING :
-				return !getGeneralOrderings().isEmpty();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__FINISH :
-				return basicGetFinish() != null;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__START :
-				return basicGetStart() != null;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ACTION :
-				return basicGetAction() != null;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME:
+			return isSetName();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__COVERED:
+			return !getCovereds().isEmpty();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND:
+			return basicGetEnclosingOperand() != null;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION:
+			return basicGetEnclosingInteraction() != null;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__GENERAL_ORDERING:
+			return !getGeneralOrderings().isEmpty();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__FINISH:
+			return basicGetFinish() != null;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__START:
+			return basicGetStart() != null;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION__ACTION:
+			return basicGetAction() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -349,132 +337,114 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___SEPARATOR :
-				return separator();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___VALIDATE_SAME_LIFELINE__DIAGNOSTICCHAIN_MAP :
-				return validateSameLifeline((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION___VALIDATE_ACTION_REFERENCED__DIAGNOSTICCHAIN_MAP :
-				return validateActionReferenced(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___SEPARATOR:
+			return separator();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___VALIDATE_SAME_LIFELINE__DIAGNOSTICCHAIN_MAP:
+			return validateSameLifeline((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION___VALIDATE_ACTION_REFERENCED__DIAGNOSTICCHAIN_MAP:
+			return validateActionReferenced((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActionImpl.java
index d2c25bb..fac2562 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActionImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
- *   Kenn Hussey - 519572
+ *   Kenn Hussey - 519572, 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -16,6 +16,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -25,8 +26,10 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -119,18 +122,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						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>(OutputPin.class, this,
-			UMLPackage.ACTION__OUTPUT, null);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.ACTION__OUTPUT, null);
 	}
 
 	/**
@@ -148,10 +146,8 @@
 	 * @generated
 	 */
 	public OutputPin getOutput(String name, Type type, boolean ignoreCase) {
-		outputLoop : for (OutputPin output : getOutputs()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(output.getName())
-				: name.equals(output.getName())))
+		outputLoop: for (OutputPin output : getOutputs()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(output.getName()) : name.equals(output.getName())))
 				continue outputLoop;
 			if (type != null && !type.equals(output.getType()))
 				continue outputLoop;
@@ -168,11 +164,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.ACTION__OWNED_COMMENT, UMLPackage.ACTION__NAME_EXPRESSION,
-		UMLPackage.ACTION__HANDLER, UMLPackage.ACTION__INPUT,
-		UMLPackage.ACTION__LOCAL_POSTCONDITION,
-		UMLPackage.ACTION__LOCAL_PRECONDITION, UMLPackage.ACTION__OUTPUT};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.ACTION__OWNED_COMMENT, UMLPackage.ACTION__NAME_EXPRESSION, UMLPackage.ACTION__HANDLER, UMLPackage.ACTION__INPUT, UMLPackage.ACTION__LOCAL_POSTCONDITION,
+			UMLPackage.ACTION__LOCAL_PRECONDITION, UMLPackage.ACTION__OUTPUT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -185,19 +178,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.ACTION__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.ACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -210,19 +197,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-							InputPin.class, this, UMLPackage.ACTION__INPUT,
-							null));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.ACTION__INPUT, null));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.ACTION__INPUT, null);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.ACTION__INPUT, null);
 	}
 
 	/**
@@ -241,12 +222,10 @@
 	 */
 	public InputPin getInput(String name, Type type, boolean ignoreCase,
 			EClass eClass) {
-		inputLoop : for (InputPin input : getInputs()) {
+		inputLoop: for (InputPin input : getInputs()) {
 			if (eClass != null && !eClass.isInstance(input))
 				continue inputLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(input.getName())
-				: name.equals(input.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(input.getName()) : name.equals(input.getName())))
 				continue inputLoop;
 			if (type != null && !type.equals(input.getType()))
 				continue inputLoop;
@@ -262,9 +241,7 @@
 	 */
 	public Classifier getContext() {
 		Classifier context = basicGetContext();
-		return context != null && context.eIsProxy()
-			? (Classifier) eResolveProxy((InternalEObject) context)
-			: context;
+		return context != null && context.eIsProxy() ? (Classifier) eResolveProxy((InternalEObject) context) : context;
 	}
 
 	/**
@@ -282,9 +259,7 @@
 	 * @generated
 	 */
 	public boolean isLocallyReentrant() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.ACTION__IS_LOCALLY_REENTRANT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTION__IS_LOCALLY_REENTRANT, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.ACTION__IS_LOCALLY_REENTRANT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTION__IS_LOCALLY_REENTRANT, true, true);
 	}
 
 	/**
@@ -293,10 +268,7 @@
 	 * @generated
 	 */
 	public void setIsLocallyReentrant(boolean newIsLocallyReentrant) {
-		eDynamicSet(
-			UMLPackage.ACTION__IS_LOCALLY_REENTRANT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTION__IS_LOCALLY_REENTRANT,
-			newIsLocallyReentrant);
+		eDynamicSet(UMLPackage.ACTION__IS_LOCALLY_REENTRANT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTION__IS_LOCALLY_REENTRANT, newIsLocallyReentrant);
 	}
 
 	/**
@@ -306,9 +278,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Constraint> getLocalPreconditions() {
-		return (EList<Constraint>) eDynamicGet(
-			UMLPackage.ACTION__LOCAL_PRECONDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTION__LOCAL_PRECONDITION, true, true);
+		return (EList<Constraint>) eDynamicGet(UMLPackage.ACTION__LOCAL_PRECONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTION__LOCAL_PRECONDITION, true, true);
 	}
 
 	/**
@@ -349,18 +319,14 @@
 	 */
 	public Constraint getLocalPrecondition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		localPreconditionLoop : for (Constraint localPrecondition : getLocalPreconditions()) {
+		localPreconditionLoop: for (Constraint localPrecondition : getLocalPreconditions()) {
 			if (eClass != null && !eClass.isInstance(localPrecondition))
 				continue localPreconditionLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(localPrecondition.getName())
-				: name.equals(localPrecondition.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(localPrecondition.getName()) : name.equals(localPrecondition.getName())))
 				continue localPreconditionLoop;
 			return localPrecondition;
 		}
-		return createOnDemand && eClass != null
-			? createLocalPrecondition(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createLocalPrecondition(name, eClass) : null;
 	}
 
 	/**
@@ -372,11 +338,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Action> result = (EList<Action>) cache.get(this,
-				UMLPackage.Literals.ACTION___ALL_ACTIONS);
+			EList<Action> result = (EList<Action>) cache.get(this, UMLPackage.Literals.ACTION___ALL_ACTIONS);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.ACTION___ALL_ACTIONS,
-					result = ActionOperations.allActions(this));
+				cache.put(this, UMLPackage.Literals.ACTION___ALL_ACTIONS, result = ActionOperations.allActions(this));
 			}
 			return result;
 		}
@@ -392,11 +356,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<ActivityNode> result = (EList<ActivityNode>) cache.get(this,
-				UMLPackage.Literals.ACTION___ALL_OWNED_NODES);
+			EList<ActivityNode> result = (EList<ActivityNode>) cache.get(this, UMLPackage.Literals.ACTION___ALL_OWNED_NODES);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.ACTION___ALL_OWNED_NODES,
-					result = ActionOperations.allOwnedNodes(this));
+				cache.put(this, UMLPackage.Literals.ACTION___ALL_OWNED_NODES, result = ActionOperations.allOwnedNodes(this));
 			}
 			return result;
 		}
@@ -419,9 +381,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Constraint> getLocalPostconditions() {
-		return (EList<Constraint>) eDynamicGet(
-			UMLPackage.ACTION__LOCAL_POSTCONDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTION__LOCAL_POSTCONDITION, true, true);
+		return (EList<Constraint>) eDynamicGet(UMLPackage.ACTION__LOCAL_POSTCONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTION__LOCAL_POSTCONDITION, true, true);
 	}
 
 	/**
@@ -462,18 +422,14 @@
 	 */
 	public Constraint getLocalPostcondition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		localPostconditionLoop : for (Constraint localPostcondition : getLocalPostconditions()) {
+		localPostconditionLoop: for (Constraint localPostcondition : getLocalPostconditions()) {
 			if (eClass != null && !eClass.isInstance(localPostcondition))
 				continue localPostconditionLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(localPostcondition.getName())
-				: name.equals(localPostcondition.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(localPostcondition.getName()) : name.equals(localPostcondition.getName())))
 				continue localPostconditionLoop;
 			return localPostcondition;
 		}
-		return createOnDemand && eClass != null
-			? createLocalPostcondition(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createLocalPostcondition(name, eClass) : null;
 	}
 
 	/**
@@ -485,37 +441,28 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -528,74 +475,74 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ACTION__NAME :
-				return getName();
-			case UMLPackage.ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.ACTION__OUTPUT :
-				return getOutputs();
+		case UMLPackage.ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ACTION__NAME:
+			return getName();
+		case UMLPackage.ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.ACTION__OUTPUT:
+			return getOutputs();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -609,77 +556,67 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
+		case UMLPackage.ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -692,57 +629,57 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
+		case UMLPackage.ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -755,64 +692,62 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ACTION__NAME :
-				return isSetName();
-			case UMLPackage.ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.ACTION__OUTPUT :
-				return isSetOutputs();
+		case UMLPackage.ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ACTION__NAME:
+			return isSetName();
+		case UMLPackage.ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.ACTION__OUTPUT:
+			return isSetOutputs();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -827,152 +762,130 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
+		case UMLPackage.ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -993,9 +906,11 @@
 	 */
 	@Override
 	public boolean isSetOwnedElements() {
-		return super.isSetOwnedElements() || isSetInputs()
-			|| eIsSet(UMLPackage.ACTION__LOCAL_POSTCONDITION)
-			|| eIsSet(UMLPackage.ACTION__LOCAL_PRECONDITION) || isSetOutputs();
+		return super.isSetOwnedElements()
+				|| isSetInputs()
+				|| eIsSet(UMLPackage.ACTION__LOCAL_POSTCONDITION)
+				|| eIsSet(UMLPackage.ACTION__LOCAL_PRECONDITION)
+				|| isSetOutputs();
 	}
 
 	/**
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActionInputPinImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActionInputPinImpl.java
index 22a50c1..65cc931 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActionInputPinImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActionInputPinImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,6 +29,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -109,20 +112,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.ACTION_INPUT_PIN__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ACTION_INPUT_PIN__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.ACTION_INPUT_PIN__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ACTION_INPUT_PIN__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -131,9 +127,7 @@
 	 * @generated
 	 */
 	public Action getFromAction() {
-		return (Action) eDynamicGet(
-			UMLPackage.ACTION_INPUT_PIN__FROM_ACTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTION_INPUT_PIN__FROM_ACTION, true, true);
+		return (Action) eDynamicGet(UMLPackage.ACTION_INPUT_PIN__FROM_ACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTION_INPUT_PIN__FROM_ACTION, true, true);
 	}
 
 	/**
@@ -142,9 +136,7 @@
 	 * @generated
 	 */
 	public Action basicGetFromAction() {
-		return (Action) eDynamicGet(
-			UMLPackage.ACTION_INPUT_PIN__FROM_ACTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTION_INPUT_PIN__FROM_ACTION, false, true);
+		return (Action) eDynamicGet(UMLPackage.ACTION_INPUT_PIN__FROM_ACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTION_INPUT_PIN__FROM_ACTION, false, true);
 	}
 
 	/**
@@ -154,8 +146,7 @@
 	 */
 	public NotificationChain basicSetFromAction(Action newFromAction,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newFromAction,
-			UMLPackage.ACTION_INPUT_PIN__FROM_ACTION, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newFromAction, UMLPackage.ACTION_INPUT_PIN__FROM_ACTION, msgs);
 		return msgs;
 	}
 
@@ -165,9 +156,7 @@
 	 * @generated
 	 */
 	public void setFromAction(Action newFromAction) {
-		eDynamicSet(
-			UMLPackage.ACTION_INPUT_PIN__FROM_ACTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTION_INPUT_PIN__FROM_ACTION, newFromAction);
+		eDynamicSet(UMLPackage.ACTION_INPUT_PIN__FROM_ACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTION_INPUT_PIN__FROM_ACTION, newFromAction);
 	}
 
 	/**
@@ -190,8 +179,7 @@
 	 */
 	public boolean validateOneOutputPin(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActionInputPinOperations.validateOneOutputPin(this, diagnostics,
-			context);
+		return ActionInputPinOperations.validateOneOutputPin(this, diagnostics, context);
 	}
 
 	/**
@@ -201,8 +189,7 @@
 	 */
 	public boolean validateNoControlOrObjectFlow(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActionInputPinOperations.validateNoControlOrObjectFlow(this,
-			diagnostics, context);
+		return ActionInputPinOperations.validateNoControlOrObjectFlow(this, diagnostics, context);
 	}
 
 	/**
@@ -212,8 +199,7 @@
 	 */
 	public boolean validateInputPin(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActionInputPinOperations.validateInputPin(this, diagnostics,
-			context);
+		return ActionInputPinOperations.validateInputPin(this, diagnostics, context);
 	}
 
 	/**
@@ -225,36 +211,30 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ACTION_INPUT_PIN__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTION_INPUT_PIN__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTION_INPUT_PIN__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ACTION_INPUT_PIN__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTION_INPUT_PIN__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.ACTION_INPUT_PIN__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACTION_INPUT_PIN__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACTION_INPUT_PIN__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTION_INPUT_PIN__UPPER_BOUND :
-				return basicSetUpperBound(null, msgs);
-			case UMLPackage.ACTION_INPUT_PIN__LOWER_VALUE :
-				return basicSetLowerValue(null, msgs);
-			case UMLPackage.ACTION_INPUT_PIN__UPPER_VALUE :
-				return basicSetUpperValue(null, msgs);
-			case UMLPackage.ACTION_INPUT_PIN__FROM_ACTION :
-				return basicSetFromAction(null, msgs);
+		case UMLPackage.ACTION_INPUT_PIN__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTION_INPUT_PIN__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTION_INPUT_PIN__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ACTION_INPUT_PIN__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTION_INPUT_PIN__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.ACTION_INPUT_PIN__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTION_INPUT_PIN__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTION_INPUT_PIN__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTION_INPUT_PIN__UPPER_BOUND:
+			return basicSetUpperBound(null, msgs);
+		case UMLPackage.ACTION_INPUT_PIN__LOWER_VALUE:
+			return basicSetLowerValue(null, msgs);
+		case UMLPackage.ACTION_INPUT_PIN__UPPER_VALUE:
+			return basicSetUpperValue(null, msgs);
+		case UMLPackage.ACTION_INPUT_PIN__FROM_ACTION:
+			return basicSetFromAction(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -267,98 +247,98 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ACTION_INPUT_PIN__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ACTION_INPUT_PIN__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ACTION_INPUT_PIN__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ACTION_INPUT_PIN__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ACTION_INPUT_PIN__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ACTION_INPUT_PIN__NAME :
-				return getName();
-			case UMLPackage.ACTION_INPUT_PIN__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ACTION_INPUT_PIN__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ACTION_INPUT_PIN__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTION_INPUT_PIN__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ACTION_INPUT_PIN__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.ACTION_INPUT_PIN__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.ACTION_INPUT_PIN__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.ACTION_INPUT_PIN__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.ACTION_INPUT_PIN__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.ACTION_INPUT_PIN__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.ACTION_INPUT_PIN__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.ACTION_INPUT_PIN__INCOMING :
-				return getIncomings();
-			case UMLPackage.ACTION_INPUT_PIN__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.ACTION_INPUT_PIN__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.ACTION_INPUT_PIN__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.ACTION_INPUT_PIN__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.ACTION_INPUT_PIN__IN_STATE :
-				return getInStates();
-			case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL_TYPE :
-				return isControlType();
-			case UMLPackage.ACTION_INPUT_PIN__ORDERING :
-				return getOrdering();
-			case UMLPackage.ACTION_INPUT_PIN__SELECTION :
-				if (resolve)
-					return getSelection();
-				return basicGetSelection();
-			case UMLPackage.ACTION_INPUT_PIN__UPPER_BOUND :
-				if (resolve)
-					return getUpperBound();
-				return basicGetUpperBound();
-			case UMLPackage.ACTION_INPUT_PIN__IS_ORDERED :
-				return isOrdered();
-			case UMLPackage.ACTION_INPUT_PIN__IS_UNIQUE :
-				return isUnique();
-			case UMLPackage.ACTION_INPUT_PIN__LOWER :
-				return getLower();
-			case UMLPackage.ACTION_INPUT_PIN__LOWER_VALUE :
-				if (resolve)
-					return getLowerValue();
-				return basicGetLowerValue();
-			case UMLPackage.ACTION_INPUT_PIN__UPPER :
-				return getUpper();
-			case UMLPackage.ACTION_INPUT_PIN__UPPER_VALUE :
-				if (resolve)
-					return getUpperValue();
-				return basicGetUpperValue();
-			case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL :
-				return isControl();
-			case UMLPackage.ACTION_INPUT_PIN__FROM_ACTION :
-				if (resolve)
-					return getFromAction();
-				return basicGetFromAction();
+		case UMLPackage.ACTION_INPUT_PIN__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ACTION_INPUT_PIN__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ACTION_INPUT_PIN__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ACTION_INPUT_PIN__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ACTION_INPUT_PIN__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ACTION_INPUT_PIN__NAME:
+			return getName();
+		case UMLPackage.ACTION_INPUT_PIN__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ACTION_INPUT_PIN__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ACTION_INPUT_PIN__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTION_INPUT_PIN__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ACTION_INPUT_PIN__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.ACTION_INPUT_PIN__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.ACTION_INPUT_PIN__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.ACTION_INPUT_PIN__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.ACTION_INPUT_PIN__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.ACTION_INPUT_PIN__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.ACTION_INPUT_PIN__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.ACTION_INPUT_PIN__INCOMING:
+			return getIncomings();
+		case UMLPackage.ACTION_INPUT_PIN__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.ACTION_INPUT_PIN__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.ACTION_INPUT_PIN__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.ACTION_INPUT_PIN__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.ACTION_INPUT_PIN__IN_STATE:
+			return getInStates();
+		case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL_TYPE:
+			return isControlType();
+		case UMLPackage.ACTION_INPUT_PIN__ORDERING:
+			return getOrdering();
+		case UMLPackage.ACTION_INPUT_PIN__SELECTION:
+			if (resolve)
+				return getSelection();
+			return basicGetSelection();
+		case UMLPackage.ACTION_INPUT_PIN__UPPER_BOUND:
+			if (resolve)
+				return getUpperBound();
+			return basicGetUpperBound();
+		case UMLPackage.ACTION_INPUT_PIN__IS_ORDERED:
+			return isOrdered();
+		case UMLPackage.ACTION_INPUT_PIN__IS_UNIQUE:
+			return isUnique();
+		case UMLPackage.ACTION_INPUT_PIN__LOWER:
+			return getLower();
+		case UMLPackage.ACTION_INPUT_PIN__LOWER_VALUE:
+			if (resolve)
+				return getLowerValue();
+			return basicGetLowerValue();
+		case UMLPackage.ACTION_INPUT_PIN__UPPER:
+			return getUpper();
+		case UMLPackage.ACTION_INPUT_PIN__UPPER_VALUE:
+			if (resolve)
+				return getUpperValue();
+			return basicGetUpperValue();
+		case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL:
+			return isControl();
+		case UMLPackage.ACTION_INPUT_PIN__FROM_ACTION:
+			if (resolve)
+				return getFromAction();
+			return basicGetFromAction();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -372,102 +352,95 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ACTION_INPUT_PIN__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IN_STATE :
-				getInStates().clear();
-				getInStates().addAll((Collection<? extends State>) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL_TYPE :
-				setIsControlType((Boolean) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__ORDERING :
-				setOrdering((ObjectNodeOrderingKind) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__SELECTION :
-				setSelection((Behavior) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__UPPER_BOUND :
-				setUpperBound((ValueSpecification) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IS_ORDERED :
-				setIsOrdered((Boolean) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IS_UNIQUE :
-				setIsUnique((Boolean) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__LOWER :
-				setLower((Integer) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__LOWER_VALUE :
-				setLowerValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__UPPER :
-				setUpper((Integer) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__UPPER_VALUE :
-				setUpperValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL :
-				setIsControl((Boolean) newValue);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__FROM_ACTION :
-				setFromAction((Action) newValue);
-				return;
+		case UMLPackage.ACTION_INPUT_PIN__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IN_STATE:
+			getInStates().clear();
+			getInStates().addAll((Collection<? extends State>) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL_TYPE:
+			setIsControlType((Boolean) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__ORDERING:
+			setOrdering((ObjectNodeOrderingKind) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__SELECTION:
+			setSelection((Behavior) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__UPPER_BOUND:
+			setUpperBound((ValueSpecification) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IS_ORDERED:
+			setIsOrdered((Boolean) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IS_UNIQUE:
+			setIsUnique((Boolean) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__LOWER:
+			setLower((Integer) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__LOWER_VALUE:
+			setLowerValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__UPPER:
+			setUpper((Integer) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__UPPER_VALUE:
+			setUpperValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL:
+			setIsControl((Boolean) newValue);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__FROM_ACTION:
+			setFromAction((Action) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -480,87 +453,87 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTION_INPUT_PIN__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IN_STATE :
-				getInStates().clear();
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL_TYPE :
-				setIsControlType(IS_CONTROL_TYPE_EDEFAULT);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__ORDERING :
-				setOrdering(ORDERING_EDEFAULT);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__SELECTION :
-				setSelection((Behavior) null);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__UPPER_BOUND :
-				setUpperBound((ValueSpecification) null);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IS_ORDERED :
-				setIsOrdered(IS_ORDERED_EDEFAULT);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IS_UNIQUE :
-				setIsUnique(IS_UNIQUE_EDEFAULT);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__LOWER :
-				setLower(LOWER_EDEFAULT);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__LOWER_VALUE :
-				setLowerValue((ValueSpecification) null);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__UPPER :
-				setUpper(UPPER_EDEFAULT);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__UPPER_VALUE :
-				setUpperValue((ValueSpecification) null);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL :
-				setIsControl(IS_CONTROL_EDEFAULT);
-				return;
-			case UMLPackage.ACTION_INPUT_PIN__FROM_ACTION :
-				setFromAction((Action) null);
-				return;
+		case UMLPackage.ACTION_INPUT_PIN__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IN_STATE:
+			getInStates().clear();
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL_TYPE:
+			setIsControlType(IS_CONTROL_TYPE_EDEFAULT);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__ORDERING:
+			setOrdering(ORDERING_EDEFAULT);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__SELECTION:
+			setSelection((Behavior) null);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__UPPER_BOUND:
+			setUpperBound((ValueSpecification) null);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IS_ORDERED:
+			setIsOrdered(IS_ORDERED_EDEFAULT);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IS_UNIQUE:
+			setIsUnique(IS_UNIQUE_EDEFAULT);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__LOWER:
+			setLower(LOWER_EDEFAULT);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__LOWER_VALUE:
+			setLowerValue((ValueSpecification) null);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__UPPER:
+			setUpper(UPPER_EDEFAULT);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__UPPER_VALUE:
+			setUpperValue((ValueSpecification) null);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL:
+			setIsControl(IS_CONTROL_EDEFAULT);
+			return;
+		case UMLPackage.ACTION_INPUT_PIN__FROM_ACTION:
+			setFromAction((Action) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -573,78 +546,76 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTION_INPUT_PIN__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ACTION_INPUT_PIN__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ACTION_INPUT_PIN__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ACTION_INPUT_PIN__OWNER :
-				return isSetOwner();
-			case UMLPackage.ACTION_INPUT_PIN__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ACTION_INPUT_PIN__NAME :
-				return isSetName();
-			case UMLPackage.ACTION_INPUT_PIN__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ACTION_INPUT_PIN__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ACTION_INPUT_PIN__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ACTION_INPUT_PIN__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ACTION_INPUT_PIN__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.ACTION_INPUT_PIN__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.ACTION_INPUT_PIN__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.ACTION_INPUT_PIN__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.ACTION_INPUT_PIN__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.ACTION_INPUT_PIN__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.ACTION_INPUT_PIN__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.ACTION_INPUT_PIN__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.ACTION_INPUT_PIN__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.ACTION_INPUT_PIN__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.ACTION_INPUT_PIN__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.ACTION_INPUT_PIN__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.ACTION_INPUT_PIN__IN_STATE :
-				return !getInStates().isEmpty();
-			case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL_TYPE :
-				return isControlType() != IS_CONTROL_TYPE_EDEFAULT;
-			case UMLPackage.ACTION_INPUT_PIN__ORDERING :
-				return getOrdering() != ORDERING_EDEFAULT;
-			case UMLPackage.ACTION_INPUT_PIN__SELECTION :
-				return basicGetSelection() != null;
-			case UMLPackage.ACTION_INPUT_PIN__UPPER_BOUND :
-				return basicGetUpperBound() != null;
-			case UMLPackage.ACTION_INPUT_PIN__IS_ORDERED :
-				return isOrdered() != IS_ORDERED_EDEFAULT;
-			case UMLPackage.ACTION_INPUT_PIN__IS_UNIQUE :
-				return isUnique() != IS_UNIQUE_EDEFAULT;
-			case UMLPackage.ACTION_INPUT_PIN__LOWER :
-				return getLower() != LOWER_EDEFAULT;
-			case UMLPackage.ACTION_INPUT_PIN__LOWER_VALUE :
-				return basicGetLowerValue() != null;
-			case UMLPackage.ACTION_INPUT_PIN__UPPER :
-				return getUpper() != UPPER_EDEFAULT;
-			case UMLPackage.ACTION_INPUT_PIN__UPPER_VALUE :
-				return basicGetUpperValue() != null;
-			case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL :
-				return isControl() != IS_CONTROL_EDEFAULT;
-			case UMLPackage.ACTION_INPUT_PIN__FROM_ACTION :
-				return basicGetFromAction() != null;
+		case UMLPackage.ACTION_INPUT_PIN__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ACTION_INPUT_PIN__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ACTION_INPUT_PIN__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ACTION_INPUT_PIN__OWNER:
+			return isSetOwner();
+		case UMLPackage.ACTION_INPUT_PIN__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ACTION_INPUT_PIN__NAME:
+			return isSetName();
+		case UMLPackage.ACTION_INPUT_PIN__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ACTION_INPUT_PIN__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ACTION_INPUT_PIN__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ACTION_INPUT_PIN__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ACTION_INPUT_PIN__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.ACTION_INPUT_PIN__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.ACTION_INPUT_PIN__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.ACTION_INPUT_PIN__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.ACTION_INPUT_PIN__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.ACTION_INPUT_PIN__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.ACTION_INPUT_PIN__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.ACTION_INPUT_PIN__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.ACTION_INPUT_PIN__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.ACTION_INPUT_PIN__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.ACTION_INPUT_PIN__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.ACTION_INPUT_PIN__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.ACTION_INPUT_PIN__IN_STATE:
+			return !getInStates().isEmpty();
+		case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL_TYPE:
+			return isControlType() != IS_CONTROL_TYPE_EDEFAULT;
+		case UMLPackage.ACTION_INPUT_PIN__ORDERING:
+			return getOrdering() != ORDERING_EDEFAULT;
+		case UMLPackage.ACTION_INPUT_PIN__SELECTION:
+			return basicGetSelection() != null;
+		case UMLPackage.ACTION_INPUT_PIN__UPPER_BOUND:
+			return basicGetUpperBound() != null;
+		case UMLPackage.ACTION_INPUT_PIN__IS_ORDERED:
+			return isOrdered() != IS_ORDERED_EDEFAULT;
+		case UMLPackage.ACTION_INPUT_PIN__IS_UNIQUE:
+			return isUnique() != IS_UNIQUE_EDEFAULT;
+		case UMLPackage.ACTION_INPUT_PIN__LOWER:
+			return getLower() != LOWER_EDEFAULT;
+		case UMLPackage.ACTION_INPUT_PIN__LOWER_VALUE:
+			return basicGetLowerValue() != null;
+		case UMLPackage.ACTION_INPUT_PIN__UPPER:
+			return getUpper() != UPPER_EDEFAULT;
+		case UMLPackage.ACTION_INPUT_PIN__UPPER_VALUE:
+			return basicGetUpperValue() != null;
+		case UMLPackage.ACTION_INPUT_PIN__IS_CONTROL:
+			return isControl() != IS_CONTROL_EDEFAULT;
+		case UMLPackage.ACTION_INPUT_PIN__FROM_ACTION:
+			return basicGetFromAction() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -659,222 +630,174 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ACTION_INPUT_PIN___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ACTION_INPUT_PIN___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ACTION_INPUT_PIN___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ACTION_INPUT_PIN___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ACTION_INPUT_PIN___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___GET_MODEL :
-				return getModel();
-			case UMLPackage.ACTION_INPUT_PIN___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ACTION_INPUT_PIN___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ACTION_INPUT_PIN___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ACTION_INPUT_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ACTION_INPUT_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ACTION_INPUT_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ACTION_INPUT_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ACTION_INPUT_PIN___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ACTION_INPUT_PIN___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ACTION_INPUT_PIN___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ACTION_INPUT_PIN___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ACTION_INPUT_PIN___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ACTION_INPUT_PIN___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTION_INPUT_PIN___SEPARATOR :
-				return separator();
-			case UMLPackage.ACTION_INPUT_PIN___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP :
-				return validateInputOutputParameter(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateSelectionBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateObjectFlowEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-				return validateUpperGeLower((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-				return validateLowerGe0((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationNoSideEffects(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationConstant(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-				return validateLowerIsInteger(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-				return validateUpperIsUnlimitedNatural(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___SET_LOWER__INT :
-				setLower((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.ACTION_INPUT_PIN___SET_UPPER__INT :
-				setUpper((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.ACTION_INPUT_PIN___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-				return compatibleWith((MultiplicityElement) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-				return includesMultiplicity(
-					(MultiplicityElement) arguments.get(0));
-			case UMLPackage.ACTION_INPUT_PIN___IS__INT_INT :
-				return is((Integer) arguments.get(0),
-					(Integer) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___IS_MULTIVALUED :
-				return isMultivalued();
-			case UMLPackage.ACTION_INPUT_PIN___GET_LOWER :
-				return getLower();
-			case UMLPackage.ACTION_INPUT_PIN___LOWER_BOUND :
-				return lowerBound();
-			case UMLPackage.ACTION_INPUT_PIN___GET_UPPER :
-				return getUpper();
-			case UMLPackage.ACTION_INPUT_PIN___UPPER_BOUND :
-				return upperBound();
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_CONTROL_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateControlPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_NOT_UNIQUE__DIAGNOSTICCHAIN_MAP :
-				return validateNotUnique((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_OUTGOING_EDGES_STRUCTURED_ONLY__DIAGNOSTICCHAIN_MAP :
-				return validateOutgoingEdgesStructuredOnly(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_INPUT_PIN__DIAGNOSTICCHAIN_MAP :
-				return validateInputPin((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_ONE_OUTPUT_PIN__DIAGNOSTICCHAIN_MAP :
-				return validateOneOutputPin((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTION_INPUT_PIN___VALIDATE_NO_CONTROL_OR_OBJECT_FLOW__DIAGNOSTICCHAIN_MAP :
-				return validateNoControlOrObjectFlow(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ACTION_INPUT_PIN___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ACTION_INPUT_PIN___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ACTION_INPUT_PIN___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ACTION_INPUT_PIN___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___GET_MODEL:
+			return getModel();
+		case UMLPackage.ACTION_INPUT_PIN___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ACTION_INPUT_PIN___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ACTION_INPUT_PIN___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ACTION_INPUT_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ACTION_INPUT_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ACTION_INPUT_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ACTION_INPUT_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ACTION_INPUT_PIN___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ACTION_INPUT_PIN___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ACTION_INPUT_PIN___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ACTION_INPUT_PIN___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ACTION_INPUT_PIN___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ACTION_INPUT_PIN___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTION_INPUT_PIN___SEPARATOR:
+			return separator();
+		case UMLPackage.ACTION_INPUT_PIN___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP:
+			return validateInputOutputParameter((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateSelectionBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateObjectFlowEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+			return validateUpperGeLower((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+			return validateLowerGe0((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationConstant((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+			return validateLowerIsInteger((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+			return validateUpperIsUnlimitedNatural((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___SET_LOWER__INT:
+			setLower((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.ACTION_INPUT_PIN___SET_UPPER__INT:
+			setUpper((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.ACTION_INPUT_PIN___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+			return compatibleWith((MultiplicityElement) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+			return includesMultiplicity((MultiplicityElement) arguments.get(0));
+		case UMLPackage.ACTION_INPUT_PIN___IS__INT_INT:
+			return is((Integer) arguments.get(0), (Integer) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___IS_MULTIVALUED:
+			return isMultivalued();
+		case UMLPackage.ACTION_INPUT_PIN___GET_LOWER:
+			return getLower();
+		case UMLPackage.ACTION_INPUT_PIN___LOWER_BOUND:
+			return lowerBound();
+		case UMLPackage.ACTION_INPUT_PIN___GET_UPPER:
+			return getUpper();
+		case UMLPackage.ACTION_INPUT_PIN___UPPER_BOUND:
+			return upperBound();
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_CONTROL_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateControlPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_NOT_UNIQUE__DIAGNOSTICCHAIN_MAP:
+			return validateNotUnique((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_OUTGOING_EDGES_STRUCTURED_ONLY__DIAGNOSTICCHAIN_MAP:
+			return validateOutgoingEdgesStructuredOnly((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_INPUT_PIN__DIAGNOSTICCHAIN_MAP:
+			return validateInputPin((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_ONE_OUTPUT_PIN__DIAGNOSTICCHAIN_MAP:
+			return validateOneOutputPin((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTION_INPUT_PIN___VALIDATE_NO_CONTROL_OR_OBJECT_FLOW__DIAGNOSTICCHAIN_MAP:
+			return validateNoControlOrObjectFlow((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -887,13 +810,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.ACTION_INPUT_PIN__OWNED_COMMENT,
-		UMLPackage.ACTION_INPUT_PIN__NAME_EXPRESSION,
-		UMLPackage.ACTION_INPUT_PIN__UPPER_BOUND,
-		UMLPackage.ACTION_INPUT_PIN__LOWER_VALUE,
-		UMLPackage.ACTION_INPUT_PIN__UPPER_VALUE,
-		UMLPackage.ACTION_INPUT_PIN__FROM_ACTION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.ACTION_INPUT_PIN__OWNED_COMMENT, UMLPackage.ACTION_INPUT_PIN__NAME_EXPRESSION, UMLPackage.ACTION_INPUT_PIN__UPPER_BOUND, UMLPackage.ACTION_INPUT_PIN__LOWER_VALUE,
+			UMLPackage.ACTION_INPUT_PIN__UPPER_VALUE, UMLPackage.ACTION_INPUT_PIN__FROM_ACTION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -903,7 +821,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.ACTION_INPUT_PIN__FROM_ACTION);
+				|| eIsSet(UMLPackage.ACTION_INPUT_PIN__FROM_ACTION);
 	}
 
 } //ActionInputPinImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityEdgeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityEdgeImpl.java
index b548dcf..29a0921 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityEdgeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityEdgeImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,8 +28,13 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -113,19 +119,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<ActivityGroup> inGroups = (EList<ActivityGroup>) cache.get(
-				eResource, this, UMLPackage.Literals.ACTIVITY_EDGE__IN_GROUP);
+			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<ActivityGroup>(
-						ActivityGroup.class, this,
-						UMLPackage.ACTIVITY_EDGE__IN_GROUP, IN_GROUP_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTIVITY_EDGE__IN_GROUP, inGroups = new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class, this, UMLPackage.ACTIVITY_EDGE__IN_GROUP, IN_GROUP_ESUBSETS));
 			}
 			return inGroups;
 		}
-		return new DerivedUnionEObjectEList<ActivityGroup>(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);
 	}
 
 	/**
@@ -139,23 +139,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			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>(
-						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>(
-			RedefinableElement.class, this,
-			UMLPackage.ACTIVITY_EDGE__REDEFINED_ELEMENT,
-			REDEFINED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<RedefinableElement>(RedefinableElement.class, this, UMLPackage.ACTIVITY_EDGE__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -169,20 +160,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.ACTIVITY_EDGE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ACTIVITY_EDGE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.ACTIVITY_EDGE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ACTIVITY_EDGE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -191,9 +175,7 @@
 	 * @generated
 	 */
 	public Activity getActivity() {
-		return (Activity) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__ACTIVITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__ACTIVITY, true, true);
+		return (Activity) eDynamicGet(UMLPackage.ACTIVITY_EDGE__ACTIVITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__ACTIVITY, true, true);
 	}
 
 	/**
@@ -202,9 +184,7 @@
 	 * @generated
 	 */
 	public Activity basicGetActivity() {
-		return (Activity) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__ACTIVITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__ACTIVITY, false, true);
+		return (Activity) eDynamicGet(UMLPackage.ACTIVITY_EDGE__ACTIVITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__ACTIVITY, false, true);
 	}
 
 	/**
@@ -214,8 +194,7 @@
 	 */
 	public NotificationChain basicSetActivity(Activity newActivity,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newActivity,
-			UMLPackage.ACTIVITY_EDGE__ACTIVITY, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newActivity, UMLPackage.ACTIVITY_EDGE__ACTIVITY, msgs);
 		return msgs;
 	}
 
@@ -225,8 +204,7 @@
 	 * @generated
 	 */
 	public void setActivity(Activity newActivity) {
-		eDynamicSet(UMLPackage.ACTIVITY_EDGE__ACTIVITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__ACTIVITY, newActivity);
+		eDynamicSet(UMLPackage.ACTIVITY_EDGE__ACTIVITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__ACTIVITY, newActivity);
 	}
 
 	/**
@@ -236,9 +214,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityPartition> getInPartitions() {
-		return (EList<ActivityPartition>) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__IN_PARTITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__IN_PARTITION, true, true);
+		return (EList<ActivityPartition>) eDynamicGet(UMLPackage.ACTIVITY_EDGE__IN_PARTITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__IN_PARTITION, true, true);
 	}
 
 	/**
@@ -256,10 +232,8 @@
 	 * @generated
 	 */
 	public ActivityPartition getInPartition(String name, boolean ignoreCase) {
-		inPartitionLoop : for (ActivityPartition inPartition : getInPartitions()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(inPartition.getName())
-				: name.equals(inPartition.getName())))
+		inPartitionLoop: for (ActivityPartition inPartition : getInPartitions()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(inPartition.getName()) : name.equals(inPartition.getName())))
 				continue inPartitionLoop;
 			return inPartition;
 		}
@@ -272,10 +246,7 @@
 	 * @generated
 	 */
 	public StructuredActivityNode getInStructuredNode() {
-		return (StructuredActivityNode) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__IN_STRUCTURED_NODE, true, true);
+		return (StructuredActivityNode) eDynamicGet(UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__IN_STRUCTURED_NODE, true, true);
 	}
 
 	/**
@@ -284,10 +255,7 @@
 	 * @generated
 	 */
 	public StructuredActivityNode basicGetInStructuredNode() {
-		return (StructuredActivityNode) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__IN_STRUCTURED_NODE, false, true);
+		return (StructuredActivityNode) eDynamicGet(UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__IN_STRUCTURED_NODE, false, true);
 	}
 
 	/**
@@ -298,8 +266,7 @@
 	public NotificationChain basicSetInStructuredNode(
 			StructuredActivityNode newInStructuredNode,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newInStructuredNode,
-			UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newInStructuredNode, UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE, msgs);
 		return msgs;
 	}
 
@@ -310,11 +277,7 @@
 	 */
 	public void setInStructuredNode(
 			StructuredActivityNode newInStructuredNode) {
-		eDynamicSet(
-			UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__IN_STRUCTURED_NODE,
-			newInStructuredNode);
+		eDynamicSet(UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__IN_STRUCTURED_NODE, newInStructuredNode);
 	}
 
 	/**
@@ -323,9 +286,7 @@
 	 * @generated
 	 */
 	public ActivityNode getTarget() {
-		return (ActivityNode) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__TARGET, true, true);
+		return (ActivityNode) eDynamicGet(UMLPackage.ACTIVITY_EDGE__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__TARGET, true, true);
 	}
 
 	/**
@@ -334,9 +295,7 @@
 	 * @generated
 	 */
 	public ActivityNode basicGetTarget() {
-		return (ActivityNode) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__TARGET, false, true);
+		return (ActivityNode) eDynamicGet(UMLPackage.ACTIVITY_EDGE__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__TARGET, false, true);
 	}
 
 	/**
@@ -346,8 +305,7 @@
 	 */
 	public NotificationChain basicSetTarget(ActivityNode newTarget,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newTarget,
-			UMLPackage.ACTIVITY_EDGE__TARGET, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newTarget, UMLPackage.ACTIVITY_EDGE__TARGET, msgs);
 		return msgs;
 	}
 
@@ -357,8 +315,7 @@
 	 * @generated
 	 */
 	public void setTarget(ActivityNode newTarget) {
-		eDynamicSet(UMLPackage.ACTIVITY_EDGE__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__TARGET, newTarget);
+		eDynamicSet(UMLPackage.ACTIVITY_EDGE__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__TARGET, newTarget);
 	}
 
 	/**
@@ -368,9 +325,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityEdge> getRedefinedEdges() {
-		return (EList<ActivityEdge>) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__REDEFINED_EDGE, true, true);
+		return (EList<ActivityEdge>) eDynamicGet(UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__REDEFINED_EDGE, true, true);
 	}
 
 	/**
@@ -389,12 +344,10 @@
 	 */
 	public ActivityEdge getRedefinedEdge(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinedEdgeLoop : for (ActivityEdge redefinedEdge : getRedefinedEdges()) {
+		redefinedEdgeLoop: for (ActivityEdge redefinedEdge : getRedefinedEdges()) {
 			if (eClass != null && !eClass.isInstance(redefinedEdge))
 				continue redefinedEdgeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinedEdge.getName())
-				: name.equals(redefinedEdge.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinedEdge.getName()) : name.equals(redefinedEdge.getName())))
 				continue redefinedEdgeLoop;
 			return redefinedEdge;
 		}
@@ -407,9 +360,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getGuard() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__GUARD - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__GUARD, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.ACTIVITY_EDGE__GUARD - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__GUARD, true, true);
 	}
 
 	/**
@@ -418,9 +369,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetGuard() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__GUARD - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__GUARD, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.ACTIVITY_EDGE__GUARD - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__GUARD, false, true);
 	}
 
 	/**
@@ -430,8 +379,7 @@
 	 */
 	public NotificationChain basicSetGuard(ValueSpecification newGuard,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newGuard,
-			UMLPackage.ACTIVITY_EDGE__GUARD, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newGuard, UMLPackage.ACTIVITY_EDGE__GUARD, msgs);
 		return msgs;
 	}
 
@@ -441,8 +389,7 @@
 	 * @generated
 	 */
 	public void setGuard(ValueSpecification newGuard) {
-		eDynamicSet(UMLPackage.ACTIVITY_EDGE__GUARD - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__GUARD, newGuard);
+		eDynamicSet(UMLPackage.ACTIVITY_EDGE__GUARD - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__GUARD, newGuard);
 	}
 
 	/**
@@ -467,9 +414,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getWeight() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__WEIGHT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__WEIGHT, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.ACTIVITY_EDGE__WEIGHT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__WEIGHT, true, true);
 	}
 
 	/**
@@ -478,9 +423,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetWeight() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__WEIGHT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__WEIGHT, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.ACTIVITY_EDGE__WEIGHT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__WEIGHT, false, true);
 	}
 
 	/**
@@ -490,8 +433,7 @@
 	 */
 	public NotificationChain basicSetWeight(ValueSpecification newWeight,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newWeight,
-			UMLPackage.ACTIVITY_EDGE__WEIGHT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newWeight, UMLPackage.ACTIVITY_EDGE__WEIGHT, msgs);
 		return msgs;
 	}
 
@@ -501,8 +443,7 @@
 	 * @generated
 	 */
 	public void setWeight(ValueSpecification newWeight) {
-		eDynamicSet(UMLPackage.ACTIVITY_EDGE__WEIGHT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__WEIGHT, newWeight);
+		eDynamicSet(UMLPackage.ACTIVITY_EDGE__WEIGHT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__WEIGHT, newWeight);
 	}
 
 	/**
@@ -527,9 +468,7 @@
 	 * @generated
 	 */
 	public InterruptibleActivityRegion getInterrupts() {
-		return (InterruptibleActivityRegion) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__INTERRUPTS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__INTERRUPTS, true, true);
+		return (InterruptibleActivityRegion) eDynamicGet(UMLPackage.ACTIVITY_EDGE__INTERRUPTS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__INTERRUPTS, true, true);
 	}
 
 	/**
@@ -538,9 +477,7 @@
 	 * @generated
 	 */
 	public InterruptibleActivityRegion basicGetInterrupts() {
-		return (InterruptibleActivityRegion) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__INTERRUPTS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__INTERRUPTS, false, true);
+		return (InterruptibleActivityRegion) eDynamicGet(UMLPackage.ACTIVITY_EDGE__INTERRUPTS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__INTERRUPTS, false, true);
 	}
 
 	/**
@@ -550,8 +487,7 @@
 	 */
 	public NotificationChain basicSetInterrupts(
 			InterruptibleActivityRegion newInterrupts, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newInterrupts,
-			UMLPackage.ACTIVITY_EDGE__INTERRUPTS, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newInterrupts, UMLPackage.ACTIVITY_EDGE__INTERRUPTS, msgs);
 		return msgs;
 	}
 
@@ -561,9 +497,7 @@
 	 * @generated
 	 */
 	public void setInterrupts(InterruptibleActivityRegion newInterrupts) {
-		eDynamicSet(
-			UMLPackage.ACTIVITY_EDGE__INTERRUPTS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__INTERRUPTS, newInterrupts);
+		eDynamicSet(UMLPackage.ACTIVITY_EDGE__INTERRUPTS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__INTERRUPTS, newInterrupts);
 	}
 
 	/**
@@ -572,9 +506,7 @@
 	 * @generated
 	 */
 	public ActivityNode getSource() {
-		return (ActivityNode) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__SOURCE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__SOURCE, true, true);
+		return (ActivityNode) eDynamicGet(UMLPackage.ACTIVITY_EDGE__SOURCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__SOURCE, true, true);
 	}
 
 	/**
@@ -583,9 +515,7 @@
 	 * @generated
 	 */
 	public ActivityNode basicGetSource() {
-		return (ActivityNode) eDynamicGet(
-			UMLPackage.ACTIVITY_EDGE__SOURCE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__SOURCE, false, true);
+		return (ActivityNode) eDynamicGet(UMLPackage.ACTIVITY_EDGE__SOURCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__SOURCE, false, true);
 	}
 
 	/**
@@ -595,8 +525,7 @@
 	 */
 	public NotificationChain basicSetSource(ActivityNode newSource,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newSource,
-			UMLPackage.ACTIVITY_EDGE__SOURCE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newSource, UMLPackage.ACTIVITY_EDGE__SOURCE, msgs);
 		return msgs;
 	}
 
@@ -606,8 +535,7 @@
 	 * @generated
 	 */
 	public void setSource(ActivityNode newSource) {
-		eDynamicSet(UMLPackage.ACTIVITY_EDGE__SOURCE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_EDGE__SOURCE, newSource);
+		eDynamicSet(UMLPackage.ACTIVITY_EDGE__SOURCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_EDGE__SOURCE, newSource);
 	}
 
 	/**
@@ -617,8 +545,7 @@
 	 */
 	public boolean validateSourceAndTarget(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActivityEdgeOperations.validateSourceAndTarget(this, diagnostics,
-			context);
+		return ActivityEdgeOperations.validateSourceAndTarget(this, diagnostics, context);
 	}
 
 	/**
@@ -641,43 +568,33 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_EDGE__ACTIVITY :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetActivity((Activity) otherEnd, msgs);
-			case UMLPackage.ACTIVITY_EDGE__IN_PARTITION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_EDGE__INTERRUPTS :
-				InterruptibleActivityRegion interrupts = basicGetInterrupts();
-				if (interrupts != null)
-					msgs = ((InternalEObject) interrupts).eInverseRemove(this,
-						UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE,
-						InterruptibleActivityRegion.class, msgs);
-				return basicSetInterrupts(
-					(InterruptibleActivityRegion) otherEnd, msgs);
-			case UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetInStructuredNode(
-					(StructuredActivityNode) otherEnd, msgs);
-			case UMLPackage.ACTIVITY_EDGE__TARGET :
-				ActivityNode target = basicGetTarget();
-				if (target != null)
-					msgs = ((InternalEObject) target).eInverseRemove(this,
-						UMLPackage.ACTIVITY_NODE__INCOMING, ActivityNode.class,
-						msgs);
-				return basicSetTarget((ActivityNode) otherEnd, msgs);
-			case UMLPackage.ACTIVITY_EDGE__SOURCE :
-				ActivityNode source = basicGetSource();
-				if (source != null)
-					msgs = ((InternalEObject) source).eInverseRemove(this,
-						UMLPackage.ACTIVITY_NODE__OUTGOING, ActivityNode.class,
-						msgs);
-				return basicSetSource((ActivityNode) otherEnd, msgs);
+		case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_EDGE__ACTIVITY:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetActivity((Activity) otherEnd, msgs);
+		case UMLPackage.ACTIVITY_EDGE__IN_PARTITION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_EDGE__INTERRUPTS:
+			InterruptibleActivityRegion interrupts = basicGetInterrupts();
+			if (interrupts != null)
+				msgs = ((InternalEObject) interrupts).eInverseRemove(this, UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE, InterruptibleActivityRegion.class, msgs);
+			return basicSetInterrupts((InterruptibleActivityRegion) otherEnd, msgs);
+		case UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetInStructuredNode((StructuredActivityNode) otherEnd, msgs);
+		case UMLPackage.ACTIVITY_EDGE__TARGET:
+			ActivityNode target = basicGetTarget();
+			if (target != null)
+				msgs = ((InternalEObject) target).eInverseRemove(this, UMLPackage.ACTIVITY_NODE__INCOMING, ActivityNode.class, msgs);
+			return basicSetTarget((ActivityNode) otherEnd, msgs);
+		case UMLPackage.ACTIVITY_EDGE__SOURCE:
+			ActivityNode source = basicGetSource();
+			if (source != null)
+				msgs = ((InternalEObject) source).eInverseRemove(this, UMLPackage.ACTIVITY_NODE__OUTGOING, ActivityNode.class, msgs);
+			return basicSetSource((ActivityNode) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -691,31 +608,28 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_EDGE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_EDGE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ACTIVITY_EDGE__ACTIVITY :
-				return basicSetActivity(null, msgs);
-			case UMLPackage.ACTIVITY_EDGE__GUARD :
-				return basicSetGuard(null, msgs);
-			case UMLPackage.ACTIVITY_EDGE__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_EDGE__INTERRUPTS :
-				return basicSetInterrupts(null, msgs);
-			case UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.ACTIVITY_EDGE__TARGET :
-				return basicSetTarget(null, msgs);
-			case UMLPackage.ACTIVITY_EDGE__SOURCE :
-				return basicSetSource(null, msgs);
-			case UMLPackage.ACTIVITY_EDGE__WEIGHT :
-				return basicSetWeight(null, msgs);
+		case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_EDGE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_EDGE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ACTIVITY_EDGE__ACTIVITY:
+			return basicSetActivity(null, msgs);
+		case UMLPackage.ACTIVITY_EDGE__GUARD:
+			return basicSetGuard(null, msgs);
+		case UMLPackage.ACTIVITY_EDGE__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_EDGE__INTERRUPTS:
+			return basicSetInterrupts(null, msgs);
+		case UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.ACTIVITY_EDGE__TARGET:
+			return basicSetTarget(null, msgs);
+		case UMLPackage.ACTIVITY_EDGE__SOURCE:
+			return basicSetSource(null, msgs);
+		case UMLPackage.ACTIVITY_EDGE__WEIGHT:
+			return basicSetWeight(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -729,13 +643,10 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.ACTIVITY_EDGE__ACTIVITY :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.ACTIVITY__EDGE, Activity.class, msgs);
-			case UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE,
-					StructuredActivityNode.class, msgs);
+		case UMLPackage.ACTIVITY_EDGE__ACTIVITY:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.ACTIVITY__EDGE, Activity.class, msgs);
+		case UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE, StructuredActivityNode.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -748,72 +659,72 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ACTIVITY_EDGE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ACTIVITY_EDGE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ACTIVITY_EDGE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ACTIVITY_EDGE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ACTIVITY_EDGE__NAME :
-				return getName();
-			case UMLPackage.ACTIVITY_EDGE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ACTIVITY_EDGE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ACTIVITY_EDGE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTIVITY_EDGE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ACTIVITY_EDGE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.ACTIVITY_EDGE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.ACTIVITY_EDGE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.ACTIVITY_EDGE__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.ACTIVITY_EDGE__GUARD :
-				if (resolve)
-					return getGuard();
-				return basicGetGuard();
-			case UMLPackage.ACTIVITY_EDGE__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.ACTIVITY_EDGE__INTERRUPTS :
-				if (resolve)
-					return getInterrupts();
-				return basicGetInterrupts();
-			case UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.ACTIVITY_EDGE__TARGET :
-				if (resolve)
-					return getTarget();
-				return basicGetTarget();
-			case UMLPackage.ACTIVITY_EDGE__SOURCE :
-				if (resolve)
-					return getSource();
-				return basicGetSource();
-			case UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE :
-				return getRedefinedEdges();
-			case UMLPackage.ACTIVITY_EDGE__WEIGHT :
-				if (resolve)
-					return getWeight();
-				return basicGetWeight();
-			case UMLPackage.ACTIVITY_EDGE__IN_GROUP :
-				return getInGroups();
+		case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ACTIVITY_EDGE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ACTIVITY_EDGE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ACTIVITY_EDGE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ACTIVITY_EDGE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ACTIVITY_EDGE__NAME:
+			return getName();
+		case UMLPackage.ACTIVITY_EDGE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ACTIVITY_EDGE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ACTIVITY_EDGE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTIVITY_EDGE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ACTIVITY_EDGE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.ACTIVITY_EDGE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.ACTIVITY_EDGE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.ACTIVITY_EDGE__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.ACTIVITY_EDGE__GUARD:
+			if (resolve)
+				return getGuard();
+			return basicGetGuard();
+		case UMLPackage.ACTIVITY_EDGE__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.ACTIVITY_EDGE__INTERRUPTS:
+			if (resolve)
+				return getInterrupts();
+			return basicGetInterrupts();
+		case UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.ACTIVITY_EDGE__TARGET:
+			if (resolve)
+				return getTarget();
+			return basicGetTarget();
+		case UMLPackage.ACTIVITY_EDGE__SOURCE:
+			if (resolve)
+				return getSource();
+			return basicGetSource();
+		case UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE:
+			return getRedefinedEdges();
+		case UMLPackage.ACTIVITY_EDGE__WEIGHT:
+			if (resolve)
+				return getWeight();
+			return basicGetWeight();
+		case UMLPackage.ACTIVITY_EDGE__IN_GROUP:
+			return getInGroups();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -827,59 +738,55 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__GUARD :
-				setGuard((ValueSpecification) newValue);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__INTERRUPTS :
-				setInterrupts((InterruptibleActivityRegion) newValue);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__TARGET :
-				setTarget((ActivityNode) newValue);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__SOURCE :
-				setSource((ActivityNode) newValue);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE :
-				getRedefinedEdges().clear();
-				getRedefinedEdges()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__WEIGHT :
-				setWeight((ValueSpecification) newValue);
-				return;
+		case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__GUARD:
+			setGuard((ValueSpecification) newValue);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__INTERRUPTS:
+			setInterrupts((InterruptibleActivityRegion) newValue);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__TARGET:
+			setTarget((ActivityNode) newValue);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__SOURCE:
+			setSource((ActivityNode) newValue);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE:
+			getRedefinedEdges().clear();
+			getRedefinedEdges().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__WEIGHT:
+			setWeight((ValueSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -892,51 +799,51 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ACTIVITY_EDGE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ACTIVITY_EDGE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ACTIVITY_EDGE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ACTIVITY_EDGE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__GUARD :
-				setGuard((ValueSpecification) null);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.ACTIVITY_EDGE__INTERRUPTS :
-				setInterrupts((InterruptibleActivityRegion) null);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__TARGET :
-				setTarget((ActivityNode) null);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__SOURCE :
-				setSource((ActivityNode) null);
-				return;
-			case UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE :
-				getRedefinedEdges().clear();
-				return;
-			case UMLPackage.ACTIVITY_EDGE__WEIGHT :
-				setWeight((ValueSpecification) null);
-				return;
+		case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ACTIVITY_EDGE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ACTIVITY_EDGE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ACTIVITY_EDGE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ACTIVITY_EDGE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__GUARD:
+			setGuard((ValueSpecification) null);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.ACTIVITY_EDGE__INTERRUPTS:
+			setInterrupts((InterruptibleActivityRegion) null);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__TARGET:
+			setTarget((ActivityNode) null);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__SOURCE:
+			setSource((ActivityNode) null);
+			return;
+		case UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE:
+			getRedefinedEdges().clear();
+			return;
+		case UMLPackage.ACTIVITY_EDGE__WEIGHT:
+			setWeight((ValueSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -949,54 +856,52 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ACTIVITY_EDGE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ACTIVITY_EDGE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ACTIVITY_EDGE__OWNER :
-				return isSetOwner();
-			case UMLPackage.ACTIVITY_EDGE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ACTIVITY_EDGE__NAME :
-				return isSetName();
-			case UMLPackage.ACTIVITY_EDGE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ACTIVITY_EDGE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ACTIVITY_EDGE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ACTIVITY_EDGE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ACTIVITY_EDGE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.ACTIVITY_EDGE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.ACTIVITY_EDGE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.ACTIVITY_EDGE__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.ACTIVITY_EDGE__GUARD :
-				return basicGetGuard() != null;
-			case UMLPackage.ACTIVITY_EDGE__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.ACTIVITY_EDGE__INTERRUPTS :
-				return basicGetInterrupts() != null;
-			case UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.ACTIVITY_EDGE__TARGET :
-				return basicGetTarget() != null;
-			case UMLPackage.ACTIVITY_EDGE__SOURCE :
-				return basicGetSource() != null;
-			case UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE :
-				return !getRedefinedEdges().isEmpty();
-			case UMLPackage.ACTIVITY_EDGE__WEIGHT :
-				return basicGetWeight() != null;
-			case UMLPackage.ACTIVITY_EDGE__IN_GROUP :
-				return isSetInGroups();
+		case UMLPackage.ACTIVITY_EDGE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ACTIVITY_EDGE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ACTIVITY_EDGE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ACTIVITY_EDGE__OWNER:
+			return isSetOwner();
+		case UMLPackage.ACTIVITY_EDGE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ACTIVITY_EDGE__NAME:
+			return isSetName();
+		case UMLPackage.ACTIVITY_EDGE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ACTIVITY_EDGE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ACTIVITY_EDGE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ACTIVITY_EDGE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ACTIVITY_EDGE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.ACTIVITY_EDGE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.ACTIVITY_EDGE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.ACTIVITY_EDGE__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.ACTIVITY_EDGE__GUARD:
+			return basicGetGuard() != null;
+		case UMLPackage.ACTIVITY_EDGE__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.ACTIVITY_EDGE__INTERRUPTS:
+			return basicGetInterrupts() != null;
+		case UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.ACTIVITY_EDGE__TARGET:
+			return basicGetTarget() != null;
+		case UMLPackage.ACTIVITY_EDGE__SOURCE:
+			return basicGetSource() != null;
+		case UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE:
+			return !getRedefinedEdges().isEmpty();
+		case UMLPackage.ACTIVITY_EDGE__WEIGHT:
+			return basicGetWeight() != null;
+		case UMLPackage.ACTIVITY_EDGE__IN_GROUP:
+			return isSetInGroups();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1011,146 +916,122 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ACTIVITY_EDGE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_EDGE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_EDGE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ACTIVITY_EDGE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ACTIVITY_EDGE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ACTIVITY_EDGE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ACTIVITY_EDGE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY_EDGE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___GET_MODEL :
-				return getModel();
-			case UMLPackage.ACTIVITY_EDGE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ACTIVITY_EDGE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ACTIVITY_EDGE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ACTIVITY_EDGE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ACTIVITY_EDGE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ACTIVITY_EDGE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ACTIVITY_EDGE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY_EDGE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY_EDGE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ACTIVITY_EDGE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ACTIVITY_EDGE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ACTIVITY_EDGE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_EDGE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_EDGE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_EDGE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ACTIVITY_EDGE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ACTIVITY_EDGE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ACTIVITY_EDGE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ACTIVITY_EDGE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ACTIVITY_EDGE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTIVITY_EDGE___SEPARATOR :
-				return separator();
-			case UMLPackage.ACTIVITY_EDGE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ACTIVITY_EDGE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_EDGE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_EDGE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_EDGE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_EDGE___VALIDATE_SOURCE_AND_TARGET__DIAGNOSTICCHAIN_MAP :
-				return validateSourceAndTarget(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_EDGE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_EDGE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_EDGE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ACTIVITY_EDGE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ACTIVITY_EDGE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ACTIVITY_EDGE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ACTIVITY_EDGE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY_EDGE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___GET_MODEL:
+			return getModel();
+		case UMLPackage.ACTIVITY_EDGE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ACTIVITY_EDGE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ACTIVITY_EDGE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ACTIVITY_EDGE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ACTIVITY_EDGE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ACTIVITY_EDGE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ACTIVITY_EDGE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY_EDGE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY_EDGE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ACTIVITY_EDGE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ACTIVITY_EDGE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ACTIVITY_EDGE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_EDGE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_EDGE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_EDGE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ACTIVITY_EDGE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ACTIVITY_EDGE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ACTIVITY_EDGE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ACTIVITY_EDGE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ACTIVITY_EDGE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTIVITY_EDGE___SEPARATOR:
+			return separator();
+		case UMLPackage.ACTIVITY_EDGE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ACTIVITY_EDGE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_EDGE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_EDGE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_EDGE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_EDGE___VALIDATE_SOURCE_AND_TARGET__DIAGNOSTICCHAIN_MAP:
+			return validateSourceAndTarget((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1180,8 +1061,9 @@
 	 */
 	@Override
 	public boolean isSetOwner() {
-		return super.isSetOwner() || eIsSet(UMLPackage.ACTIVITY_EDGE__ACTIVITY)
-			|| eIsSet(UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE);
+		return super.isSetOwner()
+				|| eIsSet(UMLPackage.ACTIVITY_EDGE__ACTIVITY)
+				|| eIsSet(UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE);
 	}
 
 	/**
@@ -1191,7 +1073,7 @@
 	 */
 	public boolean isSetInGroups() {
 		return eIsSet(UMLPackage.ACTIVITY_EDGE__IN_PARTITION)
-			|| eIsSet(UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE);
+				|| eIsSet(UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE);
 	}
 
 	/**
@@ -1202,7 +1084,7 @@
 	@Override
 	public boolean isSetRedefinedElements() {
 		return super.isSetRedefinedElements()
-			|| eIsSet(UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE);
+				|| eIsSet(UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE);
 	}
 
 	/**
@@ -1213,10 +1095,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.ACTIVITY_EDGE__OWNED_COMMENT,
-		UMLPackage.ACTIVITY_EDGE__NAME_EXPRESSION,
-		UMLPackage.ACTIVITY_EDGE__GUARD, UMLPackage.ACTIVITY_EDGE__WEIGHT};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.ACTIVITY_EDGE__OWNED_COMMENT, UMLPackage.ACTIVITY_EDGE__NAME_EXPRESSION, UMLPackage.ACTIVITY_EDGE__GUARD, UMLPackage.ACTIVITY_EDGE__WEIGHT };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getInGroups() <em>In Group</em>}' reference list.
@@ -1226,9 +1105,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] IN_GROUP_ESUBSETS = new int[]{
-		UMLPackage.ACTIVITY_EDGE__IN_PARTITION,
-		UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE};
+	protected static final int[] IN_GROUP_ESUBSETS = new int[] { UMLPackage.ACTIVITY_EDGE__IN_PARTITION, UMLPackage.ACTIVITY_EDGE__IN_STRUCTURED_NODE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1246,12 +1123,10 @@
 	 */
 	public ActivityGroup getInGroup(String name, boolean ignoreCase,
 			EClass eClass) {
-		inGroupLoop : for (ActivityGroup inGroup : getInGroups()) {
+		inGroupLoop: for (ActivityGroup inGroup : getInGroups()) {
 			if (eClass != null && !eClass.isInstance(inGroup))
 				continue inGroupLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(inGroup.getName())
-				: name.equals(inGroup.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(inGroup.getName()) : name.equals(inGroup.getName())))
 				continue inGroupLoop;
 			return inGroup;
 		}
@@ -1266,8 +1141,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE};
+	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[] { UMLPackage.ACTIVITY_EDGE__REDEFINED_EDGE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1277,9 +1151,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -1290,8 +1162,8 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.ACTIVITY_EDGE__GUARD)
-			|| eIsSet(UMLPackage.ACTIVITY_EDGE__WEIGHT);
+				|| eIsSet(UMLPackage.ACTIVITY_EDGE__GUARD)
+				|| eIsSet(UMLPackage.ACTIVITY_EDGE__WEIGHT);
 	}
 
 } //ActivityEdgeImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityFinalNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityFinalNodeImpl.java
index b1e7b10..cabed39 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityFinalNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityFinalNodeImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityGroupImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityGroupImpl.java
index 567e42b..fdfca5d 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityGroupImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityGroupImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 465214, 485756
  *
  */
@@ -106,19 +106,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<ActivityGroup> subgroups = (EList<ActivityGroup>) cache.get(
-				eResource, this, UMLPackage.Literals.ACTIVITY_GROUP__SUBGROUP);
+			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<ActivityGroup>(
-						ActivityGroup.class, this,
-						UMLPackage.ACTIVITY_GROUP__SUBGROUP, null));
+				cache.put(eResource, this, UMLPackage.Literals.ACTIVITY_GROUP__SUBGROUP, subgroups = new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class, this, UMLPackage.ACTIVITY_GROUP__SUBGROUP, null));
 			}
 			return subgroups;
 		}
-		return new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class,
-			this, UMLPackage.ACTIVITY_GROUP__SUBGROUP, null);
+		return new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class, this, UMLPackage.ACTIVITY_GROUP__SUBGROUP, null);
 	}
 
 	/**
@@ -137,12 +131,10 @@
 	 */
 	public ActivityGroup getSubgroup(String name, boolean ignoreCase,
 			EClass eClass) {
-		subgroupLoop : for (ActivityGroup subgroup : getSubgroups()) {
+		subgroupLoop: for (ActivityGroup subgroup : getSubgroups()) {
 			if (eClass != null && !eClass.isInstance(subgroup))
 				continue subgroupLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(subgroup.getName())
-				: name.equals(subgroup.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(subgroup.getName()) : name.equals(subgroup.getName())))
 				continue subgroupLoop;
 			return subgroup;
 		}
@@ -160,20 +152,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.ACTIVITY_GROUP__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ACTIVITY_GROUP__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.ACTIVITY_GROUP__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ACTIVITY_GROUP__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -186,20 +171,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<ActivityNode> containedNodes = (EList<ActivityNode>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE);
+			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>(
-						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>(ActivityNode.class,
-			this, UMLPackage.ACTIVITY_GROUP__CONTAINED_NODE, null);
+		return new DerivedUnionEObjectEList<ActivityNode>(ActivityNode.class, this, UMLPackage.ACTIVITY_GROUP__CONTAINED_NODE, null);
 	}
 
 	/**
@@ -218,12 +196,10 @@
 	 */
 	public ActivityNode getContainedNode(String name, boolean ignoreCase,
 			EClass eClass) {
-		containedNodeLoop : for (ActivityNode containedNode : getContainedNodes()) {
+		containedNodeLoop: for (ActivityNode containedNode : getContainedNodes()) {
 			if (eClass != null && !eClass.isInstance(containedNode))
 				continue containedNodeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(containedNode.getName())
-				: name.equals(containedNode.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(containedNode.getName()) : name.equals(containedNode.getName())))
 				continue containedNodeLoop;
 			return containedNode;
 		}
@@ -240,20 +216,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<ActivityEdge> containedEdges = (EList<ActivityEdge>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_EDGE);
+			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>(
-						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>(ActivityEdge.class,
-			this, UMLPackage.ACTIVITY_GROUP__CONTAINED_EDGE, null);
+		return new DerivedUnionEObjectEList<ActivityEdge>(ActivityEdge.class, this, UMLPackage.ACTIVITY_GROUP__CONTAINED_EDGE, null);
 	}
 
 	/**
@@ -272,12 +241,10 @@
 	 */
 	public ActivityEdge getContainedEdge(String name, boolean ignoreCase,
 			EClass eClass) {
-		containedEdgeLoop : for (ActivityEdge containedEdge : getContainedEdges()) {
+		containedEdgeLoop: for (ActivityEdge containedEdge : getContainedEdges()) {
 			if (eClass != null && !eClass.isInstance(containedEdge))
 				continue containedEdgeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(containedEdge.getName())
-				: name.equals(containedEdge.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(containedEdge.getName()) : name.equals(containedEdge.getName())))
 				continue containedEdgeLoop;
 			return containedEdge;
 		}
@@ -291,9 +258,7 @@
 	 */
 	public Activity getInActivity() {
 		Activity inActivity = basicGetInActivity();
-		return inActivity != null && inActivity.eIsProxy()
-			? (Activity) eResolveProxy((InternalEObject) inActivity)
-			: inActivity;
+		return inActivity != null && inActivity.eIsProxy() ? (Activity) eResolveProxy((InternalEObject) inActivity) : inActivity;
 	}
 
 	/**
@@ -304,16 +269,15 @@
 	public Activity basicGetInActivity() {
 		InternalEObject eInternalContainer = eInternalContainer();
 		return eInternalContainer instanceof Activity
-			? (Activity) eInternalContainer
-			: null;
+				? (Activity) eInternalContainer
+				: null;
 	}
 
-	@Override
 	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
 		InternalEObject eInternalContainer = eInternalContainer();
 		if (eInternalContainer instanceof Activity) {
 			return ((InternalEList<ActivityGroup>) ((Activity) eInternalContainer)
-				.getGroups()).basicRemove(this, msgs);
+					.getGroups()).basicRemove(this, msgs);
 		}
 		return super.eBasicRemoveFromContainer(msgs);
 	}
@@ -324,10 +288,10 @@
 		InternalEObject eInternalContainer = eInternalContainer();
 		if (eInternalContainer instanceof Activity) {
 			msgs = ((InternalEList<ActivityGroup>) ((Activity) eInternalContainer)
-				.getGroups()).basicRemove(this, msgs);
+					.getGroups()).basicRemove(this, msgs);
 		}
 		return super.eBasicSetContainer(newContainer, newContainerFeatureID,
-			msgs);
+				msgs);
 	}
 
 	/**
@@ -339,23 +303,23 @@
 		if (newInActivity != eInternalContainer()) {
 			if (EcoreUtil.isAncestor(this, newInActivity))
 				throw new IllegalArgumentException(
-					"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
+						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
 			NotificationChain msgs = null;
 			if (eInternalContainer() != null)
 				msgs = eBasicRemoveFromContainer(msgs);
 			if (newInActivity != null)
 				msgs = ((InternalEList<ActivityGroup>) newInActivity
-					.getOwnedGroups()).basicAdd(this, msgs);
+						.getOwnedGroups()).basicAdd(this, msgs);
 			msgs = eBasicSetContainer((InternalEObject) newInActivity,
-				InternalEObject.EOPPOSITE_FEATURE_BASE
-					- UMLPackage.ACTIVITY__OWNED_GROUP,
-				msgs);
+					InternalEObject.EOPPOSITE_FEATURE_BASE
+							- UMLPackage.ACTIVITY__OWNED_GROUP,
+					msgs);
 			if (msgs != null)
 				msgs.dispatch();
 		} else if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET,
-				UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY, newInActivity,
-				newInActivity));
+					UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY, newInActivity,
+					newInActivity));
 	}
 
 	/**
@@ -374,8 +338,7 @@
 	 */
 	public boolean validateNodesAndEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActivityGroupOperations.validateNodesAndEdges(this, diagnostics,
-			context);
+		return ActivityGroupOperations.validateNodesAndEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -385,8 +348,7 @@
 	 */
 	public boolean validateNotContained(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActivityGroupOperations.validateNotContained(this, diagnostics,
-			context);
+		return ActivityGroupOperations.validateNotContained(this, diagnostics, context);
 	}
 
 	/**
@@ -397,46 +359,46 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_GROUP__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ACTIVITY_GROUP__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ACTIVITY_GROUP__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ACTIVITY_GROUP__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ACTIVITY_GROUP__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ACTIVITY_GROUP__NAME :
-				return getName();
-			case UMLPackage.ACTIVITY_GROUP__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ACTIVITY_GROUP__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ACTIVITY_GROUP__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTIVITY_GROUP__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ACTIVITY_GROUP__CONTAINED_EDGE :
-				return getContainedEdges();
-			case UMLPackage.ACTIVITY_GROUP__CONTAINED_NODE :
-				return getContainedNodes();
-			case UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY :
-				if (resolve)
-					return getInActivity();
-				return basicGetInActivity();
-			case UMLPackage.ACTIVITY_GROUP__SUBGROUP :
-				return getSubgroups();
-			case UMLPackage.ACTIVITY_GROUP__SUPER_GROUP :
-				if (resolve)
-					return getSuperGroup();
-				return basicGetSuperGroup();
+		case UMLPackage.ACTIVITY_GROUP__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ACTIVITY_GROUP__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ACTIVITY_GROUP__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ACTIVITY_GROUP__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ACTIVITY_GROUP__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ACTIVITY_GROUP__NAME:
+			return getName();
+		case UMLPackage.ACTIVITY_GROUP__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ACTIVITY_GROUP__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ACTIVITY_GROUP__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTIVITY_GROUP__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ACTIVITY_GROUP__CONTAINED_EDGE:
+			return getContainedEdges();
+		case UMLPackage.ACTIVITY_GROUP__CONTAINED_NODE:
+			return getContainedNodes();
+		case UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY:
+			if (resolve)
+				return getInActivity();
+			return basicGetInActivity();
+		case UMLPackage.ACTIVITY_GROUP__SUBGROUP:
+			return getSubgroups();
+		case UMLPackage.ACTIVITY_GROUP__SUPER_GROUP:
+			if (resolve)
+				return getSuperGroup();
+			return basicGetSuperGroup();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -450,28 +412,26 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_GROUP__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_GROUP__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_GROUP__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ACTIVITY_GROUP__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ACTIVITY_GROUP__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY :
-				setInActivity((Activity) newValue);
-				return;
+		case UMLPackage.ACTIVITY_GROUP__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_GROUP__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_GROUP__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ACTIVITY_GROUP__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ACTIVITY_GROUP__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY:
+			setInActivity((Activity) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -484,24 +444,24 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_GROUP__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ACTIVITY_GROUP__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ACTIVITY_GROUP__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ACTIVITY_GROUP__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ACTIVITY_GROUP__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY :
-				setInActivity((Activity) null);
-				return;
+		case UMLPackage.ACTIVITY_GROUP__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ACTIVITY_GROUP__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ACTIVITY_GROUP__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ACTIVITY_GROUP__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ACTIVITY_GROUP__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY:
+			setInActivity((Activity) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -514,38 +474,36 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_GROUP__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ACTIVITY_GROUP__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ACTIVITY_GROUP__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ACTIVITY_GROUP__OWNER :
-				return isSetOwner();
-			case UMLPackage.ACTIVITY_GROUP__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ACTIVITY_GROUP__NAME :
-				return isSetName();
-			case UMLPackage.ACTIVITY_GROUP__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ACTIVITY_GROUP__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ACTIVITY_GROUP__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ACTIVITY_GROUP__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ACTIVITY_GROUP__CONTAINED_EDGE :
-				return isSetContainedEdges();
-			case UMLPackage.ACTIVITY_GROUP__CONTAINED_NODE :
-				return isSetContainedNodes();
-			case UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY :
-				return basicGetInActivity() != null;
-			case UMLPackage.ACTIVITY_GROUP__SUBGROUP :
-				return isSetSubgroups();
-			case UMLPackage.ACTIVITY_GROUP__SUPER_GROUP :
-				return isSetSuperGroup();
+		case UMLPackage.ACTIVITY_GROUP__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ACTIVITY_GROUP__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ACTIVITY_GROUP__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ACTIVITY_GROUP__OWNER:
+			return isSetOwner();
+		case UMLPackage.ACTIVITY_GROUP__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ACTIVITY_GROUP__NAME:
+			return isSetName();
+		case UMLPackage.ACTIVITY_GROUP__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ACTIVITY_GROUP__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ACTIVITY_GROUP__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ACTIVITY_GROUP__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ACTIVITY_GROUP__CONTAINED_EDGE:
+			return isSetContainedEdges();
+		case UMLPackage.ACTIVITY_GROUP__CONTAINED_NODE:
+			return isSetContainedNodes();
+		case UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY:
+			return basicGetInActivity() != null;
+		case UMLPackage.ACTIVITY_GROUP__SUBGROUP:
+			return isSetSubgroups();
+		case UMLPackage.ACTIVITY_GROUP__SUPER_GROUP:
+			return isSetSuperGroup();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -559,10 +517,10 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == ActivityContent.class) {
 			switch (baseOperationID) {
-				case UMLPackage.ACTIVITY_CONTENT___CONTAINING_ACTIVITY :
-					return UMLPackage.ACTIVITY_GROUP___CONTAINING_ACTIVITY;
-				default :
-					return -1;
+			case UMLPackage.ACTIVITY_CONTENT___CONTAINING_ACTIVITY:
+				return UMLPackage.ACTIVITY_GROUP___CONTAINING_ACTIVITY;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -578,133 +536,116 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ACTIVITY_GROUP___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_GROUP___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_GROUP___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ACTIVITY_GROUP___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ACTIVITY_GROUP___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ACTIVITY_GROUP___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ACTIVITY_GROUP___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY_GROUP___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___GET_MODEL :
-				return getModel();
-			case UMLPackage.ACTIVITY_GROUP___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ACTIVITY_GROUP___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ACTIVITY_GROUP___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ACTIVITY_GROUP___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ACTIVITY_GROUP___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ACTIVITY_GROUP___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ACTIVITY_GROUP___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY_GROUP___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY_GROUP___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ACTIVITY_GROUP___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ACTIVITY_GROUP___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ACTIVITY_GROUP___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_GROUP___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_GROUP___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_GROUP___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ACTIVITY_GROUP___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ACTIVITY_GROUP___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ACTIVITY_GROUP___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ACTIVITY_GROUP___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ACTIVITY_GROUP___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ACTIVITY_GROUP___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTIVITY_GROUP___SEPARATOR :
-				return separator();
-			case UMLPackage.ACTIVITY_GROUP___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ACTIVITY_GROUP___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.ACTIVITY_GROUP___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateNodesAndEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_GROUP___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP :
-				return validateNotContained((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_GROUP___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_GROUP___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_GROUP___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ACTIVITY_GROUP___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ACTIVITY_GROUP___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ACTIVITY_GROUP___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ACTIVITY_GROUP___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY_GROUP___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___GET_MODEL:
+			return getModel();
+		case UMLPackage.ACTIVITY_GROUP___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ACTIVITY_GROUP___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ACTIVITY_GROUP___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ACTIVITY_GROUP___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ACTIVITY_GROUP___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ACTIVITY_GROUP___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ACTIVITY_GROUP___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY_GROUP___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY_GROUP___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ACTIVITY_GROUP___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ACTIVITY_GROUP___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ACTIVITY_GROUP___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_GROUP___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_GROUP___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_GROUP___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ACTIVITY_GROUP___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ACTIVITY_GROUP___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ACTIVITY_GROUP___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ACTIVITY_GROUP___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ACTIVITY_GROUP___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ACTIVITY_GROUP___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTIVITY_GROUP___SEPARATOR:
+			return separator();
+		case UMLPackage.ACTIVITY_GROUP___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ACTIVITY_GROUP___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.ACTIVITY_GROUP___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateNodesAndEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_GROUP___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP:
+			return validateNotContained((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -726,10 +667,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.ACTIVITY_GROUP__OWNED_COMMENT,
-		UMLPackage.ACTIVITY_GROUP__NAME_EXPRESSION,
-		UMLPackage.ACTIVITY_GROUP__SUBGROUP};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.ACTIVITY_GROUP__OWNED_COMMENT, UMLPackage.ACTIVITY_GROUP__NAME_EXPRESSION, UMLPackage.ACTIVITY_GROUP__SUBGROUP };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -738,7 +676,8 @@
 	 */
 	@Override
 	public boolean isSetOwnedElements() {
-		return super.isSetOwnedElements() || isSetSubgroups();
+		return super.isSetOwnedElements()
+				|| isSetSubgroups();
 	}
 
 	/**
@@ -758,9 +697,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -770,9 +707,7 @@
 	 */
 	public ActivityGroup getSuperGroup() {
 		ActivityGroup superGroup = basicGetSuperGroup();
-		return superGroup != null && superGroup.eIsProxy()
-			? (ActivityGroup) eResolveProxy((InternalEObject) superGroup)
-			: superGroup;
+		return superGroup != null && superGroup.eIsProxy() ? (ActivityGroup) eResolveProxy((InternalEObject) superGroup) : superGroup;
 	}
 
 	/**
@@ -809,8 +744,8 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY)
-			|| isSetSuperGroup();
+				|| eIsSet(UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY)
+				|| isSetSuperGroup();
 	}
 
 	/**
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityImpl.java
index 20c0f90..7cb4d98 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityImpl.java
@@ -1,15 +1,16 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -18,19 +19,30 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
+
 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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
+//import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectContainmentEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectResolvingEList;
+
 import org.eclipse.uml2.uml.Activity;
 import org.eclipse.uml2.uml.ActivityEdge;
 import org.eclipse.uml2.uml.ActivityGroup;
@@ -72,6 +84,7 @@
 import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.Variable;
 import org.eclipse.uml2.uml.VisibilityKind;
+
 import org.eclipse.uml2.uml.internal.operations.ActivityOperations;
 
 /**
@@ -141,17 +154,9 @@
 		return UMLPackage.Literals.ACTIVITY;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.ACTIVITY__GROUP) {
 			return createGroupsList();
 		}
@@ -190,19 +195,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.ACTIVITY__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ACTIVITY__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.ACTIVITY__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ACTIVITY__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -216,20 +215,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.ACTIVITY__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.ACTIVITY__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.ACTIVITY__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.ACTIVITY__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -246,8 +238,8 @@
 
 	private EList<ActivityGroup> createGroupsList() {
 		return new SubsetSupersetEObjectResolvingEList<ActivityGroup>(
-			ActivityGroup.class, this, UMLPackage.ACTIVITY__GROUP, null,
-			GROUP_ESUBSETS);
+				ActivityGroup.class, this, UMLPackage.ACTIVITY__GROUP, null,
+				GROUP_ESUBSETS);
 	}
 
 	/**
@@ -264,8 +256,8 @@
 
 	private EList<ActivityNode> createNodesList() {
 		return new SubsetSupersetEObjectResolvingEList<ActivityNode>(
-			ActivityNode.class, this, UMLPackage.ACTIVITY__NODE, null,
-			NODE_ESUBSETS);
+				ActivityNode.class, this, UMLPackage.ACTIVITY__NODE, null,
+				NODE_ESUBSETS);
 	}
 
 	/**
@@ -284,12 +276,12 @@
 	 */
 	public ActivityNode getNode(String name, boolean ignoreCase,
 			EClass eClass) {
-		nodeLoop : for (ActivityNode node : getNodes()) {
+		nodeLoop: for (ActivityNode node : getNodes()) {
 			if (eClass != null && !eClass.isInstance(node))
 				continue nodeLoop;
 			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(node.getName())
-				: name.equals(node.getName())))
+					? name.equalsIgnoreCase(node.getName())
+					: name.equals(node.getName())))
 				continue nodeLoop;
 			return node;
 		}
@@ -302,9 +294,7 @@
 	 * @generated
 	 */
 	public boolean isReadOnly() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.ACTIVITY__IS_READ_ONLY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY__IS_READ_ONLY, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.ACTIVITY__IS_READ_ONLY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY__IS_READ_ONLY, true, true);
 	}
 
 	/**
@@ -313,8 +303,7 @@
 	 * @generated
 	 */
 	public void setIsReadOnly(boolean newIsReadOnly) {
-		eDynamicSet(UMLPackage.ACTIVITY__IS_READ_ONLY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY__IS_READ_ONLY, newIsReadOnly);
+		eDynamicSet(UMLPackage.ACTIVITY__IS_READ_ONLY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY__IS_READ_ONLY, newIsReadOnly);
 	}
 
 	/**
@@ -323,9 +312,7 @@
 	 * @generated
 	 */
 	public boolean isSingleExecution() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.ACTIVITY__IS_SINGLE_EXECUTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY__IS_SINGLE_EXECUTION, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.ACTIVITY__IS_SINGLE_EXECUTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY__IS_SINGLE_EXECUTION, true, true);
 	}
 
 	/**
@@ -334,10 +321,7 @@
 	 * @generated
 	 */
 	public void setIsSingleExecution(boolean newIsSingleExecution) {
-		eDynamicSet(
-			UMLPackage.ACTIVITY__IS_SINGLE_EXECUTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY__IS_SINGLE_EXECUTION,
-			newIsSingleExecution);
+		eDynamicSet(UMLPackage.ACTIVITY__IS_SINGLE_EXECUTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY__IS_SINGLE_EXECUTION, newIsSingleExecution);
 	}
 
 	/**
@@ -347,16 +331,14 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<StructuredActivityNode> getStructuredNodes() {
-		return (EList<StructuredActivityNode>) eDynamicGet(
-			UMLPackage.ACTIVITY__STRUCTURED_NODE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY__STRUCTURED_NODE, true, true);
+		return (EList<StructuredActivityNode>) eDynamicGet(UMLPackage.ACTIVITY__STRUCTURED_NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY__STRUCTURED_NODE, true, true);
 	}
 
 	private EList<StructuredActivityNode> createStructuredNodesList() {
 		return new SubsetSupersetEObjectContainmentEList.Resolving<StructuredActivityNode>(
-			StructuredActivityNode.class, this,
-			UMLPackage.ACTIVITY__STRUCTURED_NODE, STRUCTURED_NODE_ESUPERSETS,
-			null);
+				StructuredActivityNode.class, this,
+				UMLPackage.ACTIVITY__STRUCTURED_NODE, STRUCTURED_NODE_ESUPERSETS,
+				null);
 	}
 
 	/**
@@ -366,8 +348,7 @@
 	 */
 	public StructuredActivityNode createStructuredNode(String name,
 			EClass eClass) {
-		StructuredActivityNode newStructuredNode = (StructuredActivityNode) create(
-			eClass);
+		StructuredActivityNode newStructuredNode = (StructuredActivityNode) create(eClass);
 		getStructuredNodes().add(newStructuredNode);
 		if (name != null)
 			newStructuredNode.setName(name);
@@ -380,8 +361,7 @@
 	 * @generated
 	 */
 	public StructuredActivityNode createStructuredNode(String name) {
-		return createStructuredNode(name,
-			UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE);
+		return createStructuredNode(name, UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE);
 	}
 
 	/**
@@ -391,9 +371,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Variable> getVariables() {
-		return (EList<Variable>) eDynamicGet(
-			UMLPackage.ACTIVITY__VARIABLE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY__VARIABLE, true, true);
+		return (EList<Variable>) eDynamicGet(UMLPackage.ACTIVITY__VARIABLE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY__VARIABLE, true, true);
 	}
 
 	/**
@@ -427,18 +405,14 @@
 	 */
 	public Variable getVariable(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		variableLoop : for (Variable variable : getVariables()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(variable.getName())
-				: name.equals(variable.getName())))
+		variableLoop: for (Variable variable : getVariables()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(variable.getName()) : name.equals(variable.getName())))
 				continue variableLoop;
 			if (type != null && !type.equals(variable.getType()))
 				continue variableLoop;
 			return variable;
 		}
-		return createOnDemand
-			? createVariable(name, type)
-			: null;
+		return createOnDemand ? createVariable(name, type) : null;
 	}
 
 	/**
@@ -448,9 +422,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityEdge> getEdges() {
-		return (EList<ActivityEdge>) eDynamicGet(
-			UMLPackage.ACTIVITY__EDGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY__EDGE, true, true);
+		return (EList<ActivityEdge>) eDynamicGet(UMLPackage.ACTIVITY__EDGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY__EDGE, true, true);
 	}
 
 	/**
@@ -482,18 +454,14 @@
 	 */
 	public ActivityEdge getEdge(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		edgeLoop : for (ActivityEdge edge : getEdges()) {
+		edgeLoop: for (ActivityEdge edge : getEdges()) {
 			if (eClass != null && !eClass.isInstance(edge))
 				continue edgeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(edge.getName())
-				: name.equals(edge.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(edge.getName()) : name.equals(edge.getName())))
 				continue edgeLoop;
 			return edge;
 		}
-		return createOnDemand && eClass != null
-			? createEdge(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createEdge(name, eClass) : null;
 	}
 
 	/**
@@ -503,15 +471,13 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityPartition> getPartitions() {
-		return (EList<ActivityPartition>) eDynamicGet(
-			UMLPackage.ACTIVITY__PARTITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY__PARTITION, true, true);
+		return (EList<ActivityPartition>) eDynamicGet(UMLPackage.ACTIVITY__PARTITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY__PARTITION, true, true);
 	}
 
 	private EList<ActivityPartition> createPartitionsList() {
 		return new SubsetSupersetEObjectResolvingEList<ActivityPartition>(
-			ActivityPartition.class, this, UMLPackage.ACTIVITY__PARTITION,
-			PARTITION_ESUPERSETS, null);
+				ActivityPartition.class, this, UMLPackage.ACTIVITY__PARTITION,
+				PARTITION_ESUPERSETS, null);
 	}
 
 	/**
@@ -524,77 +490,51 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.ACTIVITY__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.ACTIVITY__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this,
-							EOPPOSITE_FEATURE_BASE
-								- UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.ACTIVITY__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__INTERFACE_REALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__OWNED_OPERATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__SPECIFICATION :
-				BehavioralFeature specification = basicGetSpecification();
-				if (specification != null)
-					msgs = ((InternalEObject) specification).eInverseRemove(
-						this, UMLPackage.BEHAVIORAL_FEATURE__METHOD,
-						BehavioralFeature.class, msgs);
-				return basicSetSpecification((BehavioralFeature) otherEnd,
-					msgs);
-			case UMLPackage.ACTIVITY__EDGE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEdges())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__VARIABLE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getVariables())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.ACTIVITY__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.ACTIVITY__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.ACTIVITY__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__INTERFACE_REALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__OWNED_OPERATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__SPECIFICATION:
+			BehavioralFeature specification = basicGetSpecification();
+			if (specification != null)
+				msgs = ((InternalEObject) specification).eInverseRemove(this, UMLPackage.BEHAVIORAL_FEATURE__METHOD, BehavioralFeature.class, msgs);
+			return basicSetSpecification((BehavioralFeature) otherEnd, msgs);
+		case UMLPackage.ACTIVITY__EDGE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEdges()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__VARIABLE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getVariables()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -608,94 +548,68 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ACTIVITY__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.ACTIVITY__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACTIVITY__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__OWNED_CONNECTOR :
-				return ((InternalEList<?>) getOwnedConnectors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__INTERFACE_REALIZATION :
-				return ((InternalEList<?>) getInterfaceRealizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__OWNED_BEHAVIOR :
-				return ((InternalEList<?>) getOwnedBehaviors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__OWNED_OPERATION :
-				return ((InternalEList<?>) getOwnedOperations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__NESTED_CLASSIFIER :
-				return ((InternalEList<?>) getNestedClassifiers())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__OWNED_RECEPTION :
-				return ((InternalEList<?>) getOwnedReceptions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__SPECIFICATION :
-				return basicSetSpecification(null, msgs);
-			case UMLPackage.ACTIVITY__OWNED_PARAMETER :
-				return ((InternalEList<?>) getOwnedParameters())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__OWNED_PARAMETER_SET :
-				return ((InternalEList<?>) getOwnedParameterSets())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__OWNED_GROUP :
-				return ((InternalEList<?>) getOwnedGroups())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__EDGE :
-				return ((InternalEList<?>) getEdges()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACTIVITY__VARIABLE :
-				return ((InternalEList<?>) getVariables()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACTIVITY__OWNED_NODE :
-				return ((InternalEList<?>) getOwnedNodes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY__STRUCTURED_NODE :
-				return ((InternalEList<?>) getStructuredNodes())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ACTIVITY__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.ACTIVITY__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__OWNED_CONNECTOR:
+			return ((InternalEList<?>) getOwnedConnectors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__INTERFACE_REALIZATION:
+			return ((InternalEList<?>) getInterfaceRealizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__OWNED_BEHAVIOR:
+			return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__OWNED_OPERATION:
+			return ((InternalEList<?>) getOwnedOperations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__NESTED_CLASSIFIER:
+			return ((InternalEList<?>) getNestedClassifiers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__OWNED_RECEPTION:
+			return ((InternalEList<?>) getOwnedReceptions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__SPECIFICATION:
+			return basicSetSpecification(null, msgs);
+		case UMLPackage.ACTIVITY__OWNED_PARAMETER:
+			return ((InternalEList<?>) getOwnedParameters()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__OWNED_PARAMETER_SET:
+			return ((InternalEList<?>) getOwnedParameterSets()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__OWNED_GROUP:
+			return ((InternalEList<?>) getOwnedGroups()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__EDGE:
+			return ((InternalEList<?>) getEdges()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__VARIABLE:
+			return ((InternalEList<?>) getVariables()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__OWNED_NODE:
+			return ((InternalEList<?>) getOwnedNodes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY__STRUCTURED_NODE:
+			return ((InternalEList<?>) getStructuredNodes()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -708,168 +622,168 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ACTIVITY__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ACTIVITY__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ACTIVITY__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ACTIVITY__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ACTIVITY__NAME :
-				return getName();
-			case UMLPackage.ACTIVITY__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ACTIVITY__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ACTIVITY__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTIVITY__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ACTIVITY__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.ACTIVITY__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.ACTIVITY__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.ACTIVITY__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.ACTIVITY__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.ACTIVITY__MEMBER :
-				return getMembers();
-			case UMLPackage.ACTIVITY__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.ACTIVITY__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.ACTIVITY__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.ACTIVITY__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.ACTIVITY__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.ACTIVITY__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.ACTIVITY__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.ACTIVITY__FEATURE :
-				return getFeatures();
-			case UMLPackage.ACTIVITY__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.ACTIVITY__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.ACTIVITY__GENERAL :
-				return getGenerals();
-			case UMLPackage.ACTIVITY__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.ACTIVITY__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.ACTIVITY__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.ACTIVITY__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.ACTIVITY__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.ACTIVITY__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.ACTIVITY__USE_CASE :
-				return getUseCases();
-			case UMLPackage.ACTIVITY__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.ACTIVITY__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.ACTIVITY__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.ACTIVITY__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.ACTIVITY__OWNED_CONNECTOR :
-				return getOwnedConnectors();
-			case UMLPackage.ACTIVITY__PART :
-				return getParts();
-			case UMLPackage.ACTIVITY__ROLE :
-				return getRoles();
-			case UMLPackage.ACTIVITY__OWNED_PORT :
-				return getOwnedPorts();
-			case UMLPackage.ACTIVITY__CLASSIFIER_BEHAVIOR :
-				if (resolve)
-					return getClassifierBehavior();
-				return basicGetClassifierBehavior();
-			case UMLPackage.ACTIVITY__INTERFACE_REALIZATION :
-				return getInterfaceRealizations();
-			case UMLPackage.ACTIVITY__OWNED_BEHAVIOR :
-				return getOwnedBehaviors();
-			case UMLPackage.ACTIVITY__OWNED_OPERATION :
-				return getOwnedOperations();
-			case UMLPackage.ACTIVITY__EXTENSION :
-				return getExtensions();
-			case UMLPackage.ACTIVITY__IS_ACTIVE :
-				return isActive();
-			case UMLPackage.ACTIVITY__NESTED_CLASSIFIER :
-				return getNestedClassifiers();
-			case UMLPackage.ACTIVITY__OWNED_RECEPTION :
-				return getOwnedReceptions();
-			case UMLPackage.ACTIVITY__SUPER_CLASS :
-				return getSuperClasses();
-			case UMLPackage.ACTIVITY__SPECIFICATION :
-				if (resolve)
-					return getSpecification();
-				return basicGetSpecification();
-			case UMLPackage.ACTIVITY__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.ACTIVITY__IS_REENTRANT :
-				return isReentrant();
-			case UMLPackage.ACTIVITY__OWNED_PARAMETER :
-				return getOwnedParameters();
-			case UMLPackage.ACTIVITY__OWNED_PARAMETER_SET :
-				return getOwnedParameterSets();
-			case UMLPackage.ACTIVITY__POSTCONDITION :
-				return getPostconditions();
-			case UMLPackage.ACTIVITY__PRECONDITION :
-				return getPreconditions();
-			case UMLPackage.ACTIVITY__REDEFINED_BEHAVIOR :
-				return getRedefinedBehaviors();
-			case UMLPackage.ACTIVITY__OWNED_GROUP :
-				return getOwnedGroups();
-			case UMLPackage.ACTIVITY__EDGE :
-				return getEdges();
-			case UMLPackage.ACTIVITY__NODE :
-				return getNodes();
-			case UMLPackage.ACTIVITY__VARIABLE :
-				return getVariables();
-			case UMLPackage.ACTIVITY__GROUP :
-				return getGroups();
-			case UMLPackage.ACTIVITY__OWNED_NODE :
-				return getOwnedNodes();
-			case UMLPackage.ACTIVITY__IS_READ_ONLY :
-				return isReadOnly();
-			case UMLPackage.ACTIVITY__IS_SINGLE_EXECUTION :
-				return isSingleExecution();
-			case UMLPackage.ACTIVITY__PARTITION :
-				return getPartitions();
-			case UMLPackage.ACTIVITY__STRUCTURED_NODE :
-				return getStructuredNodes();
+		case UMLPackage.ACTIVITY__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ACTIVITY__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ACTIVITY__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ACTIVITY__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ACTIVITY__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ACTIVITY__NAME:
+			return getName();
+		case UMLPackage.ACTIVITY__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ACTIVITY__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ACTIVITY__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTIVITY__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ACTIVITY__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.ACTIVITY__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.ACTIVITY__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.ACTIVITY__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.ACTIVITY__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.ACTIVITY__MEMBER:
+			return getMembers();
+		case UMLPackage.ACTIVITY__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.ACTIVITY__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.ACTIVITY__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.ACTIVITY__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.ACTIVITY__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.ACTIVITY__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.ACTIVITY__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.ACTIVITY__FEATURE:
+			return getFeatures();
+		case UMLPackage.ACTIVITY__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.ACTIVITY__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.ACTIVITY__GENERAL:
+			return getGenerals();
+		case UMLPackage.ACTIVITY__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.ACTIVITY__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.ACTIVITY__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.ACTIVITY__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.ACTIVITY__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.ACTIVITY__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.ACTIVITY__USE_CASE:
+			return getUseCases();
+		case UMLPackage.ACTIVITY__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.ACTIVITY__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.ACTIVITY__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.ACTIVITY__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.ACTIVITY__OWNED_CONNECTOR:
+			return getOwnedConnectors();
+		case UMLPackage.ACTIVITY__PART:
+			return getParts();
+		case UMLPackage.ACTIVITY__ROLE:
+			return getRoles();
+		case UMLPackage.ACTIVITY__OWNED_PORT:
+			return getOwnedPorts();
+		case UMLPackage.ACTIVITY__CLASSIFIER_BEHAVIOR:
+			if (resolve)
+				return getClassifierBehavior();
+			return basicGetClassifierBehavior();
+		case UMLPackage.ACTIVITY__INTERFACE_REALIZATION:
+			return getInterfaceRealizations();
+		case UMLPackage.ACTIVITY__OWNED_BEHAVIOR:
+			return getOwnedBehaviors();
+		case UMLPackage.ACTIVITY__OWNED_OPERATION:
+			return getOwnedOperations();
+		case UMLPackage.ACTIVITY__EXTENSION:
+			return getExtensions();
+		case UMLPackage.ACTIVITY__IS_ACTIVE:
+			return isActive();
+		case UMLPackage.ACTIVITY__NESTED_CLASSIFIER:
+			return getNestedClassifiers();
+		case UMLPackage.ACTIVITY__OWNED_RECEPTION:
+			return getOwnedReceptions();
+		case UMLPackage.ACTIVITY__SUPER_CLASS:
+			return getSuperClasses();
+		case UMLPackage.ACTIVITY__SPECIFICATION:
+			if (resolve)
+				return getSpecification();
+			return basicGetSpecification();
+		case UMLPackage.ACTIVITY__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.ACTIVITY__IS_REENTRANT:
+			return isReentrant();
+		case UMLPackage.ACTIVITY__OWNED_PARAMETER:
+			return getOwnedParameters();
+		case UMLPackage.ACTIVITY__OWNED_PARAMETER_SET:
+			return getOwnedParameterSets();
+		case UMLPackage.ACTIVITY__POSTCONDITION:
+			return getPostconditions();
+		case UMLPackage.ACTIVITY__PRECONDITION:
+			return getPreconditions();
+		case UMLPackage.ACTIVITY__REDEFINED_BEHAVIOR:
+			return getRedefinedBehaviors();
+		case UMLPackage.ACTIVITY__OWNED_GROUP:
+			return getOwnedGroups();
+		case UMLPackage.ACTIVITY__EDGE:
+			return getEdges();
+		case UMLPackage.ACTIVITY__NODE:
+			return getNodes();
+		case UMLPackage.ACTIVITY__VARIABLE:
+			return getVariables();
+		case UMLPackage.ACTIVITY__GROUP:
+			return getGroups();
+		case UMLPackage.ACTIVITY__OWNED_NODE:
+			return getOwnedNodes();
+		case UMLPackage.ACTIVITY__IS_READ_ONLY:
+			return isReadOnly();
+		case UMLPackage.ACTIVITY__IS_SINGLE_EXECUTION:
+			return isSingleExecution();
+		case UMLPackage.ACTIVITY__PARTITION:
+			return getPartitions();
+		case UMLPackage.ACTIVITY__STRUCTURED_NODE:
+			return getStructuredNodes();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -883,231 +797,197 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ACTIVITY__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ACTIVITY__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ACTIVITY__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.ACTIVITY__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ACTIVITY__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ACTIVITY__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.ACTIVITY__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.ACTIVITY__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.ACTIVITY__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.ACTIVITY__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.ACTIVITY__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				getOwnedConnectors()
-					.addAll((Collection<? extends Connector>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) newValue);
-				return;
-			case UMLPackage.ACTIVITY__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll(
-					(Collection<? extends InterfaceRealization>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				getOwnedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__IS_ACTIVE :
-				setIsActive((Boolean) newValue);
-				return;
-			case UMLPackage.ACTIVITY__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				getNestedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				getOwnedReceptions()
-					.addAll((Collection<? extends Reception>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__SUPER_CLASS :
-				getSuperClasses().clear();
-				getSuperClasses().addAll(
-					(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__SPECIFICATION :
-				setSpecification((BehavioralFeature) newValue);
-				return;
-			case UMLPackage.ACTIVITY__IS_REENTRANT :
-				setIsReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.ACTIVITY__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				getOwnedParameters()
-					.addAll((Collection<? extends Parameter>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				getOwnedParameterSets()
-					.addAll((Collection<? extends ParameterSet>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__POSTCONDITION :
-				getPostconditions().clear();
-				getPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__PRECONDITION :
-				getPreconditions().clear();
-				getPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__REDEFINED_BEHAVIOR :
-				getRedefinedBehaviors().clear();
-				getRedefinedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__OWNED_GROUP :
-				getOwnedGroups().clear();
-				getOwnedGroups()
-					.addAll((Collection<? extends ActivityGroup>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__EDGE :
-				getEdges().clear();
-				getEdges()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__NODE :
-				getNodes().clear();
-				getNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__VARIABLE :
-				getVariables().clear();
-				getVariables()
-					.addAll((Collection<? extends Variable>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__GROUP :
-				getGroups().clear();
-				getGroups()
-					.addAll((Collection<? extends ActivityGroup>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__OWNED_NODE :
-				getOwnedNodes().clear();
-				getOwnedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__IS_READ_ONLY :
-				setIsReadOnly((Boolean) newValue);
-				return;
-			case UMLPackage.ACTIVITY__IS_SINGLE_EXECUTION :
-				setIsSingleExecution((Boolean) newValue);
-				return;
-			case UMLPackage.ACTIVITY__PARTITION :
-				getPartitions().clear();
-				getPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.ACTIVITY__STRUCTURED_NODE :
-				getStructuredNodes().clear();
-				getStructuredNodes().addAll(
-					(Collection<? extends StructuredActivityNode>) newValue);
-				return;
+		case UMLPackage.ACTIVITY__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ACTIVITY__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ACTIVITY__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ACTIVITY__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.ACTIVITY__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ACTIVITY__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ACTIVITY__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.ACTIVITY__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.ACTIVITY__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.ACTIVITY__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.ACTIVITY__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.ACTIVITY__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			getOwnedConnectors().addAll((Collection<? extends Connector>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) newValue);
+			return;
+		case UMLPackage.ACTIVITY__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			getInterfaceRealizations().addAll((Collection<? extends InterfaceRealization>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			getOwnedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__IS_ACTIVE:
+			setIsActive((Boolean) newValue);
+			return;
+		case UMLPackage.ACTIVITY__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			getNestedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			getOwnedReceptions().addAll((Collection<? extends Reception>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__SUPER_CLASS:
+			getSuperClasses().clear();
+			getSuperClasses().addAll((Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__SPECIFICATION:
+			setSpecification((BehavioralFeature) newValue);
+			return;
+		case UMLPackage.ACTIVITY__IS_REENTRANT:
+			setIsReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.ACTIVITY__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			getOwnedParameters().addAll((Collection<? extends Parameter>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			getOwnedParameterSets().addAll((Collection<? extends ParameterSet>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__POSTCONDITION:
+			getPostconditions().clear();
+			getPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__PRECONDITION:
+			getPreconditions().clear();
+			getPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__REDEFINED_BEHAVIOR:
+			getRedefinedBehaviors().clear();
+			getRedefinedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__OWNED_GROUP:
+			getOwnedGroups().clear();
+			getOwnedGroups().addAll((Collection<? extends ActivityGroup>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__EDGE:
+			getEdges().clear();
+			getEdges().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__NODE:
+			getNodes().clear();
+			getNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__VARIABLE:
+			getVariables().clear();
+			getVariables().addAll((Collection<? extends Variable>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__GROUP:
+			getGroups().clear();
+			getGroups().addAll((Collection<? extends ActivityGroup>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__OWNED_NODE:
+			getOwnedNodes().clear();
+			getOwnedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__IS_READ_ONLY:
+			setIsReadOnly((Boolean) newValue);
+			return;
+		case UMLPackage.ACTIVITY__IS_SINGLE_EXECUTION:
+			setIsSingleExecution((Boolean) newValue);
+			return;
+		case UMLPackage.ACTIVITY__PARTITION:
+			getPartitions().clear();
+			getPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.ACTIVITY__STRUCTURED_NODE:
+			getStructuredNodes().clear();
+			getStructuredNodes().addAll((Collection<? extends StructuredActivityNode>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -1120,162 +1000,162 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ACTIVITY__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ACTIVITY__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ACTIVITY__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ACTIVITY__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ACTIVITY__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.ACTIVITY__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.ACTIVITY__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.ACTIVITY__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.ACTIVITY__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ACTIVITY__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ACTIVITY__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.ACTIVITY__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.ACTIVITY__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.ACTIVITY__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.ACTIVITY__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.ACTIVITY__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.ACTIVITY__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.ACTIVITY__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.ACTIVITY__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.ACTIVITY__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.ACTIVITY__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.ACTIVITY__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.ACTIVITY__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.ACTIVITY__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.ACTIVITY__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				return;
-			case UMLPackage.ACTIVITY__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) null);
-				return;
-			case UMLPackage.ACTIVITY__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				return;
-			case UMLPackage.ACTIVITY__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				return;
-			case UMLPackage.ACTIVITY__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
-			case UMLPackage.ACTIVITY__IS_ACTIVE :
-				setIsActive(IS_ACTIVE_EDEFAULT);
-				return;
-			case UMLPackage.ACTIVITY__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				return;
-			case UMLPackage.ACTIVITY__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				return;
-			case UMLPackage.ACTIVITY__SUPER_CLASS :
-				getSuperClasses().clear();
-				return;
-			case UMLPackage.ACTIVITY__SPECIFICATION :
-				setSpecification((BehavioralFeature) null);
-				return;
-			case UMLPackage.ACTIVITY__IS_REENTRANT :
-				unsetIsReentrant();
-				return;
-			case UMLPackage.ACTIVITY__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				return;
-			case UMLPackage.ACTIVITY__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				return;
-			case UMLPackage.ACTIVITY__POSTCONDITION :
-				getPostconditions().clear();
-				return;
-			case UMLPackage.ACTIVITY__PRECONDITION :
-				getPreconditions().clear();
-				return;
-			case UMLPackage.ACTIVITY__REDEFINED_BEHAVIOR :
-				getRedefinedBehaviors().clear();
-				return;
-			case UMLPackage.ACTIVITY__OWNED_GROUP :
-				getOwnedGroups().clear();
-				return;
-			case UMLPackage.ACTIVITY__EDGE :
-				getEdges().clear();
-				return;
-			case UMLPackage.ACTIVITY__NODE :
-				getNodes().clear();
-				return;
-			case UMLPackage.ACTIVITY__VARIABLE :
-				getVariables().clear();
-				return;
-			case UMLPackage.ACTIVITY__GROUP :
-				getGroups().clear();
-				return;
-			case UMLPackage.ACTIVITY__OWNED_NODE :
-				getOwnedNodes().clear();
-				return;
-			case UMLPackage.ACTIVITY__IS_READ_ONLY :
-				setIsReadOnly(IS_READ_ONLY_EDEFAULT);
-				return;
-			case UMLPackage.ACTIVITY__IS_SINGLE_EXECUTION :
-				setIsSingleExecution(IS_SINGLE_EXECUTION_EDEFAULT);
-				return;
-			case UMLPackage.ACTIVITY__PARTITION :
-				getPartitions().clear();
-				return;
-			case UMLPackage.ACTIVITY__STRUCTURED_NODE :
-				getStructuredNodes().clear();
-				return;
+		case UMLPackage.ACTIVITY__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ACTIVITY__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ACTIVITY__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ACTIVITY__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ACTIVITY__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ACTIVITY__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.ACTIVITY__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.ACTIVITY__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.ACTIVITY__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.ACTIVITY__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ACTIVITY__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ACTIVITY__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.ACTIVITY__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.ACTIVITY__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.ACTIVITY__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.ACTIVITY__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.ACTIVITY__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.ACTIVITY__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.ACTIVITY__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.ACTIVITY__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.ACTIVITY__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.ACTIVITY__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.ACTIVITY__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.ACTIVITY__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.ACTIVITY__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.ACTIVITY__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			return;
+		case UMLPackage.ACTIVITY__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) null);
+			return;
+		case UMLPackage.ACTIVITY__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			return;
+		case UMLPackage.ACTIVITY__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			return;
+		case UMLPackage.ACTIVITY__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
+		case UMLPackage.ACTIVITY__IS_ACTIVE:
+			setIsActive(IS_ACTIVE_EDEFAULT);
+			return;
+		case UMLPackage.ACTIVITY__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			return;
+		case UMLPackage.ACTIVITY__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			return;
+		case UMLPackage.ACTIVITY__SUPER_CLASS:
+			getSuperClasses().clear();
+			return;
+		case UMLPackage.ACTIVITY__SPECIFICATION:
+			setSpecification((BehavioralFeature) null);
+			return;
+		case UMLPackage.ACTIVITY__IS_REENTRANT:
+			unsetIsReentrant();
+			return;
+		case UMLPackage.ACTIVITY__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			return;
+		case UMLPackage.ACTIVITY__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			return;
+		case UMLPackage.ACTIVITY__POSTCONDITION:
+			getPostconditions().clear();
+			return;
+		case UMLPackage.ACTIVITY__PRECONDITION:
+			getPreconditions().clear();
+			return;
+		case UMLPackage.ACTIVITY__REDEFINED_BEHAVIOR:
+			getRedefinedBehaviors().clear();
+			return;
+		case UMLPackage.ACTIVITY__OWNED_GROUP:
+			getOwnedGroups().clear();
+			return;
+		case UMLPackage.ACTIVITY__EDGE:
+			getEdges().clear();
+			return;
+		case UMLPackage.ACTIVITY__NODE:
+			getNodes().clear();
+			return;
+		case UMLPackage.ACTIVITY__VARIABLE:
+			getVariables().clear();
+			return;
+		case UMLPackage.ACTIVITY__GROUP:
+			getGroups().clear();
+			return;
+		case UMLPackage.ACTIVITY__OWNED_NODE:
+			getOwnedNodes().clear();
+			return;
+		case UMLPackage.ACTIVITY__IS_READ_ONLY:
+			setIsReadOnly(IS_READ_ONLY_EDEFAULT);
+			return;
+		case UMLPackage.ACTIVITY__IS_SINGLE_EXECUTION:
+			setIsSingleExecution(IS_SINGLE_EXECUTION_EDEFAULT);
+			return;
+		case UMLPackage.ACTIVITY__PARTITION:
+			getPartitions().clear();
+			return;
+		case UMLPackage.ACTIVITY__STRUCTURED_NODE:
+			getStructuredNodes().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1288,148 +1168,146 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ACTIVITY__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ACTIVITY__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ACTIVITY__OWNER :
-				return isSetOwner();
-			case UMLPackage.ACTIVITY__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ACTIVITY__NAME :
-				return isSetName();
-			case UMLPackage.ACTIVITY__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ACTIVITY__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ACTIVITY__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ACTIVITY__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ACTIVITY__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.ACTIVITY__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.ACTIVITY__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.ACTIVITY__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.ACTIVITY__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.ACTIVITY__MEMBER :
-				return isSetMembers();
-			case UMLPackage.ACTIVITY__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.ACTIVITY__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.ACTIVITY__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.ACTIVITY__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.ACTIVITY__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.ACTIVITY__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.ACTIVITY__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.ACTIVITY__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.ACTIVITY__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.ACTIVITY__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.ACTIVITY__GENERAL :
-				return isSetGenerals();
-			case UMLPackage.ACTIVITY__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.ACTIVITY__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.ACTIVITY__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.ACTIVITY__IS_ABSTRACT :
-				return isSetIsAbstract();
-			case UMLPackage.ACTIVITY__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.ACTIVITY__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.ACTIVITY__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.ACTIVITY__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.ACTIVITY__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.ACTIVITY__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.ACTIVITY__OWNED_ATTRIBUTE :
-				return isSetOwnedAttributes();
-			case UMLPackage.ACTIVITY__OWNED_CONNECTOR :
-				return !getOwnedConnectors().isEmpty();
-			case UMLPackage.ACTIVITY__PART :
-				return !getParts().isEmpty();
-			case UMLPackage.ACTIVITY__ROLE :
-				return isSetRoles();
-			case UMLPackage.ACTIVITY__OWNED_PORT :
-				return !getOwnedPorts().isEmpty();
-			case UMLPackage.ACTIVITY__CLASSIFIER_BEHAVIOR :
-				return basicGetClassifierBehavior() != null;
-			case UMLPackage.ACTIVITY__INTERFACE_REALIZATION :
-				return !getInterfaceRealizations().isEmpty();
-			case UMLPackage.ACTIVITY__OWNED_BEHAVIOR :
-				return !getOwnedBehaviors().isEmpty();
-			case UMLPackage.ACTIVITY__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
-			case UMLPackage.ACTIVITY__EXTENSION :
-				return !getExtensions().isEmpty();
-			case UMLPackage.ACTIVITY__IS_ACTIVE :
-				return isActive() != IS_ACTIVE_EDEFAULT;
-			case UMLPackage.ACTIVITY__NESTED_CLASSIFIER :
-				return !getNestedClassifiers().isEmpty();
-			case UMLPackage.ACTIVITY__OWNED_RECEPTION :
-				return !getOwnedReceptions().isEmpty();
-			case UMLPackage.ACTIVITY__SUPER_CLASS :
-				return isSetSuperClasses();
-			case UMLPackage.ACTIVITY__SPECIFICATION :
-				return basicGetSpecification() != null;
-			case UMLPackage.ACTIVITY__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.ACTIVITY__IS_REENTRANT :
-				return isSetIsReentrant();
-			case UMLPackage.ACTIVITY__OWNED_PARAMETER :
-				return !getOwnedParameters().isEmpty();
-			case UMLPackage.ACTIVITY__OWNED_PARAMETER_SET :
-				return !getOwnedParameterSets().isEmpty();
-			case UMLPackage.ACTIVITY__POSTCONDITION :
-				return !getPostconditions().isEmpty();
-			case UMLPackage.ACTIVITY__PRECONDITION :
-				return !getPreconditions().isEmpty();
-			case UMLPackage.ACTIVITY__REDEFINED_BEHAVIOR :
-				return !getRedefinedBehaviors().isEmpty();
-			case UMLPackage.ACTIVITY__OWNED_GROUP :
-				return !getOwnedGroups().isEmpty();
-			case UMLPackage.ACTIVITY__EDGE :
-				return !getEdges().isEmpty();
-			case UMLPackage.ACTIVITY__NODE :
-				return !getNodes().isEmpty();
-			case UMLPackage.ACTIVITY__VARIABLE :
-				return !getVariables().isEmpty();
-			case UMLPackage.ACTIVITY__GROUP :
-				return !getGroups().isEmpty();
-			case UMLPackage.ACTIVITY__OWNED_NODE :
-				return !getOwnedNodes().isEmpty();
-			case UMLPackage.ACTIVITY__IS_READ_ONLY :
-				return isReadOnly() != IS_READ_ONLY_EDEFAULT;
-			case UMLPackage.ACTIVITY__IS_SINGLE_EXECUTION :
-				return isSingleExecution() != IS_SINGLE_EXECUTION_EDEFAULT;
-			case UMLPackage.ACTIVITY__PARTITION :
-				return !getPartitions().isEmpty();
-			case UMLPackage.ACTIVITY__STRUCTURED_NODE :
-				return !getStructuredNodes().isEmpty();
+		case UMLPackage.ACTIVITY__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ACTIVITY__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ACTIVITY__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ACTIVITY__OWNER:
+			return isSetOwner();
+		case UMLPackage.ACTIVITY__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ACTIVITY__NAME:
+			return isSetName();
+		case UMLPackage.ACTIVITY__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ACTIVITY__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ACTIVITY__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ACTIVITY__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ACTIVITY__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.ACTIVITY__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.ACTIVITY__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.ACTIVITY__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.ACTIVITY__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.ACTIVITY__MEMBER:
+			return isSetMembers();
+		case UMLPackage.ACTIVITY__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.ACTIVITY__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.ACTIVITY__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.ACTIVITY__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.ACTIVITY__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.ACTIVITY__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.ACTIVITY__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.ACTIVITY__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.ACTIVITY__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.ACTIVITY__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.ACTIVITY__GENERAL:
+			return isSetGenerals();
+		case UMLPackage.ACTIVITY__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.ACTIVITY__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.ACTIVITY__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.ACTIVITY__IS_ABSTRACT:
+			return isSetIsAbstract();
+		case UMLPackage.ACTIVITY__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.ACTIVITY__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.ACTIVITY__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.ACTIVITY__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.ACTIVITY__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.ACTIVITY__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.ACTIVITY__OWNED_ATTRIBUTE:
+			return isSetOwnedAttributes();
+		case UMLPackage.ACTIVITY__OWNED_CONNECTOR:
+			return !getOwnedConnectors().isEmpty();
+		case UMLPackage.ACTIVITY__PART:
+			return !getParts().isEmpty();
+		case UMLPackage.ACTIVITY__ROLE:
+			return isSetRoles();
+		case UMLPackage.ACTIVITY__OWNED_PORT:
+			return !getOwnedPorts().isEmpty();
+		case UMLPackage.ACTIVITY__CLASSIFIER_BEHAVIOR:
+			return basicGetClassifierBehavior() != null;
+		case UMLPackage.ACTIVITY__INTERFACE_REALIZATION:
+			return !getInterfaceRealizations().isEmpty();
+		case UMLPackage.ACTIVITY__OWNED_BEHAVIOR:
+			return !getOwnedBehaviors().isEmpty();
+		case UMLPackage.ACTIVITY__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
+		case UMLPackage.ACTIVITY__EXTENSION:
+			return !getExtensions().isEmpty();
+		case UMLPackage.ACTIVITY__IS_ACTIVE:
+			return isActive() != IS_ACTIVE_EDEFAULT;
+		case UMLPackage.ACTIVITY__NESTED_CLASSIFIER:
+			return !getNestedClassifiers().isEmpty();
+		case UMLPackage.ACTIVITY__OWNED_RECEPTION:
+			return !getOwnedReceptions().isEmpty();
+		case UMLPackage.ACTIVITY__SUPER_CLASS:
+			return isSetSuperClasses();
+		case UMLPackage.ACTIVITY__SPECIFICATION:
+			return basicGetSpecification() != null;
+		case UMLPackage.ACTIVITY__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.ACTIVITY__IS_REENTRANT:
+			return isSetIsReentrant();
+		case UMLPackage.ACTIVITY__OWNED_PARAMETER:
+			return !getOwnedParameters().isEmpty();
+		case UMLPackage.ACTIVITY__OWNED_PARAMETER_SET:
+			return !getOwnedParameterSets().isEmpty();
+		case UMLPackage.ACTIVITY__POSTCONDITION:
+			return !getPostconditions().isEmpty();
+		case UMLPackage.ACTIVITY__PRECONDITION:
+			return !getPreconditions().isEmpty();
+		case UMLPackage.ACTIVITY__REDEFINED_BEHAVIOR:
+			return !getRedefinedBehaviors().isEmpty();
+		case UMLPackage.ACTIVITY__OWNED_GROUP:
+			return !getOwnedGroups().isEmpty();
+		case UMLPackage.ACTIVITY__EDGE:
+			return !getEdges().isEmpty();
+		case UMLPackage.ACTIVITY__NODE:
+			return !getNodes().isEmpty();
+		case UMLPackage.ACTIVITY__VARIABLE:
+			return !getVariables().isEmpty();
+		case UMLPackage.ACTIVITY__GROUP:
+			return !getGroups().isEmpty();
+		case UMLPackage.ACTIVITY__OWNED_NODE:
+			return !getOwnedNodes().isEmpty();
+		case UMLPackage.ACTIVITY__IS_READ_ONLY:
+			return isReadOnly() != IS_READ_ONLY_EDEFAULT;
+		case UMLPackage.ACTIVITY__IS_SINGLE_EXECUTION:
+			return isSingleExecution() != IS_SINGLE_EXECUTION_EDEFAULT;
+		case UMLPackage.ACTIVITY__PARTITION:
+			return !getPartitions().isEmpty();
+		case UMLPackage.ACTIVITY__STRUCTURED_NODE:
+			return !getStructuredNodes().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1444,330 +1322,259 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ACTIVITY___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTIVITY___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTIVITY___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ACTIVITY___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ACTIVITY___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ACTIVITY___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ACTIVITY___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY___GET_MODEL :
-				return getModel();
-			case UMLPackage.ACTIVITY___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ACTIVITY___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ACTIVITY___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ACTIVITY___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ACTIVITY___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ACTIVITY___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ACTIVITY___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ACTIVITY___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ACTIVITY___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ACTIVITY___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ACTIVITY___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ACTIVITY___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ACTIVITY___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ACTIVITY___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ACTIVITY___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ACTIVITY___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ACTIVITY___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ACTIVITY___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTIVITY___SEPARATOR :
-				return separator();
-			case UMLPackage.ACTIVITY___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ACTIVITY___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.ACTIVITY___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.ACTIVITY___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.ACTIVITY___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.ACTIVITY___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.ACTIVITY___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.ACTIVITY___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.ACTIVITY___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.ACTIVITY___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.ACTIVITY___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.ACTIVITY___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.ACTIVITY___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.ACTIVITY___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.ACTIVITY___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.ACTIVITY___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.ACTIVITY___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.ACTIVITY___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.ACTIVITY___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.ACTIVITY___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.ACTIVITY___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.ACTIVITY___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.ACTIVITY___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.ACTIVITY___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.ACTIVITY___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.ACTIVITY___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.ACTIVITY___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.ACTIVITY___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.ACTIVITY___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.ACTIVITY___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.ACTIVITY___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.ACTIVITY___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.ACTIVITY___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.ACTIVITY___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.ACTIVITY___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.ACTIVITY___PARENTS :
-				return parents();
-			case UMLPackage.ACTIVITY___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.ACTIVITY___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.ACTIVITY___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.ACTIVITY___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.ACTIVITY___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.ACTIVITY___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.ACTIVITY___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.ACTIVITY___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.ACTIVITY___GET_PARTS :
-				return getParts();
-			case UMLPackage.ACTIVITY___ALL_ROLES :
-				return allRoles();
-			case UMLPackage.ACTIVITY___GET_OWNED_PORTS :
-				return getOwnedPorts();
-			case UMLPackage.ACTIVITY___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateClassBehavior((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___GET_ALL_IMPLEMENTED_INTERFACES :
-				return getAllImplementedInterfaces();
-			case UMLPackage.ACTIVITY___GET_IMPLEMENTED_INTERFACES :
-				return getImplementedInterfaces();
-			case UMLPackage.ACTIVITY___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP :
-				return validatePassiveClass((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
-			case UMLPackage.ACTIVITY___IS_METACLASS :
-				return isMetaclass();
-			case UMLPackage.ACTIVITY___GET_EXTENSIONS :
-				return getExtensions();
-			case UMLPackage.ACTIVITY___GET_SUPER_CLASSES :
-				return getSuperClasses();
-			case UMLPackage.ACTIVITY___VALIDATE_MOST_ONE_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateMostOneBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___VALIDATE_PARAMETERS_MATCH__DIAGNOSTICCHAIN_MAP :
-				return validateParametersMatch(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___VALIDATE_FEATURE_OF_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateFeatureOfContextClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.ACTIVITY___BEHAVIORED_CLASSIFIER__ELEMENT :
-				return behavioredClassifier((Element) arguments.get(0));
-			case UMLPackage.ACTIVITY___INPUT_PARAMETERS :
-				return inputParameters();
-			case UMLPackage.ACTIVITY___OUTPUT_PARAMETERS :
-				return outputParameters();
-			case UMLPackage.ACTIVITY___VALIDATE_MAXIMUM_ONE_PARAMETER_NODE__DIAGNOSTICCHAIN_MAP :
-				return validateMaximumOneParameterNode(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY___VALIDATE_MAXIMUM_TWO_PARAMETER_NODES__DIAGNOSTICCHAIN_MAP :
-				return validateMaximumTwoParameterNodes(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTIVITY___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTIVITY___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ACTIVITY___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ACTIVITY___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ACTIVITY___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ACTIVITY___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY___GET_MODEL:
+			return getModel();
+		case UMLPackage.ACTIVITY___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ACTIVITY___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ACTIVITY___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ACTIVITY___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ACTIVITY___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ACTIVITY___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ACTIVITY___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ACTIVITY___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ACTIVITY___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ACTIVITY___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ACTIVITY___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ACTIVITY___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ACTIVITY___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ACTIVITY___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ACTIVITY___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ACTIVITY___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ACTIVITY___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ACTIVITY___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTIVITY___SEPARATOR:
+			return separator();
+		case UMLPackage.ACTIVITY___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ACTIVITY___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.ACTIVITY___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.ACTIVITY___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.ACTIVITY___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.ACTIVITY___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.ACTIVITY___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.ACTIVITY___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.ACTIVITY___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.ACTIVITY___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.ACTIVITY___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.ACTIVITY___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACTIVITY___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACTIVITY___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.ACTIVITY___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.ACTIVITY___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.ACTIVITY___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.ACTIVITY___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.ACTIVITY___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.ACTIVITY___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.ACTIVITY___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.ACTIVITY___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.ACTIVITY___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.ACTIVITY___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.ACTIVITY___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.ACTIVITY___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.ACTIVITY___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.ACTIVITY___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.ACTIVITY___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.ACTIVITY___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.ACTIVITY___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.ACTIVITY___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.ACTIVITY___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.ACTIVITY___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.ACTIVITY___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.ACTIVITY___PARENTS:
+			return parents();
+		case UMLPackage.ACTIVITY___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.ACTIVITY___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.ACTIVITY___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.ACTIVITY___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.ACTIVITY___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.ACTIVITY___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.ACTIVITY___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.ACTIVITY___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.ACTIVITY___GET_PARTS:
+			return getParts();
+		case UMLPackage.ACTIVITY___ALL_ROLES:
+			return allRoles();
+		case UMLPackage.ACTIVITY___GET_OWNED_PORTS:
+			return getOwnedPorts();
+		case UMLPackage.ACTIVITY___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateClassBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___GET_ALL_IMPLEMENTED_INTERFACES:
+			return getAllImplementedInterfaces();
+		case UMLPackage.ACTIVITY___GET_IMPLEMENTED_INTERFACES:
+			return getImplementedInterfaces();
+		case UMLPackage.ACTIVITY___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP:
+			return validatePassiveClass((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.ACTIVITY___IS_METACLASS:
+			return isMetaclass();
+		case UMLPackage.ACTIVITY___GET_EXTENSIONS:
+			return getExtensions();
+		case UMLPackage.ACTIVITY___GET_SUPER_CLASSES:
+			return getSuperClasses();
+		case UMLPackage.ACTIVITY___VALIDATE_MOST_ONE_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateMostOneBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___VALIDATE_PARAMETERS_MATCH__DIAGNOSTICCHAIN_MAP:
+			return validateParametersMatch((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___VALIDATE_FEATURE_OF_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateFeatureOfContextClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.ACTIVITY___BEHAVIORED_CLASSIFIER__ELEMENT:
+			return behavioredClassifier((Element) arguments.get(0));
+		case UMLPackage.ACTIVITY___INPUT_PARAMETERS:
+			return inputParameters();
+		case UMLPackage.ACTIVITY___OUTPUT_PARAMETERS:
+			return outputParameters();
+		case UMLPackage.ACTIVITY___VALIDATE_MAXIMUM_ONE_PARAMETER_NODE__DIAGNOSTICCHAIN_MAP:
+			return validateMaximumOneParameterNode((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY___VALIDATE_MAXIMUM_TWO_PARAMETER_NODES__DIAGNOSTICCHAIN_MAP:
+			return validateMaximumTwoParameterNodes((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1779,9 +1586,10 @@
 	 */
 	@Override
 	public boolean isSetOwnedElements() {
-		return super.isSetOwnedElements() || eIsSet(UMLPackage.ACTIVITY__EDGE)
-			|| eIsSet(UMLPackage.ACTIVITY__NODE)
-			|| eIsSet(UMLPackage.ACTIVITY__GROUP);
+		return super.isSetOwnedElements()
+				|| eIsSet(UMLPackage.ACTIVITY__EDGE)
+				|| eIsSet(UMLPackage.ACTIVITY__NODE)
+				|| eIsSet(UMLPackage.ACTIVITY__GROUP);
 	}
 
 	/**
@@ -1792,7 +1600,7 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.ACTIVITY__VARIABLE);
+				|| eIsSet(UMLPackage.ACTIVITY__VARIABLE);
 	}
 
 	/**
@@ -1803,17 +1611,9 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.ACTIVITY__OWNED_COMMENT,
-		UMLPackage.ACTIVITY__NAME_EXPRESSION,
-		UMLPackage.ACTIVITY__ELEMENT_IMPORT,
-		UMLPackage.ACTIVITY__PACKAGE_IMPORT, UMLPackage.ACTIVITY__OWNED_MEMBER,
-		UMLPackage.ACTIVITY__TEMPLATE_BINDING,
-		UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE,
-		UMLPackage.ACTIVITY__COLLABORATION_USE,
-		UMLPackage.ACTIVITY__GENERALIZATION, UMLPackage.ACTIVITY__SUBSTITUTION,
-		UMLPackage.ACTIVITY__INTERFACE_REALIZATION, UMLPackage.ACTIVITY__EDGE,
-		UMLPackage.ACTIVITY__NODE, UMLPackage.ACTIVITY__GROUP};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.ACTIVITY__OWNED_COMMENT, UMLPackage.ACTIVITY__NAME_EXPRESSION, UMLPackage.ACTIVITY__ELEMENT_IMPORT, UMLPackage.ACTIVITY__PACKAGE_IMPORT, UMLPackage.ACTIVITY__OWNED_MEMBER,
+			UMLPackage.ACTIVITY__TEMPLATE_BINDING, UMLPackage.ACTIVITY__OWNED_TEMPLATE_SIGNATURE, UMLPackage.ACTIVITY__COLLABORATION_USE, UMLPackage.ACTIVITY__GENERALIZATION, UMLPackage.ACTIVITY__SUBSTITUTION, UMLPackage.ACTIVITY__INTERFACE_REALIZATION,
+			UMLPackage.ACTIVITY__EDGE, UMLPackage.ACTIVITY__NODE, UMLPackage.ACTIVITY__GROUP };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedMembers() <em>Owned Member</em>}' reference list.
@@ -1823,17 +1623,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.ACTIVITY__OWNED_RULE, UMLPackage.ACTIVITY__OWNED_USE_CASE,
-		UMLPackage.ACTIVITY__OWNED_ATTRIBUTE,
-		UMLPackage.ACTIVITY__OWNED_CONNECTOR,
-		UMLPackage.ACTIVITY__OWNED_BEHAVIOR,
-		UMLPackage.ACTIVITY__OWNED_OPERATION,
-		UMLPackage.ACTIVITY__NESTED_CLASSIFIER,
-		UMLPackage.ACTIVITY__OWNED_RECEPTION,
-		UMLPackage.ACTIVITY__OWNED_PARAMETER,
-		UMLPackage.ACTIVITY__OWNED_PARAMETER_SET,
-		UMLPackage.ACTIVITY__VARIABLE};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.ACTIVITY__OWNED_RULE, UMLPackage.ACTIVITY__OWNED_USE_CASE, UMLPackage.ACTIVITY__OWNED_ATTRIBUTE, UMLPackage.ACTIVITY__OWNED_CONNECTOR, UMLPackage.ACTIVITY__OWNED_BEHAVIOR,
+			UMLPackage.ACTIVITY__OWNED_OPERATION, UMLPackage.ACTIVITY__NESTED_CLASSIFIER, UMLPackage.ACTIVITY__OWNED_RECEPTION, UMLPackage.ACTIVITY__OWNED_PARAMETER, UMLPackage.ACTIVITY__OWNED_PARAMETER_SET, UMLPackage.ACTIVITY__VARIABLE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1842,15 +1633,13 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityGroup> getOwnedGroups() {
-		return (EList<ActivityGroup>) eDynamicGet(
-			UMLPackage.ACTIVITY__OWNED_GROUP - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY__OWNED_GROUP, true, true);
+		return (EList<ActivityGroup>) eDynamicGet(UMLPackage.ACTIVITY__OWNED_GROUP - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY__OWNED_GROUP, true, true);
 	}
 
 	private EList<ActivityGroup> createOwnedGroupsList() {
 		return new SubsetSupersetEObjectContainmentEList.Resolving<ActivityGroup>(
-			ActivityGroup.class, this, UMLPackage.ACTIVITY__OWNED_GROUP,
-			OWNED_GROUP_ESUPERSETS, OWNED_GROUP_ESUBSETS);
+				ActivityGroup.class, this, UMLPackage.ACTIVITY__OWNED_GROUP,
+				OWNED_GROUP_ESUPERSETS, OWNED_GROUP_ESUBSETS);
 	}
 
 	/**
@@ -1861,11 +1650,10 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_GROUP_ESUBSETS = new int[]{
-		UMLPackage.ACTIVITY__PARTITION};
+	protected static final int[] OWNED_GROUP_ESUBSETS = new int[] { UMLPackage.ACTIVITY__PARTITION };
 
-	protected static final int[] OWNED_GROUP_ESUPERSETS = new int[]{
-		UMLPackage.ACTIVITY__GROUP};
+	protected static final int[] OWNED_GROUP_ESUPERSETS = new int[] {
+			UMLPackage.ACTIVITY__GROUP };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1896,18 +1684,14 @@
 	 */
 	public ActivityGroup getOwnedGroup(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		ownedGroupLoop : for (ActivityGroup ownedGroup : getOwnedGroups()) {
+		ownedGroupLoop: for (ActivityGroup ownedGroup : getOwnedGroups()) {
 			if (eClass != null && !eClass.isInstance(ownedGroup))
 				continue ownedGroupLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedGroup.getName())
-				: name.equals(ownedGroup.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedGroup.getName()) : name.equals(ownedGroup.getName())))
 				continue ownedGroupLoop;
 			return ownedGroup;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedGroup(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedGroup(name, eClass) : null;
 	}
 
 	/**
@@ -1926,12 +1710,12 @@
 	 */
 	public ActivityGroup getGroup(String name, boolean ignoreCase,
 			EClass eClass) {
-		groupLoop : for (ActivityGroup group : getGroups()) {
+		groupLoop: for (ActivityGroup group : getGroups()) {
 			if (eClass != null && !eClass.isInstance(group))
 				continue groupLoop;
 			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(group.getName())
-				: name.equals(group.getName())))
+					? name.equalsIgnoreCase(group.getName())
+					: name.equals(group.getName())))
 				continue groupLoop;
 			return group;
 		}
@@ -1946,8 +1730,8 @@
 	 * @generated NOT
 	 * @ordered
 	 */
-	protected static final int[] STRUCTURED_NODE_ESUPERSETS = new int[]{
-		UMLPackage.ACTIVITY__GROUP, UMLPackage.ACTIVITY__NODE};
+	protected static final int[] STRUCTURED_NODE_ESUPERSETS = new int[] {
+			UMLPackage.ACTIVITY__GROUP, UMLPackage.ACTIVITY__NODE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1956,19 +1740,17 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityNode> getOwnedNodes() {
-		return (EList<ActivityNode>) eDynamicGet(
-			UMLPackage.ACTIVITY__OWNED_NODE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY__OWNED_NODE, true, true);
+		return (EList<ActivityNode>) eDynamicGet(UMLPackage.ACTIVITY__OWNED_NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY__OWNED_NODE, true, true);
 	}
 
 	private EList<ActivityNode> createOwnedNodesList() {
 		return new SubsetSupersetEObjectContainmentEList.Resolving<ActivityNode>(
-			ActivityNode.class, this, UMLPackage.ACTIVITY__OWNED_NODE,
-			OWNED_NODE_ESUPERSETS, null);
+				ActivityNode.class, this, UMLPackage.ACTIVITY__OWNED_NODE,
+				OWNED_NODE_ESUPERSETS, null);
 	}
 
-	protected static final int[] OWNED_NODE_ESUPERSETS = new int[]{
-		UMLPackage.ACTIVITY__NODE};
+	protected static final int[] OWNED_NODE_ESUPERSETS = new int[] {
+			UMLPackage.ACTIVITY__NODE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1999,18 +1781,14 @@
 	 */
 	public ActivityNode getOwnedNode(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		ownedNodeLoop : for (ActivityNode ownedNode : getOwnedNodes()) {
+		ownedNodeLoop: for (ActivityNode ownedNode : getOwnedNodes()) {
 			if (eClass != null && !eClass.isInstance(ownedNode))
 				continue ownedNodeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedNode.getName())
-				: name.equals(ownedNode.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedNode.getName()) : name.equals(ownedNode.getName())))
 				continue ownedNodeLoop;
 			return ownedNode;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedNode(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedNode(name, eClass) : null;
 	}
 
 	/**
@@ -2039,18 +1817,14 @@
 	 */
 	public StructuredActivityNode getStructuredNode(String name,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		structuredNodeLoop : for (StructuredActivityNode structuredNode : getStructuredNodes()) {
+		structuredNodeLoop: for (StructuredActivityNode structuredNode : getStructuredNodes()) {
 			if (eClass != null && !eClass.isInstance(structuredNode))
 				continue structuredNodeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(structuredNode.getName())
-				: name.equals(structuredNode.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(structuredNode.getName()) : name.equals(structuredNode.getName())))
 				continue structuredNodeLoop;
 			return structuredNode;
 		}
-		return createOnDemand && eClass != null
-			? createStructuredNode(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createStructuredNode(name, eClass) : null;
 	}
 
 	/**
@@ -2060,8 +1834,7 @@
 	 */
 	public boolean validateMaximumOneParameterNode(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActivityOperations.validateMaximumOneParameterNode(this,
-			diagnostics, context);
+		return ActivityOperations.validateMaximumOneParameterNode(this, diagnostics, context);
 	}
 
 	/**
@@ -2071,8 +1844,7 @@
 	 */
 	public boolean validateMaximumTwoParameterNodes(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActivityOperations.validateMaximumTwoParameterNodes(this,
-			diagnostics, context);
+		return ActivityOperations.validateMaximumTwoParameterNodes(this, diagnostics, context);
 	}
 
 	/**
@@ -2083,8 +1855,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] NODE_ESUBSETS = new int[]{
-		UMLPackage.ACTIVITY__OWNED_NODE, UMLPackage.ACTIVITY__STRUCTURED_NODE};
+	protected static final int[] NODE_ESUBSETS = new int[] { UMLPackage.ACTIVITY__OWNED_NODE, UMLPackage.ACTIVITY__STRUCTURED_NODE };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getGroups() <em>Group</em>}' reference list.
@@ -2094,8 +1865,8 @@
 	 * @generated NOT
 	 * @ordered
 	 */
-	protected static final int[] GROUP_ESUBSETS = new int[]{
-		UMLPackage.ACTIVITY__OWNED_GROUP, UMLPackage.ACTIVITY__STRUCTURED_NODE};
+	protected static final int[] GROUP_ESUBSETS = new int[] {
+			UMLPackage.ACTIVITY__OWNED_GROUP, UMLPackage.ACTIVITY__STRUCTURED_NODE };
 
 	/**
 	 * The array of superset feature identifiers for the '{@link #getPartitions() <em>Partition</em>}' reference list.
@@ -2105,8 +1876,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] PARTITION_ESUPERSETS = new int[]{
-		UMLPackage.ACTIVITY__OWNED_GROUP};
+	protected static final int[] PARTITION_ESUPERSETS = new int[] { UMLPackage.ACTIVITY__OWNED_GROUP };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2114,8 +1884,7 @@
 	 * @generated
 	 */
 	public ActivityPartition createPartition(String name) {
-		ActivityPartition newPartition = (ActivityPartition) create(
-			UMLPackage.Literals.ACTIVITY_PARTITION);
+		ActivityPartition newPartition = (ActivityPartition) create(UMLPackage.Literals.ACTIVITY_PARTITION);
 		getPartitions().add(newPartition);
 		if (name != null)
 			newPartition.setName(name);
@@ -2138,16 +1907,12 @@
 	 */
 	public ActivityPartition getPartition(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		partitionLoop : for (ActivityPartition partition : getPartitions()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(partition.getName())
-				: name.equals(partition.getName())))
+		partitionLoop: for (ActivityPartition partition : getPartitions()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(partition.getName()) : name.equals(partition.getName())))
 				continue partitionLoop;
 			return partition;
 		}
-		return createOnDemand
-			? createPartition(name)
-			: null;
+		return createOnDemand ? createPartition(name) : null;
 	}
 
 } //ActivityImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityNodeImpl.java
index 62d3f1e..0d239e6 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityNodeImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 323181
+ *   Kenn Hussey - 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 465214, 485756
  *
  */
@@ -32,6 +32,8 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
@@ -113,19 +115,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<ActivityGroup> inGroups = (EList<ActivityGroup>) cache.get(
-				eResource, this, UMLPackage.Literals.ACTIVITY_NODE__IN_GROUP);
+			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<ActivityGroup>(
-						ActivityGroup.class, this,
-						UMLPackage.ACTIVITY_NODE__IN_GROUP, IN_GROUP_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTIVITY_NODE__IN_GROUP, inGroups = new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class, this, UMLPackage.ACTIVITY_NODE__IN_GROUP, IN_GROUP_ESUBSETS));
 			}
 			return inGroups;
 		}
-		return new DerivedUnionEObjectEList<ActivityGroup>(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);
 	}
 
 	/**
@@ -139,23 +135,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			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>(
-						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>(
-			RedefinableElement.class, this,
-			UMLPackage.ACTIVITY_NODE__REDEFINED_ELEMENT,
-			REDEFINED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<RedefinableElement>(RedefinableElement.class, this, UMLPackage.ACTIVITY_NODE__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -165,9 +152,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityEdge> getOutgoings() {
-		return (EList<ActivityEdge>) eDynamicGet(
-			UMLPackage.ACTIVITY_NODE__OUTGOING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_NODE__OUTGOING, true, true);
+		return (EList<ActivityEdge>) eDynamicGet(UMLPackage.ACTIVITY_NODE__OUTGOING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_NODE__OUTGOING, true, true);
 	}
 
 	/**
@@ -186,12 +171,10 @@
 	 */
 	public ActivityEdge getOutgoing(String name, boolean ignoreCase,
 			EClass eClass) {
-		outgoingLoop : for (ActivityEdge outgoing : getOutgoings()) {
+		outgoingLoop: for (ActivityEdge outgoing : getOutgoings()) {
 			if (eClass != null && !eClass.isInstance(outgoing))
 				continue outgoingLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(outgoing.getName())
-				: name.equals(outgoing.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(outgoing.getName()) : name.equals(outgoing.getName())))
 				continue outgoingLoop;
 			return outgoing;
 		}
@@ -205,9 +188,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityPartition> getInPartitions() {
-		return (EList<ActivityPartition>) eDynamicGet(
-			UMLPackage.ACTIVITY_NODE__IN_PARTITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_NODE__IN_PARTITION, true, true);
+		return (EList<ActivityPartition>) eDynamicGet(UMLPackage.ACTIVITY_NODE__IN_PARTITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_NODE__IN_PARTITION, true, true);
 	}
 
 	/**
@@ -225,10 +206,8 @@
 	 * @generated
 	 */
 	public ActivityPartition getInPartition(String name, boolean ignoreCase) {
-		inPartitionLoop : for (ActivityPartition inPartition : getInPartitions()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(inPartition.getName())
-				: name.equals(inPartition.getName())))
+		inPartitionLoop: for (ActivityPartition inPartition : getInPartitions()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(inPartition.getName()) : name.equals(inPartition.getName())))
 				continue inPartitionLoop;
 			return inPartition;
 		}
@@ -260,10 +239,7 @@
 	 * @generated
 	 */
 	public StructuredActivityNode getInStructuredNode() {
-		return (StructuredActivityNode) eDynamicGet(
-			UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_NODE__IN_STRUCTURED_NODE, true, true);
+		return (StructuredActivityNode) eDynamicGet(UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_NODE__IN_STRUCTURED_NODE, true, true);
 	}
 
 	/**
@@ -272,10 +248,7 @@
 	 * @generated
 	 */
 	public StructuredActivityNode basicGetInStructuredNode() {
-		return (StructuredActivityNode) eDynamicGet(
-			UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_NODE__IN_STRUCTURED_NODE, false, true);
+		return (StructuredActivityNode) eDynamicGet(UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_NODE__IN_STRUCTURED_NODE, false, true);
 	}
 
 	/**
@@ -286,8 +259,7 @@
 	public NotificationChain basicSetInStructuredNode(
 			StructuredActivityNode newInStructuredNode,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newInStructuredNode,
-			UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newInStructuredNode, UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE, msgs);
 		return msgs;
 	}
 
@@ -298,11 +270,7 @@
 	 */
 	public void setInStructuredNode(
 			StructuredActivityNode newInStructuredNode) {
-		eDynamicSet(
-			UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_NODE__IN_STRUCTURED_NODE,
-			newInStructuredNode);
+		eDynamicSet(UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_NODE__IN_STRUCTURED_NODE, newInStructuredNode);
 	}
 
 	/**
@@ -312,9 +280,7 @@
 	 */
 	public Activity getActivity() {
 		Activity activity = basicGetActivity();
-		return activity != null && activity.eIsProxy()
-			? (Activity) eResolveProxy((InternalEObject) activity)
-			: activity;
+		return activity != null && activity.eIsProxy() ? (Activity) eResolveProxy((InternalEObject) activity) : activity;
 	}
 
 	/**
@@ -325,16 +291,15 @@
 	public Activity basicGetActivity() {
 		InternalEObject eInternalContainer = eInternalContainer();
 		return eInternalContainer instanceof Activity
-			? (Activity) eInternalContainer
-			: null;
+				? (Activity) eInternalContainer
+				: null;
 	}
 
-	@Override
 	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
 		InternalEObject eInternalContainer = eInternalContainer();
 		if (eInternalContainer instanceof Activity) {
 			return ((InternalEList<ActivityNode>) ((Activity) eInternalContainer)
-				.getNodes()).basicRemove(this, msgs);
+					.getNodes()).basicRemove(this, msgs);
 		}
 		return super.eBasicRemoveFromContainer(msgs);
 	}
@@ -345,10 +310,10 @@
 		InternalEObject eInternalContainer = eInternalContainer();
 		if (eInternalContainer instanceof Activity) {
 			msgs = ((InternalEList<ActivityNode>) ((Activity) eInternalContainer)
-				.getNodes()).basicRemove(this, msgs);
+					.getNodes()).basicRemove(this, msgs);
 		}
 		return super.eBasicSetContainer(newContainer, newContainerFeatureID,
-			msgs);
+				msgs);
 	}
 
 	/**
@@ -360,22 +325,22 @@
 		if (newActivity != eInternalContainer()) {
 			if (EcoreUtil.isAncestor(this, newActivity))
 				throw new IllegalArgumentException(
-					"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
+						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
 			NotificationChain msgs = null;
 			if (eInternalContainer() != null)
 				msgs = eBasicRemoveFromContainer(msgs);
 			if (newActivity != null)
 				msgs = ((InternalEList<ActivityNode>) newActivity
-					.getOwnedNodes()).basicAdd(this, msgs);
+						.getOwnedNodes()).basicAdd(this, msgs);
 			msgs = eBasicSetContainer((InternalEObject) newActivity,
-				InternalEObject.EOPPOSITE_FEATURE_BASE
-					- UMLPackage.ACTIVITY__OWNED_NODE,
-				msgs);
+					InternalEObject.EOPPOSITE_FEATURE_BASE
+							- UMLPackage.ACTIVITY__OWNED_NODE,
+					msgs);
 			if (msgs != null)
 				msgs.dispatch();
 		} else if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET,
-				UMLPackage.ACTIVITY_NODE__ACTIVITY, newActivity, newActivity));
+					UMLPackage.ACTIVITY_NODE__ACTIVITY, newActivity, newActivity));
 	}
 
 	/**
@@ -385,9 +350,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityEdge> getIncomings() {
-		return (EList<ActivityEdge>) eDynamicGet(
-			UMLPackage.ACTIVITY_NODE__INCOMING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_NODE__INCOMING, true, true);
+		return (EList<ActivityEdge>) eDynamicGet(UMLPackage.ACTIVITY_NODE__INCOMING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_NODE__INCOMING, true, true);
 	}
 
 	/**
@@ -406,12 +369,10 @@
 	 */
 	public ActivityEdge getIncoming(String name, boolean ignoreCase,
 			EClass eClass) {
-		incomingLoop : for (ActivityEdge incoming : getIncomings()) {
+		incomingLoop: for (ActivityEdge incoming : getIncomings()) {
 			if (eClass != null && !eClass.isInstance(incoming))
 				continue incomingLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(incoming.getName())
-				: name.equals(incoming.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(incoming.getName()) : name.equals(incoming.getName())))
 				continue incomingLoop;
 			return incoming;
 		}
@@ -425,11 +386,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<InterruptibleActivityRegion> getInInterruptibleRegions() {
-		return (EList<InterruptibleActivityRegion>) eDynamicGet(
-			UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION, true,
-			true);
+		return (EList<InterruptibleActivityRegion>) eDynamicGet(UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION, true, true);
 	}
 
 	/**
@@ -448,10 +405,8 @@
 	 */
 	public InterruptibleActivityRegion getInInterruptibleRegion(String name,
 			boolean ignoreCase) {
-		inInterruptibleRegionLoop : for (InterruptibleActivityRegion inInterruptibleRegion : getInInterruptibleRegions()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(inInterruptibleRegion.getName())
-				: name.equals(inInterruptibleRegion.getName())))
+		inInterruptibleRegionLoop: for (InterruptibleActivityRegion inInterruptibleRegion : getInInterruptibleRegions()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(inInterruptibleRegion.getName()) : name.equals(inInterruptibleRegion.getName())))
 				continue inInterruptibleRegionLoop;
 			return inInterruptibleRegion;
 		}
@@ -465,9 +420,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityNode> getRedefinedNodes() {
-		return (EList<ActivityNode>) eDynamicGet(
-			UMLPackage.ACTIVITY_NODE__REDEFINED_NODE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_NODE__REDEFINED_NODE, true, true);
+		return (EList<ActivityNode>) eDynamicGet(UMLPackage.ACTIVITY_NODE__REDEFINED_NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_NODE__REDEFINED_NODE, true, true);
 	}
 
 	/**
@@ -486,12 +439,10 @@
 	 */
 	public ActivityNode getRedefinedNode(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinedNodeLoop : for (ActivityNode redefinedNode : getRedefinedNodes()) {
+		redefinedNodeLoop: for (ActivityNode redefinedNode : getRedefinedNodes()) {
 			if (eClass != null && !eClass.isInstance(redefinedNode))
 				continue redefinedNodeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinedNode.getName())
-				: name.equals(redefinedNode.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinedNode.getName()) : name.equals(redefinedNode.getName())))
 				continue redefinedNodeLoop;
 			return redefinedNode;
 		}
@@ -508,26 +459,20 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_NODE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetInStructuredNode(
-					(StructuredActivityNode) otherEnd, msgs);
-			case UMLPackage.ACTIVITY_NODE__INCOMING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_NODE__OUTGOING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_NODE__IN_PARTITION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_NODE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetInStructuredNode((StructuredActivityNode) otherEnd, msgs);
+		case UMLPackage.ACTIVITY_NODE__INCOMING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_NODE__OUTGOING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_NODE__IN_PARTITION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -541,28 +486,22 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_NODE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_NODE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_NODE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.ACTIVITY_NODE__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACTIVITY_NODE__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACTIVITY_NODE__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_NODE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_NODE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_NODE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.ACTIVITY_NODE__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_NODE__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_NODE__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -576,10 +515,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE,
-					StructuredActivityNode.class, msgs);
+		case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE, StructuredActivityNode.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -592,58 +529,58 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_NODE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ACTIVITY_NODE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ACTIVITY_NODE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ACTIVITY_NODE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ACTIVITY_NODE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ACTIVITY_NODE__NAME :
-				return getName();
-			case UMLPackage.ACTIVITY_NODE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ACTIVITY_NODE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ACTIVITY_NODE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTIVITY_NODE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ACTIVITY_NODE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.ACTIVITY_NODE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.ACTIVITY_NODE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.ACTIVITY_NODE__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.ACTIVITY_NODE__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.ACTIVITY_NODE__INCOMING :
-				return getIncomings();
-			case UMLPackage.ACTIVITY_NODE__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.ACTIVITY_NODE__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.ACTIVITY_NODE__IN_PARTITION :
-				return getInPartitions();
+		case UMLPackage.ACTIVITY_NODE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ACTIVITY_NODE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ACTIVITY_NODE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ACTIVITY_NODE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ACTIVITY_NODE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ACTIVITY_NODE__NAME:
+			return getName();
+		case UMLPackage.ACTIVITY_NODE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ACTIVITY_NODE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ACTIVITY_NODE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTIVITY_NODE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ACTIVITY_NODE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.ACTIVITY_NODE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.ACTIVITY_NODE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.ACTIVITY_NODE__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.ACTIVITY_NODE__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.ACTIVITY_NODE__INCOMING:
+			return getIncomings();
+		case UMLPackage.ACTIVITY_NODE__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.ACTIVITY_NODE__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.ACTIVITY_NODE__IN_PARTITION:
+			return getInPartitions();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -657,59 +594,52 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_NODE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ACTIVITY_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ACTIVITY_NODE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ACTIVITY_NODE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.ACTIVITY_NODE__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.ACTIVITY_NODE__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_NODE__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
+		case UMLPackage.ACTIVITY_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_NODE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ACTIVITY_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ACTIVITY_NODE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ACTIVITY_NODE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.ACTIVITY_NODE__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.ACTIVITY_NODE__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_NODE__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -722,45 +652,45 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ACTIVITY_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ACTIVITY_NODE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ACTIVITY_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ACTIVITY_NODE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ACTIVITY_NODE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.ACTIVITY_NODE__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.ACTIVITY_NODE__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.ACTIVITY_NODE__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.ACTIVITY_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.ACTIVITY_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				return;
+		case UMLPackage.ACTIVITY_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ACTIVITY_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ACTIVITY_NODE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ACTIVITY_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ACTIVITY_NODE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ACTIVITY_NODE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.ACTIVITY_NODE__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.ACTIVITY_NODE__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.ACTIVITY_NODE__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.ACTIVITY_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.ACTIVITY_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -773,50 +703,48 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_NODE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ACTIVITY_NODE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ACTIVITY_NODE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ACTIVITY_NODE__OWNER :
-				return isSetOwner();
-			case UMLPackage.ACTIVITY_NODE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ACTIVITY_NODE__NAME :
-				return isSetName();
-			case UMLPackage.ACTIVITY_NODE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ACTIVITY_NODE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ACTIVITY_NODE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ACTIVITY_NODE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ACTIVITY_NODE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.ACTIVITY_NODE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.ACTIVITY_NODE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.ACTIVITY_NODE__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.ACTIVITY_NODE__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.ACTIVITY_NODE__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.ACTIVITY_NODE__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.ACTIVITY_NODE__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.ACTIVITY_NODE__IN_PARTITION :
-				return !getInPartitions().isEmpty();
+		case UMLPackage.ACTIVITY_NODE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ACTIVITY_NODE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ACTIVITY_NODE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ACTIVITY_NODE__OWNER:
+			return isSetOwner();
+		case UMLPackage.ACTIVITY_NODE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ACTIVITY_NODE__NAME:
+			return isSetName();
+		case UMLPackage.ACTIVITY_NODE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ACTIVITY_NODE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ACTIVITY_NODE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ACTIVITY_NODE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ACTIVITY_NODE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.ACTIVITY_NODE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.ACTIVITY_NODE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.ACTIVITY_NODE__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.ACTIVITY_NODE__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.ACTIVITY_NODE__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.ACTIVITY_NODE__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.ACTIVITY_NODE__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.ACTIVITY_NODE__IN_PARTITION:
+			return !getInPartitions().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -830,10 +758,10 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == ActivityContent.class) {
 			switch (baseOperationID) {
-				case UMLPackage.ACTIVITY_CONTENT___CONTAINING_ACTIVITY :
-					return UMLPackage.ACTIVITY_NODE___CONTAINING_ACTIVITY;
-				default :
-					return -1;
+			case UMLPackage.ACTIVITY_CONTENT___CONTAINING_ACTIVITY:
+				return UMLPackage.ACTIVITY_NODE___CONTAINING_ACTIVITY;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -849,144 +777,122 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ACTIVITY_NODE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_NODE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ACTIVITY_NODE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ACTIVITY_NODE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ACTIVITY_NODE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ACTIVITY_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___GET_MODEL :
-				return getModel();
-			case UMLPackage.ACTIVITY_NODE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ACTIVITY_NODE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ACTIVITY_NODE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ACTIVITY_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ACTIVITY_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ACTIVITY_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ACTIVITY_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY_NODE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ACTIVITY_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ACTIVITY_NODE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ACTIVITY_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_NODE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ACTIVITY_NODE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ACTIVITY_NODE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ACTIVITY_NODE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ACTIVITY_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ACTIVITY_NODE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTIVITY_NODE___SEPARATOR :
-				return separator();
-			case UMLPackage.ACTIVITY_NODE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ACTIVITY_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_NODE___CONTAINING_ACTIVITY :
-				return containingActivity();
+		case UMLPackage.ACTIVITY_NODE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_NODE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ACTIVITY_NODE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ACTIVITY_NODE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ACTIVITY_NODE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ACTIVITY_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___GET_MODEL:
+			return getModel();
+		case UMLPackage.ACTIVITY_NODE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ACTIVITY_NODE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ACTIVITY_NODE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ACTIVITY_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ACTIVITY_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ACTIVITY_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ACTIVITY_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY_NODE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ACTIVITY_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ACTIVITY_NODE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ACTIVITY_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_NODE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ACTIVITY_NODE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ACTIVITY_NODE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ACTIVITY_NODE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ACTIVITY_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ACTIVITY_NODE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTIVITY_NODE___SEPARATOR:
+			return separator();
+		case UMLPackage.ACTIVITY_NODE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ACTIVITY_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_NODE___CONTAINING_ACTIVITY:
+			return containingActivity();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -999,10 +905,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] IN_GROUP_ESUBSETS = new int[]{
-		UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION,
-		UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE,
-		UMLPackage.ACTIVITY_NODE__IN_PARTITION};
+	protected static final int[] IN_GROUP_ESUBSETS = new int[] { UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION, UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE, UMLPackage.ACTIVITY_NODE__IN_PARTITION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1020,12 +923,10 @@
 	 */
 	public ActivityGroup getInGroup(String name, boolean ignoreCase,
 			EClass eClass) {
-		inGroupLoop : for (ActivityGroup inGroup : getInGroups()) {
+		inGroupLoop: for (ActivityGroup inGroup : getInGroups()) {
 			if (eClass != null && !eClass.isInstance(inGroup))
 				continue inGroupLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(inGroup.getName())
-				: name.equals(inGroup.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(inGroup.getName()) : name.equals(inGroup.getName())))
 				continue inGroupLoop;
 			return inGroup;
 		}
@@ -1040,9 +941,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -1052,8 +951,8 @@
 	 */
 	public boolean isSetInGroups() {
 		return eIsSet(UMLPackage.ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION)
-			|| eIsSet(UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE)
-			|| eIsSet(UMLPackage.ACTIVITY_NODE__IN_PARTITION);
+				|| eIsSet(UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE)
+				|| eIsSet(UMLPackage.ACTIVITY_NODE__IN_PARTITION);
 	}
 
 	/**
@@ -1081,8 +980,9 @@
 	 */
 	@Override
 	public boolean isSetOwner() {
-		return super.isSetOwner() || eIsSet(UMLPackage.ACTIVITY_NODE__ACTIVITY)
-			|| eIsSet(UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE);
+		return super.isSetOwner()
+				|| eIsSet(UMLPackage.ACTIVITY_NODE__ACTIVITY)
+				|| eIsSet(UMLPackage.ACTIVITY_NODE__IN_STRUCTURED_NODE);
 	}
 
 	/**
@@ -1093,8 +993,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.ACTIVITY_NODE__REDEFINED_NODE};
+	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[] { UMLPackage.ACTIVITY_NODE__REDEFINED_NODE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1104,7 +1003,7 @@
 	@Override
 	public boolean isSetRedefinedElements() {
 		return super.isSetRedefinedElements()
-			|| eIsSet(UMLPackage.ACTIVITY_NODE__REDEFINED_NODE);
+				|| eIsSet(UMLPackage.ACTIVITY_NODE__REDEFINED_NODE);
 	}
 
 } //ActivityNodeImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityParameterNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityParameterNodeImpl.java
index a2bf846..7f7ec4a 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityParameterNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityParameterNodeImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,11 +18,17 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+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;
@@ -89,10 +95,7 @@
 	 * @generated
 	 */
 	public Parameter getParameter() {
-		return (Parameter) eDynamicGet(
-			UMLPackage.ACTIVITY_PARAMETER_NODE__PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARAMETER_NODE__PARAMETER, true, true);
+		return (Parameter) eDynamicGet(UMLPackage.ACTIVITY_PARAMETER_NODE__PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARAMETER_NODE__PARAMETER, true, true);
 	}
 
 	/**
@@ -101,11 +104,7 @@
 	 * @generated
 	 */
 	public Parameter basicGetParameter() {
-		return (Parameter) eDynamicGet(
-			UMLPackage.ACTIVITY_PARAMETER_NODE__PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARAMETER_NODE__PARAMETER, false,
-			true);
+		return (Parameter) eDynamicGet(UMLPackage.ACTIVITY_PARAMETER_NODE__PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARAMETER_NODE__PARAMETER, false, true);
 	}
 
 	/**
@@ -114,11 +113,7 @@
 	 * @generated
 	 */
 	public void setParameter(Parameter newParameter) {
-		eDynamicSet(
-			UMLPackage.ACTIVITY_PARAMETER_NODE__PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARAMETER_NODE__PARAMETER,
-			newParameter);
+		eDynamicSet(UMLPackage.ACTIVITY_PARAMETER_NODE__PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARAMETER_NODE__PARAMETER, newParameter);
 	}
 
 	/**
@@ -128,8 +123,7 @@
 	 */
 	public boolean validateHasParameters(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActivityParameterNodeOperations.validateHasParameters(this,
-			diagnostics, context);
+		return ActivityParameterNodeOperations.validateHasParameters(this, diagnostics, context);
 	}
 
 	/**
@@ -139,8 +133,7 @@
 	 */
 	public boolean validateSameType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActivityParameterNodeOperations.validateSameType(this,
-			diagnostics, context);
+		return ActivityParameterNodeOperations.validateSameType(this, diagnostics, context);
 	}
 
 	/**
@@ -150,8 +143,7 @@
 	 */
 	public boolean validateNoEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActivityParameterNodeOperations.validateNoEdges(this,
-			diagnostics, context);
+		return ActivityParameterNodeOperations.validateNoEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -161,8 +153,7 @@
 	 */
 	public boolean validateNoIncomingEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActivityParameterNodeOperations.validateNoIncomingEdges(this,
-			diagnostics, context);
+		return ActivityParameterNodeOperations.validateNoIncomingEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -172,8 +163,7 @@
 	 */
 	public boolean validateNoOutgoingEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActivityParameterNodeOperations.validateNoOutgoingEdges(this,
-			diagnostics, context);
+		return ActivityParameterNodeOperations.validateNoOutgoingEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -184,80 +174,80 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME :
-				return getName();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__INCOMING :
-				return getIncomings();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STATE :
-				return getInStates();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_CONTROL_TYPE :
-				return isControlType();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__ORDERING :
-				return getOrdering();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__SELECTION :
-				if (resolve)
-					return getSelection();
-				return basicGetSelection();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__UPPER_BOUND :
-				if (resolve)
-					return getUpperBound();
-				return basicGetUpperBound();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__PARAMETER :
-				if (resolve)
-					return getParameter();
-				return basicGetParameter();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME:
+			return getName();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__INCOMING:
+			return getIncomings();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STATE:
+			return getInStates();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_CONTROL_TYPE:
+			return isControlType();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__ORDERING:
+			return getOrdering();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__SELECTION:
+			if (resolve)
+				return getSelection();
+			return basicGetSelection();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__UPPER_BOUND:
+			if (resolve)
+				return getUpperBound();
+			return basicGetUpperBound();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__PARAMETER:
+			if (resolve)
+				return getParameter();
+			return basicGetParameter();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -271,81 +261,74 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STATE :
-				getInStates().clear();
-				getInStates().addAll((Collection<? extends State>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_CONTROL_TYPE :
-				setIsControlType((Boolean) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__ORDERING :
-				setOrdering((ObjectNodeOrderingKind) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__SELECTION :
-				setSelection((Behavior) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__UPPER_BOUND :
-				setUpperBound((ValueSpecification) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__PARAMETER :
-				setParameter((Parameter) newValue);
-				return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STATE:
+			getInStates().clear();
+			getInStates().addAll((Collection<? extends State>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_CONTROL_TYPE:
+			setIsControlType((Boolean) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__ORDERING:
+			setOrdering((ObjectNodeOrderingKind) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__SELECTION:
+			setSelection((Behavior) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__UPPER_BOUND:
+			setUpperBound((ValueSpecification) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__PARAMETER:
+			setParameter((Parameter) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -358,66 +341,66 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STATE :
-				getInStates().clear();
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_CONTROL_TYPE :
-				setIsControlType(IS_CONTROL_TYPE_EDEFAULT);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__ORDERING :
-				setOrdering(ORDERING_EDEFAULT);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__SELECTION :
-				setSelection((Behavior) null);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__UPPER_BOUND :
-				setUpperBound((ValueSpecification) null);
-				return;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__PARAMETER :
-				setParameter((Parameter) null);
-				return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STATE:
+			getInStates().clear();
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_CONTROL_TYPE:
+			setIsControlType(IS_CONTROL_TYPE_EDEFAULT);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__ORDERING:
+			setOrdering(ORDERING_EDEFAULT);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__SELECTION:
+			setSelection((Behavior) null);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__UPPER_BOUND:
+			setUpperBound((ValueSpecification) null);
+			return;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__PARAMETER:
+			setParameter((Parameter) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -430,64 +413,62 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNER :
-				return isSetOwner();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME :
-				return isSetName();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STATE :
-				return !getInStates().isEmpty();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_CONTROL_TYPE :
-				return isControlType() != IS_CONTROL_TYPE_EDEFAULT;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__ORDERING :
-				return getOrdering() != ORDERING_EDEFAULT;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__SELECTION :
-				return basicGetSelection() != null;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__UPPER_BOUND :
-				return basicGetUpperBound() != null;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE__PARAMETER :
-				return basicGetParameter() != null;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__OWNER:
+			return isSetOwner();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME:
+			return isSetName();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IN_STATE:
+			return !getInStates().isEmpty();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__IS_CONTROL_TYPE:
+			return isControlType() != IS_CONTROL_TYPE_EDEFAULT;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__ORDERING:
+			return getOrdering() != ORDERING_EDEFAULT;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__SELECTION:
+			return basicGetSelection() != null;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__UPPER_BOUND:
+			return basicGetUpperBound() != null;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE__PARAMETER:
+			return basicGetParameter() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -502,173 +483,138 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_MODEL :
-				return getModel();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___SEPARATOR :
-				return separator();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP :
-				return validateInputOutputParameter(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateSelectionBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateObjectFlowEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_NO_OUTGOING_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateNoOutgoingEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_HAS_PARAMETERS__DIAGNOSTICCHAIN_MAP :
-				return validateHasParameters((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_SAME_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSameType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_NO_INCOMING_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateNoIncomingEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_NO_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateNoEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_MODEL:
+			return getModel();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___SEPARATOR:
+			return separator();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP:
+			return validateInputOutputParameter((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateSelectionBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateObjectFlowEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_NO_OUTGOING_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateNoOutgoingEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_HAS_PARAMETERS__DIAGNOSTICCHAIN_MAP:
+			return validateHasParameters((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_SAME_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSameType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_NO_INCOMING_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateNoIncomingEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARAMETER_NODE___VALIDATE_NO_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateNoEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityPartitionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityPartitionImpl.java
index 6aac432..0c39955 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityPartitionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActivityPartitionImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,8 +29,13 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -128,20 +134,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<ActivityGroup> subgroups = (EList<ActivityGroup>) cache.get(
-				eResource, this, UMLPackage.Literals.ACTIVITY_GROUP__SUBGROUP);
+			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<ActivityGroup>(
-						ActivityGroup.class, this,
-						UMLPackage.ACTIVITY_PARTITION__SUBGROUP,
-						SUBGROUP_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTIVITY_GROUP__SUBGROUP, subgroups = new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class, this, UMLPackage.ACTIVITY_PARTITION__SUBGROUP, SUBGROUP_ESUBSETS));
 			}
 			return subgroups;
 		}
-		return new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class,
-			this, UMLPackage.ACTIVITY_PARTITION__SUBGROUP, SUBGROUP_ESUBSETS);
+		return new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class, this, UMLPackage.ACTIVITY_PARTITION__SUBGROUP, SUBGROUP_ESUBSETS);
 	}
 
 	/**
@@ -155,22 +154,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<ActivityNode> containedNodes = (EList<ActivityNode>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE);
+			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>(
-						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>(ActivityNode.class,
-			this, UMLPackage.ACTIVITY_PARTITION__CONTAINED_NODE,
-			CONTAINED_NODE_ESUBSETS);
+		return new DerivedUnionEObjectEList<ActivityNode>(ActivityNode.class, this, UMLPackage.ACTIVITY_PARTITION__CONTAINED_NODE, CONTAINED_NODE_ESUBSETS);
 	}
 
 	/**
@@ -184,22 +174,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<ActivityEdge> containedEdges = (EList<ActivityEdge>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_EDGE);
+			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>(
-						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>(ActivityEdge.class,
-			this, UMLPackage.ACTIVITY_PARTITION__CONTAINED_EDGE,
-			CONTAINED_EDGE_ESUBSETS);
+		return new DerivedUnionEObjectEList<ActivityEdge>(ActivityEdge.class, this, UMLPackage.ACTIVITY_PARTITION__CONTAINED_EDGE, CONTAINED_EDGE_ESUBSETS);
 	}
 
 	/**
@@ -208,9 +189,7 @@
 	 * @generated
 	 */
 	public boolean isDimension() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.ACTIVITY_PARTITION__IS_DIMENSION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARTITION__IS_DIMENSION, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.ACTIVITY_PARTITION__IS_DIMENSION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARTITION__IS_DIMENSION, true, true);
 	}
 
 	/**
@@ -219,10 +198,7 @@
 	 * @generated
 	 */
 	public void setIsDimension(boolean newIsDimension) {
-		eDynamicSet(
-			UMLPackage.ACTIVITY_PARTITION__IS_DIMENSION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARTITION__IS_DIMENSION,
-			newIsDimension);
+		eDynamicSet(UMLPackage.ACTIVITY_PARTITION__IS_DIMENSION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARTITION__IS_DIMENSION, newIsDimension);
 	}
 
 	/**
@@ -231,9 +207,7 @@
 	 * @generated
 	 */
 	public boolean isExternal() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.ACTIVITY_PARTITION__IS_EXTERNAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARTITION__IS_EXTERNAL, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.ACTIVITY_PARTITION__IS_EXTERNAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARTITION__IS_EXTERNAL, true, true);
 	}
 
 	/**
@@ -242,9 +216,7 @@
 	 * @generated
 	 */
 	public void setIsExternal(boolean newIsExternal) {
-		eDynamicSet(
-			UMLPackage.ACTIVITY_PARTITION__IS_EXTERNAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARTITION__IS_EXTERNAL, newIsExternal);
+		eDynamicSet(UMLPackage.ACTIVITY_PARTITION__IS_EXTERNAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARTITION__IS_EXTERNAL, newIsExternal);
 	}
 
 	/**
@@ -254,9 +226,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityEdge> getEdges() {
-		return (EList<ActivityEdge>) eDynamicGet(
-			UMLPackage.ACTIVITY_PARTITION__EDGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARTITION__EDGE, true, true);
+		return (EList<ActivityEdge>) eDynamicGet(UMLPackage.ACTIVITY_PARTITION__EDGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARTITION__EDGE, true, true);
 	}
 
 	/**
@@ -275,12 +245,10 @@
 	 */
 	public ActivityEdge getEdge(String name, boolean ignoreCase,
 			EClass eClass) {
-		edgeLoop : for (ActivityEdge edge : getEdges()) {
+		edgeLoop: for (ActivityEdge edge : getEdges()) {
 			if (eClass != null && !eClass.isInstance(edge))
 				continue edgeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(edge.getName())
-				: name.equals(edge.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(edge.getName()) : name.equals(edge.getName())))
 				continue edgeLoop;
 			return edge;
 		}
@@ -294,9 +262,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityNode> getNodes() {
-		return (EList<ActivityNode>) eDynamicGet(
-			UMLPackage.ACTIVITY_PARTITION__NODE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARTITION__NODE, true, true);
+		return (EList<ActivityNode>) eDynamicGet(UMLPackage.ACTIVITY_PARTITION__NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARTITION__NODE, true, true);
 	}
 
 	/**
@@ -315,12 +281,10 @@
 	 */
 	public ActivityNode getNode(String name, boolean ignoreCase,
 			EClass eClass) {
-		nodeLoop : for (ActivityNode node : getNodes()) {
+		nodeLoop: for (ActivityNode node : getNodes()) {
 			if (eClass != null && !eClass.isInstance(node))
 				continue nodeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(node.getName())
-				: name.equals(node.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(node.getName()) : name.equals(node.getName())))
 				continue nodeLoop;
 			return node;
 		}
@@ -334,9 +298,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityPartition> getSubpartitions() {
-		return (EList<ActivityPartition>) eDynamicGet(
-			UMLPackage.ACTIVITY_PARTITION__SUBPARTITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARTITION__SUBPARTITION, true, true);
+		return (EList<ActivityPartition>) eDynamicGet(UMLPackage.ACTIVITY_PARTITION__SUBPARTITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARTITION__SUBPARTITION, true, true);
 	}
 
 	/**
@@ -345,8 +307,7 @@
 	 * @generated
 	 */
 	public ActivityPartition createSubpartition(String name) {
-		ActivityPartition newSubpartition = (ActivityPartition) create(
-			UMLPackage.Literals.ACTIVITY_PARTITION);
+		ActivityPartition newSubpartition = (ActivityPartition) create(UMLPackage.Literals.ACTIVITY_PARTITION);
 		getSubpartitions().add(newSubpartition);
 		if (name != null)
 			newSubpartition.setName(name);
@@ -369,16 +330,12 @@
 	 */
 	public ActivityPartition getSubpartition(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		subpartitionLoop : for (ActivityPartition subpartition : getSubpartitions()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(subpartition.getName())
-				: name.equals(subpartition.getName())))
+		subpartitionLoop: for (ActivityPartition subpartition : getSubpartitions()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(subpartition.getName()) : name.equals(subpartition.getName())))
 				continue subpartitionLoop;
 			return subpartition;
 		}
-		return createOnDemand
-			? createSubpartition(name)
-			: null;
+		return createOnDemand ? createSubpartition(name) : null;
 	}
 
 	/**
@@ -387,11 +344,7 @@
 	 * @generated
 	 */
 	public ActivityPartition getSuperPartition() {
-		return (ActivityPartition) eDynamicGet(
-			UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARTITION__SUPER_PARTITION, true,
-			true);
+		return (ActivityPartition) eDynamicGet(UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARTITION__SUPER_PARTITION, true, true);
 	}
 
 	/**
@@ -400,11 +353,7 @@
 	 * @generated
 	 */
 	public ActivityPartition basicGetSuperPartition() {
-		return (ActivityPartition) eDynamicGet(
-			UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARTITION__SUPER_PARTITION, false,
-			true);
+		return (ActivityPartition) eDynamicGet(UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARTITION__SUPER_PARTITION, false, true);
 	}
 
 	/**
@@ -414,8 +363,7 @@
 	 */
 	public NotificationChain basicSetSuperPartition(
 			ActivityPartition newSuperPartition, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newSuperPartition,
-			UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newSuperPartition, UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION, msgs);
 		return msgs;
 	}
 
@@ -425,11 +373,7 @@
 	 * @generated
 	 */
 	public void setSuperPartition(ActivityPartition newSuperPartition) {
-		eDynamicSet(
-			UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARTITION__SUPER_PARTITION,
-			newSuperPartition);
+		eDynamicSet(UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARTITION__SUPER_PARTITION, newSuperPartition);
 	}
 
 	/**
@@ -438,9 +382,7 @@
 	 * @generated
 	 */
 	public Element getRepresents() {
-		return (Element) eDynamicGet(
-			UMLPackage.ACTIVITY_PARTITION__REPRESENTS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARTITION__REPRESENTS, true, true);
+		return (Element) eDynamicGet(UMLPackage.ACTIVITY_PARTITION__REPRESENTS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARTITION__REPRESENTS, true, true);
 	}
 
 	/**
@@ -449,9 +391,7 @@
 	 * @generated
 	 */
 	public Element basicGetRepresents() {
-		return (Element) eDynamicGet(
-			UMLPackage.ACTIVITY_PARTITION__REPRESENTS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARTITION__REPRESENTS, false, true);
+		return (Element) eDynamicGet(UMLPackage.ACTIVITY_PARTITION__REPRESENTS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARTITION__REPRESENTS, false, true);
 	}
 
 	/**
@@ -460,9 +400,7 @@
 	 * @generated
 	 */
 	public void setRepresents(Element newRepresents) {
-		eDynamicSet(
-			UMLPackage.ACTIVITY_PARTITION__REPRESENTS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ACTIVITY_PARTITION__REPRESENTS, newRepresents);
+		eDynamicSet(UMLPackage.ACTIVITY_PARTITION__REPRESENTS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ACTIVITY_PARTITION__REPRESENTS, newRepresents);
 	}
 
 	/**
@@ -472,8 +410,7 @@
 	 */
 	public boolean validateDimensionNotContained(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActivityPartitionOperations.validateDimensionNotContained(this,
-			diagnostics, context);
+		return ActivityPartitionOperations.validateDimensionNotContained(this, diagnostics, context);
 	}
 
 	/**
@@ -483,8 +420,7 @@
 	 */
 	public boolean validateRepresentsClassifier(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActivityPartitionOperations.validateRepresentsClassifier(this,
-			diagnostics, context);
+		return ActivityPartitionOperations.validateRepresentsClassifier(this, diagnostics, context);
 	}
 
 	/**
@@ -494,9 +430,7 @@
 	 */
 	public boolean validateRepresentsPropertyAndIsContained(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return ActivityPartitionOperations
-			.validateRepresentsPropertyAndIsContained(this, diagnostics,
-				context);
+		return ActivityPartitionOperations.validateRepresentsPropertyAndIsContained(this, diagnostics, context);
 	}
 
 	/**
@@ -506,8 +440,7 @@
 	 */
 	public boolean validateRepresentsProperty(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActivityPartitionOperations.validateRepresentsProperty(this,
-			diagnostics, context);
+		return ActivityPartitionOperations.validateRepresentsProperty(this, diagnostics, context);
 	}
 
 	/**
@@ -520,23 +453,18 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_PARTITION__NODE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getNodes())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_PARTITION__SUBPARTITION :
-				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<InternalEObject>) (InternalEList<?>) getEdges())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_PARTITION__NODE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getNodes()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_PARTITION__SUBPARTITION:
+			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<InternalEObject>) (InternalEList<?>) getEdges()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -550,25 +478,20 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_PARTITION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ACTIVITY_PARTITION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ACTIVITY_PARTITION__NODE :
-				return ((InternalEList<?>) getNodes()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ACTIVITY_PARTITION__SUBPARTITION :
-				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);
+		case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_PARTITION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_PARTITION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ACTIVITY_PARTITION__NODE:
+			return ((InternalEList<?>) getNodes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ACTIVITY_PARTITION__SUBPARTITION:
+			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 eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -582,10 +505,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.ACTIVITY_PARTITION__SUBPARTITION,
-					ActivityPartition.class, msgs);
+		case UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.ACTIVITY_PARTITION__SUBPARTITION, ActivityPartition.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -598,64 +519,64 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ACTIVITY_PARTITION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ACTIVITY_PARTITION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ACTIVITY_PARTITION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ACTIVITY_PARTITION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ACTIVITY_PARTITION__NAME :
-				return getName();
-			case UMLPackage.ACTIVITY_PARTITION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ACTIVITY_PARTITION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ACTIVITY_PARTITION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTIVITY_PARTITION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ACTIVITY_PARTITION__CONTAINED_EDGE :
-				return getContainedEdges();
-			case UMLPackage.ACTIVITY_PARTITION__CONTAINED_NODE :
-				return getContainedNodes();
-			case UMLPackage.ACTIVITY_PARTITION__IN_ACTIVITY :
-				if (resolve)
-					return getInActivity();
-				return basicGetInActivity();
-			case UMLPackage.ACTIVITY_PARTITION__SUBGROUP :
-				return getSubgroups();
-			case UMLPackage.ACTIVITY_PARTITION__SUPER_GROUP :
-				if (resolve)
-					return getSuperGroup();
-				return basicGetSuperGroup();
-			case UMLPackage.ACTIVITY_PARTITION__IS_DIMENSION :
-				return isDimension();
-			case UMLPackage.ACTIVITY_PARTITION__IS_EXTERNAL :
-				return isExternal();
-			case UMLPackage.ACTIVITY_PARTITION__NODE :
-				return getNodes();
-			case UMLPackage.ACTIVITY_PARTITION__REPRESENTS :
-				if (resolve)
-					return getRepresents();
-				return basicGetRepresents();
-			case UMLPackage.ACTIVITY_PARTITION__SUBPARTITION :
-				return getSubpartitions();
-			case UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION :
-				if (resolve)
-					return getSuperPartition();
-				return basicGetSuperPartition();
-			case UMLPackage.ACTIVITY_PARTITION__EDGE :
-				return getEdges();
+		case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ACTIVITY_PARTITION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ACTIVITY_PARTITION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ACTIVITY_PARTITION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ACTIVITY_PARTITION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ACTIVITY_PARTITION__NAME:
+			return getName();
+		case UMLPackage.ACTIVITY_PARTITION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ACTIVITY_PARTITION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ACTIVITY_PARTITION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTIVITY_PARTITION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ACTIVITY_PARTITION__CONTAINED_EDGE:
+			return getContainedEdges();
+		case UMLPackage.ACTIVITY_PARTITION__CONTAINED_NODE:
+			return getContainedNodes();
+		case UMLPackage.ACTIVITY_PARTITION__IN_ACTIVITY:
+			if (resolve)
+				return getInActivity();
+			return basicGetInActivity();
+		case UMLPackage.ACTIVITY_PARTITION__SUBGROUP:
+			return getSubgroups();
+		case UMLPackage.ACTIVITY_PARTITION__SUPER_GROUP:
+			if (resolve)
+				return getSuperGroup();
+			return basicGetSuperGroup();
+		case UMLPackage.ACTIVITY_PARTITION__IS_DIMENSION:
+			return isDimension();
+		case UMLPackage.ACTIVITY_PARTITION__IS_EXTERNAL:
+			return isExternal();
+		case UMLPackage.ACTIVITY_PARTITION__NODE:
+			return getNodes();
+		case UMLPackage.ACTIVITY_PARTITION__REPRESENTS:
+			if (resolve)
+				return getRepresents();
+			return basicGetRepresents();
+		case UMLPackage.ACTIVITY_PARTITION__SUBPARTITION:
+			return getSubpartitions();
+		case UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION:
+			if (resolve)
+				return getSuperPartition();
+			return basicGetSuperPartition();
+		case UMLPackage.ACTIVITY_PARTITION__EDGE:
+			return getEdges();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -669,55 +590,50 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__IN_ACTIVITY :
-				setInActivity((Activity) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__IS_DIMENSION :
-				setIsDimension((Boolean) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__IS_EXTERNAL :
-				setIsExternal((Boolean) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__NODE :
-				getNodes().clear();
-				getNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__REPRESENTS :
-				setRepresents((Element) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__SUBPARTITION :
-				getSubpartitions().clear();
-				getSubpartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION :
-				setSuperPartition((ActivityPartition) newValue);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__EDGE :
-				getEdges().clear();
-				getEdges()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
+		case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__IN_ACTIVITY:
+			setInActivity((Activity) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__IS_DIMENSION:
+			setIsDimension((Boolean) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__IS_EXTERNAL:
+			setIsExternal((Boolean) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__NODE:
+			getNodes().clear();
+			getNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__REPRESENTS:
+			setRepresents((Element) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__SUBPARTITION:
+			getSubpartitions().clear();
+			getSubpartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION:
+			setSuperPartition((ActivityPartition) newValue);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__EDGE:
+			getEdges().clear();
+			getEdges().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -730,45 +646,45 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__IN_ACTIVITY :
-				setInActivity((Activity) null);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__IS_DIMENSION :
-				setIsDimension(IS_DIMENSION_EDEFAULT);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__IS_EXTERNAL :
-				setIsExternal(IS_EXTERNAL_EDEFAULT);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__NODE :
-				getNodes().clear();
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__REPRESENTS :
-				setRepresents((Element) null);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__SUBPARTITION :
-				getSubpartitions().clear();
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION :
-				setSuperPartition((ActivityPartition) null);
-				return;
-			case UMLPackage.ACTIVITY_PARTITION__EDGE :
-				getEdges().clear();
-				return;
+		case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__IN_ACTIVITY:
+			setInActivity((Activity) null);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__IS_DIMENSION:
+			setIsDimension(IS_DIMENSION_EDEFAULT);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__IS_EXTERNAL:
+			setIsExternal(IS_EXTERNAL_EDEFAULT);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__NODE:
+			getNodes().clear();
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__REPRESENTS:
+			setRepresents((Element) null);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__SUBPARTITION:
+			getSubpartitions().clear();
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION:
+			setSuperPartition((ActivityPartition) null);
+			return;
+		case UMLPackage.ACTIVITY_PARTITION__EDGE:
+			getEdges().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -781,52 +697,50 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ACTIVITY_PARTITION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ACTIVITY_PARTITION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ACTIVITY_PARTITION__OWNER :
-				return isSetOwner();
-			case UMLPackage.ACTIVITY_PARTITION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ACTIVITY_PARTITION__NAME :
-				return isSetName();
-			case UMLPackage.ACTIVITY_PARTITION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ACTIVITY_PARTITION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ACTIVITY_PARTITION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ACTIVITY_PARTITION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ACTIVITY_PARTITION__CONTAINED_EDGE :
-				return isSetContainedEdges();
-			case UMLPackage.ACTIVITY_PARTITION__CONTAINED_NODE :
-				return isSetContainedNodes();
-			case UMLPackage.ACTIVITY_PARTITION__IN_ACTIVITY :
-				return basicGetInActivity() != null;
-			case UMLPackage.ACTIVITY_PARTITION__SUBGROUP :
-				return isSetSubgroups();
-			case UMLPackage.ACTIVITY_PARTITION__SUPER_GROUP :
-				return isSetSuperGroup();
-			case UMLPackage.ACTIVITY_PARTITION__IS_DIMENSION :
-				return isDimension() != IS_DIMENSION_EDEFAULT;
-			case UMLPackage.ACTIVITY_PARTITION__IS_EXTERNAL :
-				return isExternal() != IS_EXTERNAL_EDEFAULT;
-			case UMLPackage.ACTIVITY_PARTITION__NODE :
-				return !getNodes().isEmpty();
-			case UMLPackage.ACTIVITY_PARTITION__REPRESENTS :
-				return basicGetRepresents() != null;
-			case UMLPackage.ACTIVITY_PARTITION__SUBPARTITION :
-				return !getSubpartitions().isEmpty();
-			case UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION :
-				return basicGetSuperPartition() != null;
-			case UMLPackage.ACTIVITY_PARTITION__EDGE :
-				return !getEdges().isEmpty();
+		case UMLPackage.ACTIVITY_PARTITION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ACTIVITY_PARTITION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ACTIVITY_PARTITION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ACTIVITY_PARTITION__OWNER:
+			return isSetOwner();
+		case UMLPackage.ACTIVITY_PARTITION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ACTIVITY_PARTITION__NAME:
+			return isSetName();
+		case UMLPackage.ACTIVITY_PARTITION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ACTIVITY_PARTITION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ACTIVITY_PARTITION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ACTIVITY_PARTITION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ACTIVITY_PARTITION__CONTAINED_EDGE:
+			return isSetContainedEdges();
+		case UMLPackage.ACTIVITY_PARTITION__CONTAINED_NODE:
+			return isSetContainedNodes();
+		case UMLPackage.ACTIVITY_PARTITION__IN_ACTIVITY:
+			return basicGetInActivity() != null;
+		case UMLPackage.ACTIVITY_PARTITION__SUBGROUP:
+			return isSetSubgroups();
+		case UMLPackage.ACTIVITY_PARTITION__SUPER_GROUP:
+			return isSetSuperGroup();
+		case UMLPackage.ACTIVITY_PARTITION__IS_DIMENSION:
+			return isDimension() != IS_DIMENSION_EDEFAULT;
+		case UMLPackage.ACTIVITY_PARTITION__IS_EXTERNAL:
+			return isExternal() != IS_EXTERNAL_EDEFAULT;
+		case UMLPackage.ACTIVITY_PARTITION__NODE:
+			return !getNodes().isEmpty();
+		case UMLPackage.ACTIVITY_PARTITION__REPRESENTS:
+			return basicGetRepresents() != null;
+		case UMLPackage.ACTIVITY_PARTITION__SUBPARTITION:
+			return !getSubpartitions().isEmpty();
+		case UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION:
+			return basicGetSuperPartition() != null;
+		case UMLPackage.ACTIVITY_PARTITION__EDGE:
+			return !getEdges().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -841,149 +755,124 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ACTIVITY_PARTITION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARTITION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARTITION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ACTIVITY_PARTITION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ACTIVITY_PARTITION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ACTIVITY_PARTITION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ACTIVITY_PARTITION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARTITION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___GET_MODEL :
-				return getModel();
-			case UMLPackage.ACTIVITY_PARTITION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ACTIVITY_PARTITION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ACTIVITY_PARTITION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ACTIVITY_PARTITION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ACTIVITY_PARTITION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ACTIVITY_PARTITION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ACTIVITY_PARTITION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARTITION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARTITION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ACTIVITY_PARTITION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ACTIVITY_PARTITION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ACTIVITY_PARTITION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARTITION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARTITION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARTITION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ACTIVITY_PARTITION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ACTIVITY_PARTITION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ACTIVITY_PARTITION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ACTIVITY_PARTITION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ACTIVITY_PARTITION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARTITION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTIVITY_PARTITION___SEPARATOR :
-				return separator();
-			case UMLPackage.ACTIVITY_PARTITION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ACTIVITY_PARTITION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.ACTIVITY_PARTITION___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateNodesAndEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARTITION___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP :
-				return validateNotContained((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARTITION___VALIDATE_REPRESENTS_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateRepresentsClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARTITION___VALIDATE_REPRESENTS_PROPERTY_AND_IS_CONTAINED__DIAGNOSTICCHAIN_MAP :
-				return validateRepresentsPropertyAndIsContained(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARTITION___VALIDATE_REPRESENTS_PROPERTY__DIAGNOSTICCHAIN_MAP :
-				return validateRepresentsProperty(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTIVITY_PARTITION___VALIDATE_DIMENSION_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP :
-				return validateDimensionNotContained(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARTITION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARTITION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARTITION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ACTIVITY_PARTITION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ACTIVITY_PARTITION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ACTIVITY_PARTITION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ACTIVITY_PARTITION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARTITION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___GET_MODEL:
+			return getModel();
+		case UMLPackage.ACTIVITY_PARTITION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ACTIVITY_PARTITION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ACTIVITY_PARTITION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ACTIVITY_PARTITION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ACTIVITY_PARTITION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ACTIVITY_PARTITION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ACTIVITY_PARTITION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARTITION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARTITION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ACTIVITY_PARTITION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ACTIVITY_PARTITION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ACTIVITY_PARTITION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARTITION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARTITION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARTITION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ACTIVITY_PARTITION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ACTIVITY_PARTITION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ACTIVITY_PARTITION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ACTIVITY_PARTITION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ACTIVITY_PARTITION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARTITION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTIVITY_PARTITION___SEPARATOR:
+			return separator();
+		case UMLPackage.ACTIVITY_PARTITION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ACTIVITY_PARTITION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.ACTIVITY_PARTITION___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateNodesAndEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARTITION___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP:
+			return validateNotContained((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARTITION___VALIDATE_REPRESENTS_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateRepresentsClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARTITION___VALIDATE_REPRESENTS_PROPERTY_AND_IS_CONTAINED__DIAGNOSTICCHAIN_MAP:
+			return validateRepresentsPropertyAndIsContained((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARTITION___VALIDATE_REPRESENTS_PROPERTY__DIAGNOSTICCHAIN_MAP:
+			return validateRepresentsProperty((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTIVITY_PARTITION___VALIDATE_DIMENSION_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP:
+			return validateDimensionNotContained((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -996,7 +885,7 @@
 	@Override
 	public boolean isSetSubgroups() {
 		return super.isSetSubgroups()
-			|| eIsSet(UMLPackage.ACTIVITY_PARTITION__SUBPARTITION);
+				|| eIsSet(UMLPackage.ACTIVITY_PARTITION__SUBPARTITION);
 	}
 
 	/**
@@ -1021,9 +910,7 @@
 	@Override
 	public ActivityGroup getSuperGroup() {
 		ActivityGroup superGroup = basicGetSuperGroup();
-		return superGroup != null && superGroup.eIsProxy()
-			? (ActivityGroup) eResolveProxy((InternalEObject) superGroup)
-			: superGroup;
+		return superGroup != null && superGroup.eIsProxy() ? (ActivityGroup) eResolveProxy((InternalEObject) superGroup) : superGroup;
 	}
 
 	/**
@@ -1034,7 +921,7 @@
 	@Override
 	public boolean isSetSuperGroup() {
 		return super.isSetSuperGroup()
-			|| eIsSet(UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION);
+				|| eIsSet(UMLPackage.ACTIVITY_PARTITION__SUPER_PARTITION);
 	}
 
 	/**
@@ -1045,8 +932,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] CONTAINED_NODE_ESUBSETS = new int[]{
-		UMLPackage.ACTIVITY_PARTITION__NODE};
+	protected static final int[] CONTAINED_NODE_ESUBSETS = new int[] { UMLPackage.ACTIVITY_PARTITION__NODE };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getSubgroups() <em>Subgroup</em>}' reference list.
@@ -1056,8 +942,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SUBGROUP_ESUBSETS = new int[]{
-		UMLPackage.ACTIVITY_PARTITION__SUBPARTITION};
+	protected static final int[] SUBGROUP_ESUBSETS = new int[] { UMLPackage.ACTIVITY_PARTITION__SUBPARTITION };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getContainedEdges() <em>Contained Edge</em>}' reference list.
@@ -1067,8 +952,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] CONTAINED_EDGE_ESUBSETS = new int[]{
-		UMLPackage.ACTIVITY_PARTITION__EDGE};
+	protected static final int[] CONTAINED_EDGE_ESUBSETS = new int[] { UMLPackage.ACTIVITY_PARTITION__EDGE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1078,7 +962,7 @@
 	@Override
 	public boolean isSetContainedNodes() {
 		return super.isSetContainedNodes()
-			|| eIsSet(UMLPackage.ACTIVITY_PARTITION__NODE);
+				|| eIsSet(UMLPackage.ACTIVITY_PARTITION__NODE);
 	}
 
 	/**
@@ -1089,7 +973,7 @@
 	@Override
 	public boolean isSetContainedEdges() {
 		return super.isSetContainedEdges()
-			|| eIsSet(UMLPackage.ACTIVITY_PARTITION__EDGE);
+				|| eIsSet(UMLPackage.ACTIVITY_PARTITION__EDGE);
 	}
 
 } //ActivityPartitionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActorImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActorImpl.java
index 71220fc..1d8a238 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActorImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ActorImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -96,285 +96,227 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ACTOR___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTOR___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ACTOR___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTOR___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ACTOR___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ACTOR___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ACTOR___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ACTOR___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ACTOR___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ACTOR___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ACTOR___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTOR___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ACTOR___GET_MODEL :
-				return getModel();
-			case UMLPackage.ACTOR___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ACTOR___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ACTOR___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ACTOR___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ACTOR___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ACTOR___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ACTOR___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTOR___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ACTOR___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ACTOR___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ACTOR___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ACTOR___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTOR___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ACTOR___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ACTOR___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ACTOR___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ACTOR___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ACTOR___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ACTOR___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ACTOR___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ACTOR___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ACTOR___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ACTOR___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ACTOR___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ACTOR___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ACTOR___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ACTOR___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ACTOR___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ACTOR___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ACTOR___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ACTOR___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ACTOR___SEPARATOR :
-				return separator();
-			case UMLPackage.ACTOR___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ACTOR___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.ACTOR___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.ACTOR___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.ACTOR___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.ACTOR___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.ACTOR___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.ACTOR___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.ACTOR___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.ACTOR___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.ACTOR___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.ACTOR___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.ACTOR___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.ACTOR___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.ACTOR___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.ACTOR___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.ACTOR___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.ACTOR___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.ACTOR___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.ACTOR___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.ACTOR___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.ACTOR___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.ACTOR___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.ACTOR___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.ACTOR___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.ACTOR___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.ACTOR___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.ACTOR___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.ACTOR___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.ACTOR___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.ACTOR___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.ACTOR___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.ACTOR___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.ACTOR___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.ACTOR___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.ACTOR___PARENTS :
-				return parents();
-			case UMLPackage.ACTOR___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.ACTOR___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.ACTOR___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.ACTOR___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.ACTOR___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.ACTOR___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.ACTOR___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.ACTOR___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateClassBehavior((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___GET_ALL_IMPLEMENTED_INTERFACES :
-				return getAllImplementedInterfaces();
-			case UMLPackage.ACTOR___GET_IMPLEMENTED_INTERFACES :
-				return getImplementedInterfaces();
-			case UMLPackage.ACTOR___VALIDATE_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP :
-				return validateAssociations((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ACTOR___VALIDATE_MUST_HAVE_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateMustHaveName((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTOR___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ACTOR___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTOR___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ACTOR___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ACTOR___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ACTOR___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ACTOR___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ACTOR___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ACTOR___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ACTOR___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTOR___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ACTOR___GET_MODEL:
+			return getModel();
+		case UMLPackage.ACTOR___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ACTOR___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ACTOR___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTOR___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ACTOR___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ACTOR___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ACTOR___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTOR___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ACTOR___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ACTOR___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ACTOR___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ACTOR___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTOR___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ACTOR___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ACTOR___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ACTOR___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ACTOR___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ACTOR___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ACTOR___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ACTOR___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ACTOR___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ACTOR___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ACTOR___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ACTOR___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ACTOR___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ACTOR___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ACTOR___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ACTOR___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ACTOR___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ACTOR___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ACTOR___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ACTOR___SEPARATOR:
+			return separator();
+		case UMLPackage.ACTOR___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ACTOR___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.ACTOR___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.ACTOR___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.ACTOR___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.ACTOR___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.ACTOR___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.ACTOR___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.ACTOR___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.ACTOR___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.ACTOR___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.ACTOR___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACTOR___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.ACTOR___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.ACTOR___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.ACTOR___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.ACTOR___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.ACTOR___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.ACTOR___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.ACTOR___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.ACTOR___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.ACTOR___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.ACTOR___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.ACTOR___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.ACTOR___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.ACTOR___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.ACTOR___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.ACTOR___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.ACTOR___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.ACTOR___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.ACTOR___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.ACTOR___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.ACTOR___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.ACTOR___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.ACTOR___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.ACTOR___PARENTS:
+			return parents();
+		case UMLPackage.ACTOR___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.ACTOR___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.ACTOR___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.ACTOR___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.ACTOR___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.ACTOR___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.ACTOR___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.ACTOR___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateClassBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___GET_ALL_IMPLEMENTED_INTERFACES:
+			return getAllImplementedInterfaces();
+		case UMLPackage.ACTOR___GET_IMPLEMENTED_INTERFACES:
+			return getImplementedInterfaces();
+		case UMLPackage.ACTOR___VALIDATE_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP:
+			return validateAssociations((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ACTOR___VALIDATE_MUST_HAVE_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateMustHaveName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AddStructuralFeatureValueActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AddStructuralFeatureValueActionImpl.java
index 5449bcf..69a2093 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AddStructuralFeatureValueActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AddStructuralFeatureValueActionImpl.java
@@ -1,14 +1,14 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,6 +29,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -118,20 +121,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT,
-			INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -140,11 +136,7 @@
 	 * @generated
 	 */
 	public boolean isReplaceAll() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL,
-			true, true);
+		return (Boolean) eDynamicGet(UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL, true, true);
 	}
 
 	/**
@@ -153,11 +145,7 @@
 	 * @generated
 	 */
 	public void setIsReplaceAll(boolean newIsReplaceAll) {
-		eDynamicSet(
-			UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL,
-			newIsReplaceAll);
+		eDynamicSet(UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL, newIsReplaceAll);
 	}
 
 	/**
@@ -167,8 +155,7 @@
 	 */
 	public boolean validateRequiredValue(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AddStructuralFeatureValueActionOperations
-			.validateRequiredValue(this, diagnostics, context);
+		return AddStructuralFeatureValueActionOperations.validateRequiredValue(this, diagnostics, context);
 	}
 
 	/**
@@ -178,8 +165,7 @@
 	 */
 	public boolean validateInsertAtPin(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AddStructuralFeatureValueActionOperations
-			.validateInsertAtPin(this, diagnostics, context);
+		return AddStructuralFeatureValueActionOperations.validateInsertAtPin(this, diagnostics, context);
 	}
 
 	/**
@@ -188,11 +174,7 @@
 	 * @generated
 	 */
 	public InputPin getInsertAt() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT,
-			true, true);
+		return (InputPin) eDynamicGet(UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT, true, true);
 	}
 
 	/**
@@ -201,11 +183,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetInsertAt() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT,
-			false, true);
+		return (InputPin) eDynamicGet(UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT, false, true);
 	}
 
 	/**
@@ -215,8 +193,7 @@
 	 */
 	public NotificationChain basicSetInsertAt(InputPin newInsertAt,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newInsertAt,
-			UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newInsertAt, UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT, msgs);
 		return msgs;
 	}
 
@@ -226,11 +203,7 @@
 	 * @generated
 	 */
 	public void setInsertAt(InputPin newInsertAt) {
-		eDynamicSet(
-			UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT,
-			newInsertAt);
+		eDynamicSet(UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT, newInsertAt);
 	}
 
 	/**
@@ -266,45 +239,36 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT :
-				return basicSetObject(null, msgs);
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT :
-				return basicSetResult(null, msgs);
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE :
-				return basicSetValue(null, msgs);
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT :
-				return basicSetInsertAt(null, msgs);
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT:
+			return basicSetObject(null, msgs);
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT:
+			return basicSetResult(null, msgs);
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE:
+			return basicSetValue(null, msgs);
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT:
+			return basicSetInsertAt(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -317,96 +281,96 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME :
-				return getName();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT :
-				if (resolve)
-					return getObject();
-				return basicGetObject();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE :
-				if (resolve)
-					return getStructuralFeature();
-				return basicGetStructuralFeature();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE :
-				if (resolve)
-					return getValue();
-				return basicGetValue();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT :
-				if (resolve)
-					return getInsertAt();
-				return basicGetInsertAt();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL :
-				return isReplaceAll();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME:
+			return getName();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT:
+			if (resolve)
+				return getObject();
+			return basicGetObject();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE:
+			if (resolve)
+				return getStructuralFeature();
+			return basicGetStructuralFeature();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE:
+			if (resolve)
+				return getValue();
+			return basicGetValue();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT:
+			if (resolve)
+				return getInsertAt();
+			return basicGetInsertAt();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL:
+			return isReplaceAll();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -420,95 +384,85 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT :
-				setObject((InputPin) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE :
-				setStructuralFeature((StructuralFeature) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE :
-				setValue((InputPin) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT :
-				setInsertAt((InputPin) newValue);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL :
-				setIsReplaceAll((Boolean) newValue);
-				return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT:
+			setObject((InputPin) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE:
+			setStructuralFeature((StructuralFeature) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE:
+			setValue((InputPin) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT:
+			setInsertAt((InputPin) newValue);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL:
+			setIsReplaceAll((Boolean) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -521,75 +475,75 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT :
-				setObject((InputPin) null);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE :
-				setStructuralFeature((StructuralFeature) null);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE :
-				setValue((InputPin) null);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT :
-				setInsertAt((InputPin) null);
-				return;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL :
-				setIsReplaceAll(IS_REPLACE_ALL_EDEFAULT);
-				return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT:
+			setObject((InputPin) null);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE:
+			setStructuralFeature((StructuralFeature) null);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE:
+			setValue((InputPin) null);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT:
+			setInsertAt((InputPin) null);
+			return;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL:
+			setIsReplaceAll(IS_REPLACE_ALL_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -602,76 +556,74 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT :
-				return basicGetObject() != null;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE :
-				return basicGetStructuralFeature() != null;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT :
-				return basicGetResult() != null;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE :
-				return basicGetValue() != null;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT :
-				return basicGetInsertAt() != null;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL :
-				return isReplaceAll() != IS_REPLACE_ALL_EDEFAULT;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT:
+			return basicGetObject() != null;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE:
+			return basicGetStructuralFeature() != null;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT:
+			return basicGetResult() != null;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE:
+			return basicGetValue() != null;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT:
+			return basicGetInsertAt() != null;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REPLACE_ALL:
+			return isReplaceAll() != IS_REPLACE_ALL_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -686,188 +638,152 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_OBJECT_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateObjectType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateVisibility((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP :
-				return validateNotStatic((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_ONE_FEATURING_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateOneFeaturingClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_MULTIPLICITY_OF_RESULT__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfResult(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_TYPE_OF_VALUE__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfValue((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_MULTIPLICITY_OF_VALUE__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfValue(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_TYPE_OF_RESULT__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfResult((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_REQUIRED_VALUE__DIAGNOSTICCHAIN_MAP :
-				return validateRequiredValue((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_INSERT_AT_PIN__DIAGNOSTICCHAIN_MAP :
-				return validateInsertAtPin((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_OBJECT_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateObjectType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP:
+			return validateNotStatic((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_ONE_FEATURING_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateOneFeaturingClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_MULTIPLICITY_OF_RESULT__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfResult((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_TYPE_OF_VALUE__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfValue((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_MULTIPLICITY_OF_VALUE__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfValue((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_TYPE_OF_RESULT__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfResult((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_REQUIRED_VALUE__DIAGNOSTICCHAIN_MAP:
+			return validateRequiredValue((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_INSERT_AT_PIN__DIAGNOSTICCHAIN_MAP:
+			return validateInsertAtPin((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -880,10 +796,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT,
-		UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE,
-		UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT, UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE, UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -892,8 +805,8 @@
 	 */
 	@Override
 	public boolean isSetInputs() {
-		return super.isSetInputs() || eIsSet(
-			UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT);
+		return super.isSetInputs()
+				|| eIsSet(UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION__INSERT_AT);
 	}
 
 } //AddStructuralFeatureValueActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AddVariableValueActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AddVariableValueActionImpl.java
index 1dfeaf5..2ca79d8 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AddVariableValueActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AddVariableValueActionImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,6 +29,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -117,19 +120,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.ADD_VARIABLE_VALUE_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.ADD_VARIABLE_VALUE_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.ADD_VARIABLE_VALUE_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.ADD_VARIABLE_VALUE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -138,11 +135,7 @@
 	 * @generated
 	 */
 	public boolean isReplaceAll() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL, true,
-			true);
+		return (Boolean) eDynamicGet(UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL, true, true);
 	}
 
 	/**
@@ -151,11 +144,7 @@
 	 * @generated
 	 */
 	public void setIsReplaceAll(boolean newIsReplaceAll) {
-		eDynamicSet(
-			UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL,
-			newIsReplaceAll);
+		eDynamicSet(UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL, newIsReplaceAll);
 	}
 
 	/**
@@ -165,8 +154,7 @@
 	 */
 	public boolean validateRequiredValue(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AddVariableValueActionOperations.validateRequiredValue(this,
-			diagnostics, context);
+		return AddVariableValueActionOperations.validateRequiredValue(this, diagnostics, context);
 	}
 
 	/**
@@ -176,8 +164,7 @@
 	 */
 	public boolean validateInsertAtPin(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AddVariableValueActionOperations.validateInsertAtPin(this,
-			diagnostics, context);
+		return AddVariableValueActionOperations.validateInsertAtPin(this, diagnostics, context);
 	}
 
 	/**
@@ -186,11 +173,7 @@
 	 * @generated
 	 */
 	public InputPin getInsertAt() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ADD_VARIABLE_VALUE_ACTION__INSERT_AT, true,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ADD_VARIABLE_VALUE_ACTION__INSERT_AT, true, true);
 	}
 
 	/**
@@ -199,11 +182,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetInsertAt() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ADD_VARIABLE_VALUE_ACTION__INSERT_AT, false,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ADD_VARIABLE_VALUE_ACTION__INSERT_AT, false, true);
 	}
 
 	/**
@@ -213,8 +192,7 @@
 	 */
 	public NotificationChain basicSetInsertAt(InputPin newInsertAt,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newInsertAt,
-			UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newInsertAt, UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT, msgs);
 		return msgs;
 	}
 
@@ -224,11 +202,7 @@
 	 * @generated
 	 */
 	public void setInsertAt(InputPin newInsertAt) {
-		eDynamicSet(
-			UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ADD_VARIABLE_VALUE_ACTION__INSERT_AT,
-			newInsertAt);
+		eDynamicSet(UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ADD_VARIABLE_VALUE_ACTION__INSERT_AT, newInsertAt);
 	}
 
 	/**
@@ -264,41 +238,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VALUE :
-				return basicSetValue(null, msgs);
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT :
-				return basicSetInsertAt(null, msgs);
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VALUE:
+			return basicSetValue(null, msgs);
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT:
+			return basicSetInsertAt(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -311,88 +276,88 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME :
-				return getName();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VARIABLE :
-				if (resolve)
-					return getVariable();
-				return basicGetVariable();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VALUE :
-				if (resolve)
-					return getValue();
-				return basicGetValue();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT :
-				if (resolve)
-					return getInsertAt();
-				return basicGetInsertAt();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL :
-				return isReplaceAll();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME:
+			return getName();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VARIABLE:
+			if (resolve)
+				return getVariable();
+			return basicGetVariable();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VALUE:
+			if (resolve)
+				return getValue();
+			return basicGetValue();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT:
+			if (resolve)
+				return getInsertAt();
+			return basicGetInsertAt();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL:
+			return isReplaceAll();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -406,89 +371,79 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VARIABLE :
-				setVariable((Variable) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VALUE :
-				setValue((InputPin) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT :
-				setInsertAt((InputPin) newValue);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL :
-				setIsReplaceAll((Boolean) newValue);
-				return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VARIABLE:
+			setVariable((Variable) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VALUE:
+			setValue((InputPin) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT:
+			setInsertAt((InputPin) newValue);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL:
+			setIsReplaceAll((Boolean) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -501,69 +456,69 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VARIABLE :
-				setVariable((Variable) null);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VALUE :
-				setValue((InputPin) null);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT :
-				setInsertAt((InputPin) null);
-				return;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL :
-				setIsReplaceAll(IS_REPLACE_ALL_EDEFAULT);
-				return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VARIABLE:
+			setVariable((Variable) null);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VALUE:
+			setValue((InputPin) null);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT:
+			setInsertAt((InputPin) null);
+			return;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL:
+			setIsReplaceAll(IS_REPLACE_ALL_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -576,72 +531,70 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VARIABLE :
-				return basicGetVariable() != null;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VALUE :
-				return basicGetValue() != null;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT :
-				return basicGetInsertAt() != null;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL :
-				return isReplaceAll() != IS_REPLACE_ALL_EDEFAULT;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VARIABLE:
+			return basicGetVariable() != null;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__VALUE:
+			return basicGetValue() != null;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT:
+			return basicGetInsertAt() != null;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION__IS_REPLACE_ALL:
+			return isReplaceAll() != IS_REPLACE_ALL_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -656,168 +609,140 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_SCOPE_OF_VARIABLE__DIAGNOSTICCHAIN_MAP :
-				return validateScopeOfVariable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_VALUE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateValueType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_REQUIRED_VALUE__DIAGNOSTICCHAIN_MAP :
-				return validateRequiredValue((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_INSERT_AT_PIN__DIAGNOSTICCHAIN_MAP :
-				return validateInsertAtPin((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_SCOPE_OF_VARIABLE__DIAGNOSTICCHAIN_MAP:
+			return validateScopeOfVariable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_VALUE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateValueType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_REQUIRED_VALUE__DIAGNOSTICCHAIN_MAP:
+			return validateRequiredValue((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION___VALIDATE_INSERT_AT_PIN__DIAGNOSTICCHAIN_MAP:
+			return validateInsertAtPin((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -830,9 +755,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.ADD_VARIABLE_VALUE_ACTION__VALUE,
-		UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.ADD_VARIABLE_VALUE_ACTION__VALUE, UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -842,7 +765,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT);
+				|| eIsSet(UMLPackage.ADD_VARIABLE_VALUE_ACTION__INSERT_AT);
 	}
 
 } //AddVariableValueActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AnyReceiveEventImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AnyReceiveEventImpl.java
index 430b9a6..37f74a6 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AnyReceiveEventImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AnyReceiveEventImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ArtifactImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ArtifactImpl.java
index 3ee5f72..185d9eb 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ArtifactImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ArtifactImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -26,8 +27,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -132,20 +136,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.ARTIFACT__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.ARTIFACT__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.ARTIFACT__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.ARTIFACT__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -159,19 +156,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.ARTIFACT__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ARTIFACT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.ARTIFACT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ARTIFACT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -185,19 +176,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Feature> features = (EList<Feature>) cache.get(eResource,
-				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
+			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>(
-						Feature.class, this, UMLPackage.ARTIFACT__FEATURE,
-						FEATURE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.CLASSIFIER__FEATURE, features = new DerivedUnionEObjectEList<Feature>(Feature.class, this, UMLPackage.ARTIFACT__FEATURE, FEATURE_ESUBSETS));
 			}
 			return features;
 		}
-		return new DerivedUnionEObjectEList<Feature>(Feature.class, this,
-			UMLPackage.ARTIFACT__FEATURE, FEATURE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this, UMLPackage.ARTIFACT__FEATURE, FEATURE_ESUBSETS);
 	}
 
 	/**
@@ -211,19 +196,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Property> attributes = (EList<Property>) cache.get(eResource,
-				this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
+			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>(
-						Property.class, this, UMLPackage.ARTIFACT__ATTRIBUTE,
-						ATTRIBUTE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE, attributes = new DerivedUnionEObjectEList<Property>(Property.class, this, UMLPackage.ARTIFACT__ATTRIBUTE, ATTRIBUTE_ESUBSETS));
 			}
 			return attributes;
 		}
-		return new DerivedUnionEObjectEList<Property>(Property.class, this,
-			UMLPackage.ARTIFACT__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Property>(Property.class, this, UMLPackage.ARTIFACT__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
 	}
 
 	/**
@@ -232,9 +211,7 @@
 	 * @generated
 	 */
 	public String getFileName() {
-		return (String) eDynamicGet(
-			UMLPackage.ARTIFACT__FILE_NAME - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ARTIFACT__FILE_NAME, true, true);
+		return (String) eDynamicGet(UMLPackage.ARTIFACT__FILE_NAME - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ARTIFACT__FILE_NAME, true, true);
 	}
 
 	/**
@@ -243,8 +220,7 @@
 	 * @generated
 	 */
 	public void setFileName(String newFileName) {
-		eDynamicSet(UMLPackage.ARTIFACT__FILE_NAME - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ARTIFACT__FILE_NAME, newFileName);
+		eDynamicSet(UMLPackage.ARTIFACT__FILE_NAME - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ARTIFACT__FILE_NAME, newFileName);
 	}
 
 	/**
@@ -253,8 +229,7 @@
 	 * @generated
 	 */
 	public void unsetFileName() {
-		eDynamicUnset(UMLPackage.ARTIFACT__FILE_NAME - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ARTIFACT__FILE_NAME);
+		eDynamicUnset(UMLPackage.ARTIFACT__FILE_NAME - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ARTIFACT__FILE_NAME);
 	}
 
 	/**
@@ -263,9 +238,7 @@
 	 * @generated
 	 */
 	public boolean isSetFileName() {
-		return eDynamicIsSet(
-			UMLPackage.ARTIFACT__FILE_NAME - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ARTIFACT__FILE_NAME);
+		return eDynamicIsSet(UMLPackage.ARTIFACT__FILE_NAME - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ARTIFACT__FILE_NAME);
 	}
 
 	/**
@@ -275,9 +248,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Artifact> getNestedArtifacts() {
-		return (EList<Artifact>) eDynamicGet(
-			UMLPackage.ARTIFACT__NESTED_ARTIFACT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ARTIFACT__NESTED_ARTIFACT, true, true);
+		return (EList<Artifact>) eDynamicGet(UMLPackage.ARTIFACT__NESTED_ARTIFACT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ARTIFACT__NESTED_ARTIFACT, true, true);
 	}
 
 	/**
@@ -318,18 +289,14 @@
 	 */
 	public Artifact getNestedArtifact(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		nestedArtifactLoop : for (Artifact nestedArtifact : getNestedArtifacts()) {
+		nestedArtifactLoop: for (Artifact nestedArtifact : getNestedArtifacts()) {
 			if (eClass != null && !eClass.isInstance(nestedArtifact))
 				continue nestedArtifactLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(nestedArtifact.getName())
-				: name.equals(nestedArtifact.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(nestedArtifact.getName()) : name.equals(nestedArtifact.getName())))
 				continue nestedArtifactLoop;
 			return nestedArtifact;
 		}
-		return createOnDemand && eClass != null
-			? createNestedArtifact(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createNestedArtifact(name, eClass) : null;
 	}
 
 	/**
@@ -339,9 +306,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Manifestation> getManifestations() {
-		return (EList<Manifestation>) eDynamicGet(
-			UMLPackage.ARTIFACT__MANIFESTATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ARTIFACT__MANIFESTATION, true, true);
+		return (EList<Manifestation>) eDynamicGet(UMLPackage.ARTIFACT__MANIFESTATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ARTIFACT__MANIFESTATION, true, true);
 	}
 
 	/**
@@ -351,9 +316,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Operation> getOwnedOperations() {
-		return (EList<Operation>) eDynamicGet(
-			UMLPackage.ARTIFACT__OWNED_OPERATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ARTIFACT__OWNED_OPERATION, true, true);
+		return (EList<Operation>) eDynamicGet(UMLPackage.ARTIFACT__OWNED_OPERATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ARTIFACT__OWNED_OPERATION, true, true);
 	}
 
 	/**
@@ -364,29 +327,19 @@
 	public Operation createOwnedOperation(String name,
 			EList<String> ownedParameterNames,
 			EList<Type> ownedParameterTypes) {
-		Operation newOwnedOperation = (Operation) create(
-			UMLPackage.Literals.OPERATION);
+		Operation newOwnedOperation = (Operation) create(UMLPackage.Literals.OPERATION);
 		getOwnedOperations().add(newOwnedOperation);
 		if (name != null)
 			newOwnedOperation.setName(name);
 		int ownedParameterListSize = 0;
-		int ownedParameterNamesSize = ownedParameterNames == null
-			? 0
-			: ownedParameterNames.size();
+		int ownedParameterNamesSize = ownedParameterNames == null ? 0 : ownedParameterNames.size();
 		if (ownedParameterNamesSize > ownedParameterListSize)
 			ownedParameterListSize = ownedParameterNamesSize;
-		int ownedParameterTypesSize = ownedParameterTypes == null
-			? 0
-			: ownedParameterTypes.size();
+		int ownedParameterTypesSize = ownedParameterTypes == null ? 0 : ownedParameterTypes.size();
 		if (ownedParameterTypesSize > ownedParameterListSize)
 			ownedParameterListSize = ownedParameterTypesSize;
 		for (int i = 0; i < ownedParameterListSize; i++) {
-			newOwnedOperation.createOwnedParameter(i < ownedParameterNamesSize
-				? (String) ownedParameterNames.get(i)
-				: null,
-				i < ownedParameterTypesSize
-					? (Type) ownedParameterTypes.get(i)
-					: null);
+			newOwnedOperation.createOwnedParameter(i < ownedParameterNamesSize ? (String) ownedParameterNames.get(i) : null, i < ownedParameterTypesSize ? (Type) ownedParameterTypes.get(i) : null);
 		}
 		return newOwnedOperation;
 	}
@@ -399,8 +352,7 @@
 	public Operation getOwnedOperation(String name,
 			EList<String> ownedParameterNames,
 			EList<Type> ownedParameterTypes) {
-		return getOwnedOperation(name, ownedParameterNames, ownedParameterTypes,
-			false, false);
+		return getOwnedOperation(name, ownedParameterNames, ownedParameterTypes, false, false);
 	}
 
 	/**
@@ -411,37 +363,23 @@
 	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())))
+		ownedOperationLoop: for (Operation ownedOperation : getOwnedOperations()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedOperation.getName()) : name.equals(ownedOperation.getName())))
 				continue ownedOperationLoop;
-			EList<Parameter> ownedParameterList = ownedOperation
-				.getOwnedParameters();
+			EList<Parameter> ownedParameterList = ownedOperation.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
-			if (ownedParameterNames != null
-				&& ownedParameterNames.size() != ownedParameterListSize
-				|| (ownedParameterTypes != null
-					&& ownedParameterTypes.size() != ownedParameterListSize))
+			if (ownedParameterNames != null && ownedParameterNames.size() != ownedParameterListSize || (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue ownedOperationLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
 				Parameter ownedParameter = ownedParameterList.get(j);
-				if (ownedParameterNames != null && !(ignoreCase
-					? (ownedParameterNames.get(j))
-						.equalsIgnoreCase(ownedParameter.getName())
-					: ownedParameterNames.get(j)
-						.equals(ownedParameter.getName())))
+				if (ownedParameterNames != null && !(ignoreCase ? (ownedParameterNames.get(j)).equalsIgnoreCase(ownedParameter.getName()) : ownedParameterNames.get(j).equals(ownedParameter.getName())))
 					continue ownedOperationLoop;
-				if (ownedParameterTypes != null && !ownedParameterTypes.get(j)
-					.equals(ownedParameter.getType()))
+				if (ownedParameterTypes != null && !ownedParameterTypes.get(j).equals(ownedParameter.getType()))
 					continue ownedOperationLoop;
 			}
 			return ownedOperation;
 		}
-		return createOnDemand
-			? createOwnedOperation(name, ownedParameterNames,
-				ownedParameterTypes)
-			: null;
+		return createOnDemand ? createOwnedOperation(name, ownedParameterNames, ownedParameterTypes) : null;
 	}
 
 	/**
@@ -451,9 +389,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Property> getOwnedAttributes() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.ARTIFACT__OWNED_ATTRIBUTE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ARTIFACT__OWNED_ATTRIBUTE, true, true);
+		return (EList<Property>) eDynamicGet(UMLPackage.ARTIFACT__OWNED_ATTRIBUTE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ARTIFACT__OWNED_ATTRIBUTE, true, true);
 	}
 
 	/**
@@ -497,20 +433,16 @@
 	 */
 	public Property getOwnedAttribute(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		ownedAttributeLoop : for (Property ownedAttribute : getOwnedAttributes()) {
+		ownedAttributeLoop: for (Property ownedAttribute : getOwnedAttributes()) {
 			if (eClass != null && !eClass.isInstance(ownedAttribute))
 				continue ownedAttributeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedAttribute.getName())
-				: name.equals(ownedAttribute.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedAttribute.getName()) : name.equals(ownedAttribute.getName())))
 				continue ownedAttributeLoop;
 			if (type != null && !type.equals(ownedAttribute.getType()))
 				continue ownedAttributeLoop;
 			return ownedAttribute;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedAttribute(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedAttribute(name, type, eClass) : null;
 	}
 
 	/**
@@ -521,8 +453,7 @@
 	public Operation createOwnedOperation(String name,
 			EList<String> parameterNames, EList<Type> parameterTypes,
 			Type returnType) {
-		return ArtifactOperations.createOwnedOperation(this, name,
-			parameterNames, parameterTypes, returnType);
+		return ArtifactOperations.createOwnedOperation(this, name, parameterNames, parameterTypes, returnType);
 	}
 
 	/**
@@ -532,8 +463,7 @@
 	 */
 	public Property createOwnedAttribute(String name, Type type, int lower,
 			int upper) {
-		return ArtifactOperations.createOwnedAttribute(this, name, type, lower,
-			upper);
+		return ArtifactOperations.createOwnedAttribute(this, name, type, lower, upper);
 	}
 
 	/**
@@ -545,62 +475,46 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ARTIFACT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ARTIFACT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ARTIFACT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ARTIFACT__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ARTIFACT__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ARTIFACT__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.ARTIFACT__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.ARTIFACT__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ARTIFACT__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ARTIFACT__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ARTIFACT__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ARTIFACT__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ARTIFACT__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ARTIFACT__MANIFESTATION :
-				return ((InternalEList<?>) getManifestations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ARTIFACT__NESTED_ARTIFACT :
-				return ((InternalEList<?>) getNestedArtifacts())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ARTIFACT__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ARTIFACT__OWNED_OPERATION :
-				return ((InternalEList<?>) getOwnedOperations())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.ARTIFACT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ARTIFACT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ARTIFACT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ARTIFACT__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ARTIFACT__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ARTIFACT__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.ARTIFACT__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.ARTIFACT__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ARTIFACT__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ARTIFACT__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ARTIFACT__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ARTIFACT__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ARTIFACT__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ARTIFACT__MANIFESTATION:
+			return ((InternalEList<?>) getManifestations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ARTIFACT__NESTED_ARTIFACT:
+			return ((InternalEList<?>) getNestedArtifacts()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ARTIFACT__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ARTIFACT__OWNED_OPERATION:
+			return ((InternalEList<?>) getOwnedOperations()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -613,108 +527,108 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ARTIFACT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ARTIFACT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ARTIFACT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ARTIFACT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ARTIFACT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ARTIFACT__NAME :
-				return getName();
-			case UMLPackage.ARTIFACT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ARTIFACT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ARTIFACT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ARTIFACT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ARTIFACT__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.ARTIFACT__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.ARTIFACT__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.ARTIFACT__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.ARTIFACT__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.ARTIFACT__MEMBER :
-				return getMembers();
-			case UMLPackage.ARTIFACT__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.ARTIFACT__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.ARTIFACT__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.ARTIFACT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.ARTIFACT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.ARTIFACT__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.ARTIFACT__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.ARTIFACT__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.ARTIFACT__FEATURE :
-				return getFeatures();
-			case UMLPackage.ARTIFACT__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.ARTIFACT__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.ARTIFACT__GENERAL :
-				return getGenerals();
-			case UMLPackage.ARTIFACT__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.ARTIFACT__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.ARTIFACT__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.ARTIFACT__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.ARTIFACT__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.ARTIFACT__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.ARTIFACT__USE_CASE :
-				return getUseCases();
-			case UMLPackage.ARTIFACT__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.ARTIFACT__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.ARTIFACT__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.ARTIFACT__FILE_NAME :
-				return getFileName();
-			case UMLPackage.ARTIFACT__MANIFESTATION :
-				return getManifestations();
-			case UMLPackage.ARTIFACT__NESTED_ARTIFACT :
-				return getNestedArtifacts();
-			case UMLPackage.ARTIFACT__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.ARTIFACT__OWNED_OPERATION :
-				return getOwnedOperations();
+		case UMLPackage.ARTIFACT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ARTIFACT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ARTIFACT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ARTIFACT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ARTIFACT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ARTIFACT__NAME:
+			return getName();
+		case UMLPackage.ARTIFACT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ARTIFACT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ARTIFACT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ARTIFACT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ARTIFACT__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.ARTIFACT__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.ARTIFACT__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.ARTIFACT__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.ARTIFACT__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.ARTIFACT__MEMBER:
+			return getMembers();
+		case UMLPackage.ARTIFACT__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.ARTIFACT__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.ARTIFACT__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.ARTIFACT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.ARTIFACT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.ARTIFACT__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.ARTIFACT__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.ARTIFACT__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.ARTIFACT__FEATURE:
+			return getFeatures();
+		case UMLPackage.ARTIFACT__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.ARTIFACT__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.ARTIFACT__GENERAL:
+			return getGenerals();
+		case UMLPackage.ARTIFACT__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.ARTIFACT__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.ARTIFACT__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.ARTIFACT__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.ARTIFACT__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.ARTIFACT__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.ARTIFACT__USE_CASE:
+			return getUseCases();
+		case UMLPackage.ARTIFACT__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.ARTIFACT__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.ARTIFACT__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.ARTIFACT__FILE_NAME:
+			return getFileName();
+		case UMLPackage.ARTIFACT__MANIFESTATION:
+			return getManifestations();
+		case UMLPackage.ARTIFACT__NESTED_ARTIFACT:
+			return getNestedArtifacts();
+		case UMLPackage.ARTIFACT__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.ARTIFACT__OWNED_OPERATION:
+			return getOwnedOperations();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -728,131 +642,114 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ARTIFACT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ARTIFACT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ARTIFACT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ARTIFACT__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.ARTIFACT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ARTIFACT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ARTIFACT__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.ARTIFACT__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.ARTIFACT__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.ARTIFACT__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.ARTIFACT__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.ARTIFACT__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__FILE_NAME :
-				setFileName((String) newValue);
-				return;
-			case UMLPackage.ARTIFACT__MANIFESTATION :
-				getManifestations().clear();
-				getManifestations()
-					.addAll((Collection<? extends Manifestation>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__NESTED_ARTIFACT :
-				getNestedArtifacts().clear();
-				getNestedArtifacts()
-					.addAll((Collection<? extends Artifact>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.ARTIFACT__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
+		case UMLPackage.ARTIFACT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ARTIFACT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ARTIFACT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ARTIFACT__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.ARTIFACT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ARTIFACT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ARTIFACT__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.ARTIFACT__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.ARTIFACT__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.ARTIFACT__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.ARTIFACT__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.ARTIFACT__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__FILE_NAME:
+			setFileName((String) newValue);
+			return;
+		case UMLPackage.ARTIFACT__MANIFESTATION:
+			getManifestations().clear();
+			getManifestations().addAll((Collection<? extends Manifestation>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__NESTED_ARTIFACT:
+			getNestedArtifacts().clear();
+			getNestedArtifacts().addAll((Collection<? extends Artifact>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.ARTIFACT__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -865,96 +762,96 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ARTIFACT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ARTIFACT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ARTIFACT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ARTIFACT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ARTIFACT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ARTIFACT__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.ARTIFACT__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.ARTIFACT__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.ARTIFACT__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.ARTIFACT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ARTIFACT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ARTIFACT__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.ARTIFACT__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.ARTIFACT__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.ARTIFACT__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.ARTIFACT__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.ARTIFACT__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.ARTIFACT__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.ARTIFACT__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.ARTIFACT__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.ARTIFACT__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.ARTIFACT__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.ARTIFACT__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.ARTIFACT__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.ARTIFACT__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.ARTIFACT__FILE_NAME :
-				unsetFileName();
-				return;
-			case UMLPackage.ARTIFACT__MANIFESTATION :
-				getManifestations().clear();
-				return;
-			case UMLPackage.ARTIFACT__NESTED_ARTIFACT :
-				getNestedArtifacts().clear();
-				return;
-			case UMLPackage.ARTIFACT__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.ARTIFACT__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
+		case UMLPackage.ARTIFACT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ARTIFACT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ARTIFACT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ARTIFACT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ARTIFACT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ARTIFACT__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.ARTIFACT__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.ARTIFACT__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.ARTIFACT__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.ARTIFACT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ARTIFACT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ARTIFACT__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.ARTIFACT__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.ARTIFACT__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.ARTIFACT__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.ARTIFACT__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.ARTIFACT__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.ARTIFACT__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.ARTIFACT__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.ARTIFACT__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.ARTIFACT__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.ARTIFACT__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.ARTIFACT__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.ARTIFACT__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.ARTIFACT__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.ARTIFACT__FILE_NAME:
+			unsetFileName();
+			return;
+		case UMLPackage.ARTIFACT__MANIFESTATION:
+			getManifestations().clear();
+			return;
+		case UMLPackage.ARTIFACT__NESTED_ARTIFACT:
+			getNestedArtifacts().clear();
+			return;
+		case UMLPackage.ARTIFACT__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.ARTIFACT__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -967,94 +864,92 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ARTIFACT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ARTIFACT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ARTIFACT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ARTIFACT__OWNER :
-				return isSetOwner();
-			case UMLPackage.ARTIFACT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ARTIFACT__NAME :
-				return isSetName();
-			case UMLPackage.ARTIFACT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ARTIFACT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ARTIFACT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ARTIFACT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ARTIFACT__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.ARTIFACT__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.ARTIFACT__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.ARTIFACT__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.ARTIFACT__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.ARTIFACT__MEMBER :
-				return isSetMembers();
-			case UMLPackage.ARTIFACT__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.ARTIFACT__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.ARTIFACT__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.ARTIFACT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.ARTIFACT__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.ARTIFACT__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.ARTIFACT__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.ARTIFACT__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.ARTIFACT__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.ARTIFACT__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.ARTIFACT__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.ARTIFACT__GENERAL :
-				return !getGenerals().isEmpty();
-			case UMLPackage.ARTIFACT__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.ARTIFACT__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.ARTIFACT__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.ARTIFACT__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.ARTIFACT__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.ARTIFACT__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.ARTIFACT__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.ARTIFACT__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.ARTIFACT__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.ARTIFACT__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.ARTIFACT__FILE_NAME :
-				return isSetFileName();
-			case UMLPackage.ARTIFACT__MANIFESTATION :
-				return !getManifestations().isEmpty();
-			case UMLPackage.ARTIFACT__NESTED_ARTIFACT :
-				return !getNestedArtifacts().isEmpty();
-			case UMLPackage.ARTIFACT__OWNED_ATTRIBUTE :
-				return !getOwnedAttributes().isEmpty();
-			case UMLPackage.ARTIFACT__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
+		case UMLPackage.ARTIFACT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ARTIFACT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ARTIFACT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ARTIFACT__OWNER:
+			return isSetOwner();
+		case UMLPackage.ARTIFACT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ARTIFACT__NAME:
+			return isSetName();
+		case UMLPackage.ARTIFACT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ARTIFACT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ARTIFACT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ARTIFACT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ARTIFACT__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.ARTIFACT__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.ARTIFACT__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.ARTIFACT__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.ARTIFACT__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.ARTIFACT__MEMBER:
+			return isSetMembers();
+		case UMLPackage.ARTIFACT__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.ARTIFACT__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.ARTIFACT__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.ARTIFACT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.ARTIFACT__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.ARTIFACT__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.ARTIFACT__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.ARTIFACT__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.ARTIFACT__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.ARTIFACT__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.ARTIFACT__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.ARTIFACT__GENERAL:
+			return !getGenerals().isEmpty();
+		case UMLPackage.ARTIFACT__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.ARTIFACT__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.ARTIFACT__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.ARTIFACT__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.ARTIFACT__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.ARTIFACT__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.ARTIFACT__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.ARTIFACT__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.ARTIFACT__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.ARTIFACT__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.ARTIFACT__FILE_NAME:
+			return isSetFileName();
+		case UMLPackage.ARTIFACT__MANIFESTATION:
+			return !getManifestations().isEmpty();
+		case UMLPackage.ARTIFACT__NESTED_ARTIFACT:
+			return !getNestedArtifacts().isEmpty();
+		case UMLPackage.ARTIFACT__OWNED_ATTRIBUTE:
+			return !getOwnedAttributes().isEmpty();
+		case UMLPackage.ARTIFACT__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1069,280 +964,221 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ARTIFACT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ARTIFACT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ARTIFACT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ARTIFACT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ARTIFACT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ARTIFACT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ARTIFACT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ARTIFACT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ARTIFACT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ARTIFACT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ARTIFACT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ARTIFACT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ARTIFACT___GET_MODEL :
-				return getModel();
-			case UMLPackage.ARTIFACT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ARTIFACT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ARTIFACT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ARTIFACT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ARTIFACT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ARTIFACT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ARTIFACT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ARTIFACT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ARTIFACT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ARTIFACT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ARTIFACT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ARTIFACT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ARTIFACT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ARTIFACT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ARTIFACT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ARTIFACT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ARTIFACT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ARTIFACT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ARTIFACT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ARTIFACT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ARTIFACT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ARTIFACT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ARTIFACT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ARTIFACT___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ARTIFACT___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ARTIFACT___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ARTIFACT___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ARTIFACT___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ARTIFACT___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ARTIFACT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ARTIFACT___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ARTIFACT___SEPARATOR :
-				return separator();
-			case UMLPackage.ARTIFACT___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ARTIFACT___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.ARTIFACT___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.ARTIFACT___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.ARTIFACT___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.ARTIFACT___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.ARTIFACT___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.ARTIFACT___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.ARTIFACT___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.ARTIFACT___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.ARTIFACT___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.ARTIFACT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.ARTIFACT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.ARTIFACT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.ARTIFACT___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.ARTIFACT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.ARTIFACT___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.ARTIFACT___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.ARTIFACT___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.ARTIFACT___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.ARTIFACT___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ARTIFACT___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.ARTIFACT___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.ARTIFACT___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.ARTIFACT___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.ARTIFACT___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.ARTIFACT___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.ARTIFACT___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.ARTIFACT___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.ARTIFACT___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.ARTIFACT___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.ARTIFACT___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.ARTIFACT___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.ARTIFACT___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.ARTIFACT___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.ARTIFACT___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.ARTIFACT___PARENTS :
-				return parents();
-			case UMLPackage.ARTIFACT___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.ARTIFACT___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.ARTIFACT___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.ARTIFACT___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.ARTIFACT___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.ARTIFACT___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.ARTIFACT___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.ARTIFACT___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.ARTIFACT___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.ARTIFACT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ARTIFACT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ARTIFACT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ARTIFACT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ARTIFACT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ARTIFACT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ARTIFACT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ARTIFACT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ARTIFACT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ARTIFACT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ARTIFACT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ARTIFACT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ARTIFACT___GET_MODEL:
+			return getModel();
+		case UMLPackage.ARTIFACT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ARTIFACT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ARTIFACT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ARTIFACT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ARTIFACT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ARTIFACT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ARTIFACT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ARTIFACT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ARTIFACT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ARTIFACT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ARTIFACT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ARTIFACT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ARTIFACT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ARTIFACT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ARTIFACT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ARTIFACT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ARTIFACT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ARTIFACT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ARTIFACT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ARTIFACT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ARTIFACT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ARTIFACT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ARTIFACT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ARTIFACT___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ARTIFACT___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ARTIFACT___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ARTIFACT___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ARTIFACT___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ARTIFACT___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ARTIFACT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ARTIFACT___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ARTIFACT___SEPARATOR:
+			return separator();
+		case UMLPackage.ARTIFACT___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ARTIFACT___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.ARTIFACT___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.ARTIFACT___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.ARTIFACT___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.ARTIFACT___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.ARTIFACT___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.ARTIFACT___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.ARTIFACT___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.ARTIFACT___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.ARTIFACT___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.ARTIFACT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.ARTIFACT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.ARTIFACT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.ARTIFACT___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.ARTIFACT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.ARTIFACT___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.ARTIFACT___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.ARTIFACT___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.ARTIFACT___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.ARTIFACT___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ARTIFACT___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.ARTIFACT___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.ARTIFACT___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.ARTIFACT___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.ARTIFACT___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.ARTIFACT___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.ARTIFACT___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.ARTIFACT___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.ARTIFACT___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.ARTIFACT___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.ARTIFACT___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.ARTIFACT___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.ARTIFACT___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.ARTIFACT___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.ARTIFACT___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.ARTIFACT___PARENTS:
+			return parents();
+		case UMLPackage.ARTIFACT___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.ARTIFACT___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.ARTIFACT___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.ARTIFACT___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.ARTIFACT___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.ARTIFACT___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.ARTIFACT___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.ARTIFACT___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.ARTIFACT___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1355,9 +1191,9 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.ARTIFACT__NESTED_ARTIFACT)
-			|| eIsSet(UMLPackage.ARTIFACT__OWNED_ATTRIBUTE)
-			|| eIsSet(UMLPackage.ARTIFACT__OWNED_OPERATION);
+				|| eIsSet(UMLPackage.ARTIFACT__NESTED_ARTIFACT)
+				|| eIsSet(UMLPackage.ARTIFACT__OWNED_ATTRIBUTE)
+				|| eIsSet(UMLPackage.ARTIFACT__OWNED_OPERATION);
 	}
 
 	/**
@@ -1368,16 +1204,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.ARTIFACT__OWNED_COMMENT,
-		UMLPackage.ARTIFACT__NAME_EXPRESSION,
-		UMLPackage.ARTIFACT__ELEMENT_IMPORT,
-		UMLPackage.ARTIFACT__PACKAGE_IMPORT, UMLPackage.ARTIFACT__OWNED_MEMBER,
-		UMLPackage.ARTIFACT__TEMPLATE_BINDING,
-		UMLPackage.ARTIFACT__OWNED_TEMPLATE_SIGNATURE,
-		UMLPackage.ARTIFACT__COLLABORATION_USE,
-		UMLPackage.ARTIFACT__GENERALIZATION, UMLPackage.ARTIFACT__SUBSTITUTION,
-		UMLPackage.ARTIFACT__MANIFESTATION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.ARTIFACT__OWNED_COMMENT, UMLPackage.ARTIFACT__NAME_EXPRESSION, UMLPackage.ARTIFACT__ELEMENT_IMPORT, UMLPackage.ARTIFACT__PACKAGE_IMPORT, UMLPackage.ARTIFACT__OWNED_MEMBER,
+			UMLPackage.ARTIFACT__TEMPLATE_BINDING, UMLPackage.ARTIFACT__OWNED_TEMPLATE_SIGNATURE, UMLPackage.ARTIFACT__COLLABORATION_USE, UMLPackage.ARTIFACT__GENERALIZATION, UMLPackage.ARTIFACT__SUBSTITUTION, UMLPackage.ARTIFACT__MANIFESTATION };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedMembers() <em>Owned Member</em>}' reference list.
@@ -1387,11 +1215,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.ARTIFACT__OWNED_RULE, UMLPackage.ARTIFACT__OWNED_USE_CASE,
-		UMLPackage.ARTIFACT__NESTED_ARTIFACT,
-		UMLPackage.ARTIFACT__OWNED_ATTRIBUTE,
-		UMLPackage.ARTIFACT__OWNED_OPERATION};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.ARTIFACT__OWNED_RULE, UMLPackage.ARTIFACT__OWNED_USE_CASE, UMLPackage.ARTIFACT__NESTED_ARTIFACT, UMLPackage.ARTIFACT__OWNED_ATTRIBUTE, UMLPackage.ARTIFACT__OWNED_OPERATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1401,7 +1225,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.ARTIFACT__MANIFESTATION);
+				|| eIsSet(UMLPackage.ARTIFACT__MANIFESTATION);
 	}
 
 	/**
@@ -1412,7 +1236,7 @@
 	@Override
 	public boolean isSetFeatures() {
 		return super.isSetFeatures()
-			|| eIsSet(UMLPackage.ARTIFACT__OWNED_OPERATION);
+				|| eIsSet(UMLPackage.ARTIFACT__OWNED_OPERATION);
 	}
 
 	/**
@@ -1423,8 +1247,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] ATTRIBUTE_ESUBSETS = new int[]{
-		UMLPackage.ARTIFACT__OWNED_ATTRIBUTE};
+	protected static final int[] ATTRIBUTE_ESUBSETS = new int[] { UMLPackage.ARTIFACT__OWNED_ATTRIBUTE };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getFeatures() <em>Feature</em>}' reference list.
@@ -1434,8 +1257,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] FEATURE_ESUBSETS = new int[]{
-		UMLPackage.ARTIFACT__ATTRIBUTE, UMLPackage.ARTIFACT__OWNED_OPERATION};
+	protected static final int[] FEATURE_ESUBSETS = new int[] { UMLPackage.ARTIFACT__ATTRIBUTE, UMLPackage.ARTIFACT__OWNED_OPERATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1444,8 +1266,7 @@
 	 */
 	public Manifestation createManifestation(String name,
 			PackageableElement utilizedElement) {
-		Manifestation newManifestation = (Manifestation) create(
-			UMLPackage.Literals.MANIFESTATION);
+		Manifestation newManifestation = (Manifestation) create(UMLPackage.Literals.MANIFESTATION);
 		getManifestations().add(newManifestation);
 		if (name != null)
 			newManifestation.setName(name);
@@ -1472,19 +1293,14 @@
 	public Manifestation getManifestation(String name,
 			PackageableElement utilizedElement, boolean ignoreCase,
 			boolean createOnDemand) {
-		manifestationLoop : for (Manifestation manifestation : getManifestations()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(manifestation.getName())
-				: name.equals(manifestation.getName())))
+		manifestationLoop: for (Manifestation manifestation : getManifestations()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(manifestation.getName()) : name.equals(manifestation.getName())))
 				continue manifestationLoop;
-			if (utilizedElement != null
-				&& !utilizedElement.equals(manifestation.getUtilizedElement()))
+			if (utilizedElement != null && !utilizedElement.equals(manifestation.getUtilizedElement()))
 				continue manifestationLoop;
 			return manifestation;
 		}
-		return createOnDemand
-			? createManifestation(name, utilizedElement)
-			: null;
+		return createOnDemand ? createManifestation(name, utilizedElement) : null;
 	}
 
 	/**
@@ -1495,7 +1311,7 @@
 	@Override
 	public boolean isSetAttributes() {
 		return super.isSetAttributes()
-			|| eIsSet(UMLPackage.ARTIFACT__OWNED_ATTRIBUTE);
+				|| eIsSet(UMLPackage.ARTIFACT__OWNED_ATTRIBUTE);
 	}
 
 } //ArtifactImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AssociationClassImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AssociationClassImpl.java
index b02d97c..e109713 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AssociationClassImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AssociationClassImpl.java
@@ -1,37 +1,48 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
+
 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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectContainmentWithInverseEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectResolvingEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectWithInverseResolvingEList;
+
 import org.eclipse.uml2.uml.AggregationKind;
 import org.eclipse.uml2.uml.Association;
 import org.eclipse.uml2.uml.AssociationClass;
@@ -67,6 +78,7 @@
 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;
 import org.eclipse.uml2.uml.internal.operations.AssociationOperations;
 
@@ -124,17 +136,9 @@
 		return UMLPackage.Literals.ASSOCIATION_CLASS;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.ASSOCIATION__MEMBER_END) {
 			return createMemberEndsList();
 		}
@@ -160,22 +164,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> relatedElements = (EList<Element>) cache.get(
-				eResource, this,
-				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
+			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<Element>(
-						Element.class, this,
-						UMLPackage.ASSOCIATION_CLASS__RELATED_ELEMENT,
-						RELATED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT, relatedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ASSOCIATION_CLASS__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.ASSOCIATION_CLASS__RELATED_ELEMENT,
-			RELATED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ASSOCIATION_CLASS__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -189,19 +184,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> members = (EList<NamedElement>) cache
-				.get(eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER);
+			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>(
-						NamedElement.class, this,
-						UMLPackage.ASSOCIATION_CLASS__MEMBER, MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER, members = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.ASSOCIATION_CLASS__MEMBER, MEMBER_ESUBSETS));
 			}
 			return members;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.ASSOCIATION_CLASS__MEMBER, MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.ASSOCIATION_CLASS__MEMBER, MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -215,20 +204,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Feature> features = (EList<Feature>) cache.get(eResource,
-				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
+			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>(
-						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>(Feature.class, this,
-			UMLPackage.ASSOCIATION_CLASS__FEATURE, FEATURE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this, UMLPackage.ASSOCIATION_CLASS__FEATURE, FEATURE_ESUBSETS);
 	}
 
 	/**
@@ -242,21 +224,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.ASSOCIATION_CLASS__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.ASSOCIATION_CLASS__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(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);
 	}
 
 	/**
@@ -266,15 +240,13 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Property> getMemberEnds() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.ASSOCIATION_CLASS__MEMBER_END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ASSOCIATION__MEMBER_END, true, true);
+		return (EList<Property>) eDynamicGet(UMLPackage.ASSOCIATION_CLASS__MEMBER_END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ASSOCIATION__MEMBER_END, true, true);
 	}
 
 	private EList<Property> createMemberEndsList() {
 		return new SubsetSupersetEObjectWithInverseResolvingEList<Property>(
-			Property.class, this, UMLPackage.ASSOCIATION_CLASS__MEMBER_END,
-			null, MEMBER_END_ESUBSETS, UMLPackage.PROPERTY__ASSOCIATION);
+				Property.class, this, UMLPackage.ASSOCIATION_CLASS__MEMBER_END,
+				null, MEMBER_END_ESUBSETS, UMLPackage.PROPERTY__ASSOCIATION);
 	}
 
 	/**
@@ -284,16 +256,14 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Property> getOwnedEnds() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.ASSOCIATION_CLASS__OWNED_END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ASSOCIATION__OWNED_END, true, true);
+		return (EList<Property>) eDynamicGet(UMLPackage.ASSOCIATION_CLASS__OWNED_END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ASSOCIATION__OWNED_END, true, true);
 	}
 
 	private EList<Property> createOwnedEndsList() {
 		return new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Property>(
-			Property.class, this, UMLPackage.ASSOCIATION_CLASS__OWNED_END,
-			OWNED_END_ESUPERSETS, OWNED_END_ESUBSETS,
-			UMLPackage.PROPERTY__OWNING_ASSOCIATION);
+				Property.class, this, UMLPackage.ASSOCIATION_CLASS__OWNED_END,
+				OWNED_END_ESUPERSETS, OWNED_END_ESUBSETS,
+				UMLPackage.PROPERTY__OWNING_ASSOCIATION);
 	}
 
 	/**
@@ -302,9 +272,7 @@
 	 * @generated
 	 */
 	public boolean isDerived() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.ASSOCIATION_CLASS__IS_DERIVED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ASSOCIATION__IS_DERIVED, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.ASSOCIATION_CLASS__IS_DERIVED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ASSOCIATION__IS_DERIVED, true, true);
 	}
 
 	/**
@@ -313,9 +281,7 @@
 	 * @generated
 	 */
 	public void setIsDerived(boolean newIsDerived) {
-		eDynamicSet(
-			UMLPackage.ASSOCIATION_CLASS__IS_DERIVED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ASSOCIATION__IS_DERIVED, newIsDerived);
+		eDynamicSet(UMLPackage.ASSOCIATION_CLASS__IS_DERIVED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ASSOCIATION__IS_DERIVED, newIsDerived);
 	}
 
 	/**
@@ -327,11 +293,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Type> result = (EList<Type>) cache.get(this,
-				UMLPackage.Literals.ASSOCIATION__END_TYPE);
+			EList<Type> result = (EList<Type>) cache.get(this, UMLPackage.Literals.ASSOCIATION__END_TYPE);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.ASSOCIATION__END_TYPE,
-					result = AssociationOperations.getEndTypes(this));
+				cache.put(this, UMLPackage.Literals.ASSOCIATION__END_TYPE, result = AssociationOperations.getEndTypes(this));
 			}
 			return result;
 		}
@@ -353,12 +317,10 @@
 	 * @generated
 	 */
 	public Type getEndType(String name, boolean ignoreCase, EClass eClass) {
-		endTypeLoop : for (Type endType : getEndTypes()) {
+		endTypeLoop: for (Type endType : getEndTypes()) {
 			if (eClass != null && !eClass.isInstance(endType))
 				continue endTypeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(endType.getName())
-				: name.equals(endType.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(endType.getName()) : name.equals(endType.getName())))
 				continue endTypeLoop;
 			return endType;
 		}
@@ -372,16 +334,13 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Property> getNavigableOwnedEnds() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ASSOCIATION__NAVIGABLE_OWNED_END, true, true);
+		return (EList<Property>) eDynamicGet(UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ASSOCIATION__NAVIGABLE_OWNED_END, true, true);
 	}
 
 	private EList<Property> createNavigableOwnedEndsList() {
 		return new SubsetSupersetEObjectResolvingEList<Property>(Property.class,
-			this, UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END,
-			NAVIGABLE_OWNED_END_ESUPERSETS, null);
+				this, UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END,
+				NAVIGABLE_OWNED_END_ESUPERSETS, null);
 	}
 
 	/**
@@ -391,8 +350,7 @@
 	 */
 	public boolean validateSpecializedEndNumber(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AssociationOperations.validateSpecializedEndNumber(this,
-			diagnostics, context);
+		return AssociationOperations.validateSpecializedEndNumber(this, diagnostics, context);
 	}
 
 	/**
@@ -402,8 +360,7 @@
 	 */
 	public boolean validateSpecializedEndTypes(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AssociationOperations.validateSpecializedEndTypes(this,
-			diagnostics, context);
+		return AssociationOperations.validateSpecializedEndTypes(this, diagnostics, context);
 	}
 
 	/**
@@ -413,8 +370,7 @@
 	 */
 	public boolean validateBinaryAssociations(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AssociationOperations.validateBinaryAssociations(this,
-			diagnostics, context);
+		return AssociationOperations.validateBinaryAssociations(this, diagnostics, context);
 	}
 
 	/**
@@ -424,8 +380,7 @@
 	 */
 	public boolean validateAssociationEnds(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AssociationOperations.validateAssociationEnds(this, diagnostics,
-			context);
+		return AssociationOperations.validateAssociationEnds(this, diagnostics, context);
 	}
 
 	/**
@@ -435,8 +390,7 @@
 	 */
 	public boolean validateEndsMustBeTyped(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AssociationOperations.validateEndsMustBeTyped(this, diagnostics,
-			context);
+		return AssociationOperations.validateEndsMustBeTyped(this, diagnostics, context);
 	}
 
 	/**
@@ -455,8 +409,7 @@
 	 */
 	public boolean validateCannotBeDefined(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AssociationClassOperations.validateCannotBeDefined(this,
-			diagnostics, context);
+		return AssociationClassOperations.validateCannotBeDefined(this, diagnostics, context);
 	}
 
 	/**
@@ -466,8 +419,7 @@
 	 */
 	public boolean validateDisjointAttributesEnds(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AssociationClassOperations.validateDisjointAttributesEnds(this,
-			diagnostics, context);
+		return AssociationClassOperations.validateDisjointAttributesEnds(this, diagnostics, context);
 	}
 
 	/**
@@ -480,68 +432,46 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__INTERFACE_REALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__MEMBER_END :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getMemberEnds())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_END :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedEnds())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__INTERFACE_REALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__MEMBER_END:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getMemberEnds()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_END:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedEnds()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -555,77 +485,56 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ASSOCIATION_CLASS__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR :
-				return ((InternalEList<?>) getOwnedConnectors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__INTERFACE_REALIZATION :
-				return ((InternalEList<?>) getInterfaceRealizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_BEHAVIOR :
-				return ((InternalEList<?>) getOwnedBehaviors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION :
-				return ((InternalEList<?>) getOwnedOperations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__NESTED_CLASSIFIER :
-				return ((InternalEList<?>) getNestedClassifiers())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION :
-				return ((InternalEList<?>) getOwnedReceptions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__MEMBER_END :
-				return ((InternalEList<?>) getMemberEnds())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_END :
-				return ((InternalEList<?>) getOwnedEnds()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR:
+			return ((InternalEList<?>) getOwnedConnectors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__INTERFACE_REALIZATION:
+			return ((InternalEList<?>) getInterfaceRealizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_BEHAVIOR:
+			return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION:
+			return ((InternalEList<?>) getOwnedOperations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__NESTED_CLASSIFIER:
+			return ((InternalEList<?>) getNestedClassifiers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION:
+			return ((InternalEList<?>) getOwnedReceptions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__MEMBER_END:
+			return ((InternalEList<?>) getMemberEnds()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_END:
+			return ((InternalEList<?>) getOwnedEnds()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -638,140 +547,140 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ASSOCIATION_CLASS__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ASSOCIATION_CLASS__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ASSOCIATION_CLASS__NAME :
-				return getName();
-			case UMLPackage.ASSOCIATION_CLASS__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ASSOCIATION_CLASS__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ASSOCIATION_CLASS__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ASSOCIATION_CLASS__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.ASSOCIATION_CLASS__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.ASSOCIATION_CLASS__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.ASSOCIATION_CLASS__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.ASSOCIATION_CLASS__MEMBER :
-				return getMembers();
-			case UMLPackage.ASSOCIATION_CLASS__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.ASSOCIATION_CLASS__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.ASSOCIATION_CLASS__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.ASSOCIATION_CLASS__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.ASSOCIATION_CLASS__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.ASSOCIATION_CLASS__FEATURE :
-				return getFeatures();
-			case UMLPackage.ASSOCIATION_CLASS__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.ASSOCIATION_CLASS__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.ASSOCIATION_CLASS__GENERAL :
-				return getGenerals();
-			case UMLPackage.ASSOCIATION_CLASS__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.ASSOCIATION_CLASS__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.ASSOCIATION_CLASS__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.ASSOCIATION_CLASS__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.ASSOCIATION_CLASS__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.ASSOCIATION_CLASS__USE_CASE :
-				return getUseCases();
-			case UMLPackage.ASSOCIATION_CLASS__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.ASSOCIATION_CLASS__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.ASSOCIATION_CLASS__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR :
-				return getOwnedConnectors();
-			case UMLPackage.ASSOCIATION_CLASS__PART :
-				return getParts();
-			case UMLPackage.ASSOCIATION_CLASS__ROLE :
-				return getRoles();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_PORT :
-				return getOwnedPorts();
-			case UMLPackage.ASSOCIATION_CLASS__CLASSIFIER_BEHAVIOR :
-				if (resolve)
-					return getClassifierBehavior();
-				return basicGetClassifierBehavior();
-			case UMLPackage.ASSOCIATION_CLASS__INTERFACE_REALIZATION :
-				return getInterfaceRealizations();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_BEHAVIOR :
-				return getOwnedBehaviors();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION :
-				return getOwnedOperations();
-			case UMLPackage.ASSOCIATION_CLASS__EXTENSION :
-				return getExtensions();
-			case UMLPackage.ASSOCIATION_CLASS__IS_ACTIVE :
-				return isActive();
-			case UMLPackage.ASSOCIATION_CLASS__NESTED_CLASSIFIER :
-				return getNestedClassifiers();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION :
-				return getOwnedReceptions();
-			case UMLPackage.ASSOCIATION_CLASS__SUPER_CLASS :
-				return getSuperClasses();
-			case UMLPackage.ASSOCIATION_CLASS__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.ASSOCIATION_CLASS__END_TYPE :
-				return getEndTypes();
-			case UMLPackage.ASSOCIATION_CLASS__IS_DERIVED :
-				return isDerived();
-			case UMLPackage.ASSOCIATION_CLASS__MEMBER_END :
-				return getMemberEnds();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_END :
-				return getOwnedEnds();
-			case UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END :
-				return getNavigableOwnedEnds();
+		case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ASSOCIATION_CLASS__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ASSOCIATION_CLASS__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ASSOCIATION_CLASS__NAME:
+			return getName();
+		case UMLPackage.ASSOCIATION_CLASS__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ASSOCIATION_CLASS__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ASSOCIATION_CLASS__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ASSOCIATION_CLASS__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.ASSOCIATION_CLASS__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.ASSOCIATION_CLASS__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.ASSOCIATION_CLASS__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.ASSOCIATION_CLASS__MEMBER:
+			return getMembers();
+		case UMLPackage.ASSOCIATION_CLASS__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.ASSOCIATION_CLASS__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.ASSOCIATION_CLASS__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.ASSOCIATION_CLASS__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.ASSOCIATION_CLASS__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.ASSOCIATION_CLASS__FEATURE:
+			return getFeatures();
+		case UMLPackage.ASSOCIATION_CLASS__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.ASSOCIATION_CLASS__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.ASSOCIATION_CLASS__GENERAL:
+			return getGenerals();
+		case UMLPackage.ASSOCIATION_CLASS__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.ASSOCIATION_CLASS__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.ASSOCIATION_CLASS__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.ASSOCIATION_CLASS__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.ASSOCIATION_CLASS__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.ASSOCIATION_CLASS__USE_CASE:
+			return getUseCases();
+		case UMLPackage.ASSOCIATION_CLASS__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.ASSOCIATION_CLASS__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.ASSOCIATION_CLASS__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR:
+			return getOwnedConnectors();
+		case UMLPackage.ASSOCIATION_CLASS__PART:
+			return getParts();
+		case UMLPackage.ASSOCIATION_CLASS__ROLE:
+			return getRoles();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_PORT:
+			return getOwnedPorts();
+		case UMLPackage.ASSOCIATION_CLASS__CLASSIFIER_BEHAVIOR:
+			if (resolve)
+				return getClassifierBehavior();
+			return basicGetClassifierBehavior();
+		case UMLPackage.ASSOCIATION_CLASS__INTERFACE_REALIZATION:
+			return getInterfaceRealizations();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_BEHAVIOR:
+			return getOwnedBehaviors();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION:
+			return getOwnedOperations();
+		case UMLPackage.ASSOCIATION_CLASS__EXTENSION:
+			return getExtensions();
+		case UMLPackage.ASSOCIATION_CLASS__IS_ACTIVE:
+			return isActive();
+		case UMLPackage.ASSOCIATION_CLASS__NESTED_CLASSIFIER:
+			return getNestedClassifiers();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION:
+			return getOwnedReceptions();
+		case UMLPackage.ASSOCIATION_CLASS__SUPER_CLASS:
+			return getSuperClasses();
+		case UMLPackage.ASSOCIATION_CLASS__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.ASSOCIATION_CLASS__END_TYPE:
+			return getEndTypes();
+		case UMLPackage.ASSOCIATION_CLASS__IS_DERIVED:
+			return isDerived();
+		case UMLPackage.ASSOCIATION_CLASS__MEMBER_END:
+			return getMemberEnds();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_END:
+			return getOwnedEnds();
+		case UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END:
+			return getNavigableOwnedEnds();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -785,172 +694,148 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				getOwnedConnectors()
-					.addAll((Collection<? extends Connector>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll(
-					(Collection<? extends InterfaceRealization>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				getOwnedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__IS_ACTIVE :
-				setIsActive((Boolean) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				getNestedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				getOwnedReceptions()
-					.addAll((Collection<? extends Reception>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__SUPER_CLASS :
-				getSuperClasses().clear();
-				getSuperClasses().addAll(
-					(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__IS_DERIVED :
-				setIsDerived((Boolean) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__MEMBER_END :
-				getMemberEnds().clear();
-				getMemberEnds()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_END :
-				getOwnedEnds().clear();
-				getOwnedEnds()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END :
-				getNavigableOwnedEnds().clear();
-				getNavigableOwnedEnds()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
+		case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			getOwnedConnectors().addAll((Collection<? extends Connector>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			getInterfaceRealizations().addAll((Collection<? extends InterfaceRealization>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			getOwnedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__IS_ACTIVE:
+			setIsActive((Boolean) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			getNestedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			getOwnedReceptions().addAll((Collection<? extends Reception>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__SUPER_CLASS:
+			getSuperClasses().clear();
+			getSuperClasses().addAll((Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__IS_DERIVED:
+			setIsDerived((Boolean) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__MEMBER_END:
+			getMemberEnds().clear();
+			getMemberEnds().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_END:
+			getOwnedEnds().clear();
+			getOwnedEnds().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END:
+			getNavigableOwnedEnds().clear();
+			getNavigableOwnedEnds().addAll((Collection<? extends Property>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -963,123 +848,123 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) null);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__IS_ACTIVE :
-				setIsActive(IS_ACTIVE_EDEFAULT);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__SUPER_CLASS :
-				getSuperClasses().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__IS_DERIVED :
-				setIsDerived(IS_DERIVED_EDEFAULT);
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__MEMBER_END :
-				getMemberEnds().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_END :
-				getOwnedEnds().clear();
-				return;
-			case UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END :
-				getNavigableOwnedEnds().clear();
-				return;
+		case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) null);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__IS_ACTIVE:
+			setIsActive(IS_ACTIVE_EDEFAULT);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__SUPER_CLASS:
+			getSuperClasses().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__IS_DERIVED:
+			setIsDerived(IS_DERIVED_EDEFAULT);
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__MEMBER_END:
+			getMemberEnds().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_END:
+			getOwnedEnds().clear();
+			return;
+		case UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END:
+			getNavigableOwnedEnds().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1092,124 +977,122 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ASSOCIATION_CLASS__OWNER :
-				return isSetOwner();
-			case UMLPackage.ASSOCIATION_CLASS__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__NAME :
-				return isSetName();
-			case UMLPackage.ASSOCIATION_CLASS__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ASSOCIATION_CLASS__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ASSOCIATION_CLASS__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ASSOCIATION_CLASS__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.ASSOCIATION_CLASS__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__MEMBER :
-				return isSetMembers();
-			case UMLPackage.ASSOCIATION_CLASS__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.ASSOCIATION_CLASS__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.ASSOCIATION_CLASS__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.ASSOCIATION_CLASS__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.ASSOCIATION_CLASS__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.ASSOCIATION_CLASS__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.ASSOCIATION_CLASS__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.ASSOCIATION_CLASS__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__GENERAL :
-				return isSetGenerals();
-			case UMLPackage.ASSOCIATION_CLASS__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__IS_ABSTRACT :
-				return isSetIsAbstract();
-			case UMLPackage.ASSOCIATION_CLASS__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.ASSOCIATION_CLASS__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_ATTRIBUTE :
-				return isSetOwnedAttributes();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR :
-				return !getOwnedConnectors().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__PART :
-				return !getParts().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__ROLE :
-				return isSetRoles();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_PORT :
-				return !getOwnedPorts().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__CLASSIFIER_BEHAVIOR :
-				return basicGetClassifierBehavior() != null;
-			case UMLPackage.ASSOCIATION_CLASS__INTERFACE_REALIZATION :
-				return !getInterfaceRealizations().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_BEHAVIOR :
-				return !getOwnedBehaviors().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__EXTENSION :
-				return !getExtensions().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__IS_ACTIVE :
-				return isActive() != IS_ACTIVE_EDEFAULT;
-			case UMLPackage.ASSOCIATION_CLASS__NESTED_CLASSIFIER :
-				return !getNestedClassifiers().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION :
-				return !getOwnedReceptions().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__SUPER_CLASS :
-				return isSetSuperClasses();
-			case UMLPackage.ASSOCIATION_CLASS__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.ASSOCIATION_CLASS__END_TYPE :
-				return !getEndTypes().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__IS_DERIVED :
-				return isDerived() != IS_DERIVED_EDEFAULT;
-			case UMLPackage.ASSOCIATION_CLASS__MEMBER_END :
-				return !getMemberEnds().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__OWNED_END :
-				return !getOwnedEnds().isEmpty();
-			case UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END :
-				return !getNavigableOwnedEnds().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ASSOCIATION_CLASS__OWNER:
+			return isSetOwner();
+		case UMLPackage.ASSOCIATION_CLASS__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__NAME:
+			return isSetName();
+		case UMLPackage.ASSOCIATION_CLASS__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ASSOCIATION_CLASS__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ASSOCIATION_CLASS__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ASSOCIATION_CLASS__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.ASSOCIATION_CLASS__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__MEMBER:
+			return isSetMembers();
+		case UMLPackage.ASSOCIATION_CLASS__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.ASSOCIATION_CLASS__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.ASSOCIATION_CLASS__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.ASSOCIATION_CLASS__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.ASSOCIATION_CLASS__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.ASSOCIATION_CLASS__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.ASSOCIATION_CLASS__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.ASSOCIATION_CLASS__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.ASSOCIATION_CLASS__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__GENERAL:
+			return isSetGenerals();
+		case UMLPackage.ASSOCIATION_CLASS__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__IS_ABSTRACT:
+			return isSetIsAbstract();
+		case UMLPackage.ASSOCIATION_CLASS__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.ASSOCIATION_CLASS__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_ATTRIBUTE:
+			return isSetOwnedAttributes();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR:
+			return !getOwnedConnectors().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__PART:
+			return !getParts().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__ROLE:
+			return isSetRoles();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_PORT:
+			return !getOwnedPorts().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__CLASSIFIER_BEHAVIOR:
+			return basicGetClassifierBehavior() != null;
+		case UMLPackage.ASSOCIATION_CLASS__INTERFACE_REALIZATION:
+			return !getInterfaceRealizations().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_BEHAVIOR:
+			return !getOwnedBehaviors().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__EXTENSION:
+			return !getExtensions().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__IS_ACTIVE:
+			return isActive() != IS_ACTIVE_EDEFAULT;
+		case UMLPackage.ASSOCIATION_CLASS__NESTED_CLASSIFIER:
+			return !getNestedClassifiers().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION:
+			return !getOwnedReceptions().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__SUPER_CLASS:
+			return isSetSuperClasses();
+		case UMLPackage.ASSOCIATION_CLASS__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.ASSOCIATION_CLASS__END_TYPE:
+			return !getEndTypes().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__IS_DERIVED:
+			return isDerived() != IS_DERIVED_EDEFAULT;
+		case UMLPackage.ASSOCIATION_CLASS__MEMBER_END:
+			return !getMemberEnds().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__OWNED_END:
+			return !getOwnedEnds().isEmpty();
+		case UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END:
+			return !getNavigableOwnedEnds().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1224,26 +1107,26 @@
 			Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.ASSOCIATION_CLASS__RELATED_ELEMENT :
-					return UMLPackage.RELATIONSHIP__RELATED_ELEMENT;
-				default :
-					return -1;
+			case UMLPackage.ASSOCIATION_CLASS__RELATED_ELEMENT:
+				return UMLPackage.RELATIONSHIP__RELATED_ELEMENT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == Association.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.ASSOCIATION_CLASS__END_TYPE :
-					return UMLPackage.ASSOCIATION__END_TYPE;
-				case UMLPackage.ASSOCIATION_CLASS__IS_DERIVED :
-					return UMLPackage.ASSOCIATION__IS_DERIVED;
-				case UMLPackage.ASSOCIATION_CLASS__MEMBER_END :
-					return UMLPackage.ASSOCIATION__MEMBER_END;
-				case UMLPackage.ASSOCIATION_CLASS__OWNED_END :
-					return UMLPackage.ASSOCIATION__OWNED_END;
-				case UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END :
-					return UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END;
-				default :
-					return -1;
+			case UMLPackage.ASSOCIATION_CLASS__END_TYPE:
+				return UMLPackage.ASSOCIATION__END_TYPE;
+			case UMLPackage.ASSOCIATION_CLASS__IS_DERIVED:
+				return UMLPackage.ASSOCIATION__IS_DERIVED;
+			case UMLPackage.ASSOCIATION_CLASS__MEMBER_END:
+				return UMLPackage.ASSOCIATION__MEMBER_END;
+			case UMLPackage.ASSOCIATION_CLASS__OWNED_END:
+				return UMLPackage.ASSOCIATION__OWNED_END;
+			case UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END:
+				return UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -1259,26 +1142,26 @@
 			Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.RELATIONSHIP__RELATED_ELEMENT :
-					return UMLPackage.ASSOCIATION_CLASS__RELATED_ELEMENT;
-				default :
-					return -1;
+			case UMLPackage.RELATIONSHIP__RELATED_ELEMENT:
+				return UMLPackage.ASSOCIATION_CLASS__RELATED_ELEMENT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == Association.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.ASSOCIATION__END_TYPE :
-					return UMLPackage.ASSOCIATION_CLASS__END_TYPE;
-				case UMLPackage.ASSOCIATION__IS_DERIVED :
-					return UMLPackage.ASSOCIATION_CLASS__IS_DERIVED;
-				case UMLPackage.ASSOCIATION__MEMBER_END :
-					return UMLPackage.ASSOCIATION_CLASS__MEMBER_END;
-				case UMLPackage.ASSOCIATION__OWNED_END :
-					return UMLPackage.ASSOCIATION_CLASS__OWNED_END;
-				case UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END :
-					return UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END;
-				default :
-					return -1;
+			case UMLPackage.ASSOCIATION__END_TYPE:
+				return UMLPackage.ASSOCIATION_CLASS__END_TYPE;
+			case UMLPackage.ASSOCIATION__IS_DERIVED:
+				return UMLPackage.ASSOCIATION_CLASS__IS_DERIVED;
+			case UMLPackage.ASSOCIATION__MEMBER_END:
+				return UMLPackage.ASSOCIATION_CLASS__MEMBER_END;
+			case UMLPackage.ASSOCIATION__OWNED_END:
+				return UMLPackage.ASSOCIATION_CLASS__OWNED_END;
+			case UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END:
+				return UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1293,28 +1176,28 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (baseOperationID) {
-				default :
-					return -1;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == Association.class) {
 			switch (baseOperationID) {
-				case UMLPackage.ASSOCIATION___VALIDATE_SPECIALIZED_END_NUMBER__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.ASSOCIATION_CLASS___VALIDATE_SPECIALIZED_END_NUMBER__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.ASSOCIATION___VALIDATE_SPECIALIZED_END_TYPES__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.ASSOCIATION_CLASS___VALIDATE_SPECIALIZED_END_TYPES__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.ASSOCIATION___VALIDATE_BINARY_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.ASSOCIATION_CLASS___VALIDATE_BINARY_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.ASSOCIATION___VALIDATE_ASSOCIATION_ENDS__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.ASSOCIATION_CLASS___VALIDATE_ASSOCIATION_ENDS__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.ASSOCIATION___VALIDATE_ENDS_MUST_BE_TYPED__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.ASSOCIATION_CLASS___VALIDATE_ENDS_MUST_BE_TYPED__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.ASSOCIATION___IS_BINARY :
-					return UMLPackage.ASSOCIATION_CLASS___IS_BINARY;
-				case UMLPackage.ASSOCIATION___GET_END_TYPES :
-					return UMLPackage.ASSOCIATION_CLASS___GET_END_TYPES;
-				default :
-					return -1;
+			case UMLPackage.ASSOCIATION___VALIDATE_SPECIALIZED_END_NUMBER__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.ASSOCIATION_CLASS___VALIDATE_SPECIALIZED_END_NUMBER__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.ASSOCIATION___VALIDATE_SPECIALIZED_END_TYPES__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.ASSOCIATION_CLASS___VALIDATE_SPECIALIZED_END_TYPES__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.ASSOCIATION___VALIDATE_BINARY_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.ASSOCIATION_CLASS___VALIDATE_BINARY_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.ASSOCIATION___VALIDATE_ASSOCIATION_ENDS__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.ASSOCIATION_CLASS___VALIDATE_ASSOCIATION_ENDS__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.ASSOCIATION___VALIDATE_ENDS_MUST_BE_TYPED__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.ASSOCIATION_CLASS___VALIDATE_ENDS_MUST_BE_TYPED__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.ASSOCIATION___IS_BINARY:
+				return UMLPackage.ASSOCIATION_CLASS___IS_BINARY;
+			case UMLPackage.ASSOCIATION___GET_END_TYPES:
+				return UMLPackage.ASSOCIATION_CLASS___GET_END_TYPES;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -1330,334 +1213,259 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ASSOCIATION_CLASS___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ASSOCIATION_CLASS___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ASSOCIATION_CLASS___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ASSOCIATION_CLASS___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ASSOCIATION_CLASS___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___GET_MODEL :
-				return getModel();
-			case UMLPackage.ASSOCIATION_CLASS___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ASSOCIATION_CLASS___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ASSOCIATION_CLASS___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ASSOCIATION_CLASS___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ASSOCIATION_CLASS___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ASSOCIATION_CLASS___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ASSOCIATION_CLASS___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ASSOCIATION_CLASS___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ASSOCIATION_CLASS___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ASSOCIATION_CLASS___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ASSOCIATION_CLASS___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ASSOCIATION_CLASS___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ASSOCIATION_CLASS___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ASSOCIATION_CLASS___SEPARATOR :
-				return separator();
-			case UMLPackage.ASSOCIATION_CLASS___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.ASSOCIATION_CLASS___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.ASSOCIATION_CLASS___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.ASSOCIATION_CLASS___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.ASSOCIATION_CLASS___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.ASSOCIATION_CLASS___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.ASSOCIATION_CLASS___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.ASSOCIATION_CLASS___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.ASSOCIATION_CLASS___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.ASSOCIATION_CLASS___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.ASSOCIATION_CLASS___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.ASSOCIATION_CLASS___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.ASSOCIATION_CLASS___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.ASSOCIATION_CLASS___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.ASSOCIATION_CLASS___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.ASSOCIATION_CLASS___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.ASSOCIATION_CLASS___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.ASSOCIATION_CLASS___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.ASSOCIATION_CLASS___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___PARENTS :
-				return parents();
-			case UMLPackage.ASSOCIATION_CLASS___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.ASSOCIATION_CLASS___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.ASSOCIATION_CLASS___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.ASSOCIATION_CLASS___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.ASSOCIATION_CLASS___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.ASSOCIATION_CLASS___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.ASSOCIATION_CLASS___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.ASSOCIATION_CLASS___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.ASSOCIATION_CLASS___GET_PARTS :
-				return getParts();
-			case UMLPackage.ASSOCIATION_CLASS___ALL_ROLES :
-				return allRoles();
-			case UMLPackage.ASSOCIATION_CLASS___GET_OWNED_PORTS :
-				return getOwnedPorts();
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateClassBehavior((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___GET_ALL_IMPLEMENTED_INTERFACES :
-				return getAllImplementedInterfaces();
-			case UMLPackage.ASSOCIATION_CLASS___GET_IMPLEMENTED_INTERFACES :
-				return getImplementedInterfaces();
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP :
-				return validatePassiveClass((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
-			case UMLPackage.ASSOCIATION_CLASS___IS_METACLASS :
-				return isMetaclass();
-			case UMLPackage.ASSOCIATION_CLASS___GET_EXTENSIONS :
-				return getExtensions();
-			case UMLPackage.ASSOCIATION_CLASS___GET_SUPER_CLASSES :
-				return getSuperClasses();
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_SPECIALIZED_END_NUMBER__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializedEndNumber(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_SPECIALIZED_END_TYPES__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializedEndTypes(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_BINARY_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP :
-				return validateBinaryAssociations(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_ASSOCIATION_ENDS__DIAGNOSTICCHAIN_MAP :
-				return validateAssociationEnds(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_ENDS_MUST_BE_TYPED__DIAGNOSTICCHAIN_MAP :
-				return validateEndsMustBeTyped(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___IS_BINARY :
-				return isBinary();
-			case UMLPackage.ASSOCIATION_CLASS___GET_END_TYPES :
-				return getEndTypes();
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_CANNOT_BE_DEFINED__DIAGNOSTICCHAIN_MAP :
-				return validateCannotBeDefined(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION_CLASS___VALIDATE_DISJOINT_ATTRIBUTES_ENDS__DIAGNOSTICCHAIN_MAP :
-				return validateDisjointAttributesEnds(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ASSOCIATION_CLASS___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ASSOCIATION_CLASS___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ASSOCIATION_CLASS___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ASSOCIATION_CLASS___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___GET_MODEL:
+			return getModel();
+		case UMLPackage.ASSOCIATION_CLASS___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ASSOCIATION_CLASS___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ASSOCIATION_CLASS___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ASSOCIATION_CLASS___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ASSOCIATION_CLASS___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ASSOCIATION_CLASS___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ASSOCIATION_CLASS___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ASSOCIATION_CLASS___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ASSOCIATION_CLASS___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ASSOCIATION_CLASS___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ASSOCIATION_CLASS___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ASSOCIATION_CLASS___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ASSOCIATION_CLASS___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ASSOCIATION_CLASS___SEPARATOR:
+			return separator();
+		case UMLPackage.ASSOCIATION_CLASS___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.ASSOCIATION_CLASS___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.ASSOCIATION_CLASS___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.ASSOCIATION_CLASS___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.ASSOCIATION_CLASS___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.ASSOCIATION_CLASS___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.ASSOCIATION_CLASS___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.ASSOCIATION_CLASS___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.ASSOCIATION_CLASS___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.ASSOCIATION_CLASS___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.ASSOCIATION_CLASS___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.ASSOCIATION_CLASS___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.ASSOCIATION_CLASS___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.ASSOCIATION_CLASS___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.ASSOCIATION_CLASS___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.ASSOCIATION_CLASS___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.ASSOCIATION_CLASS___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.ASSOCIATION_CLASS___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.ASSOCIATION_CLASS___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___PARENTS:
+			return parents();
+		case UMLPackage.ASSOCIATION_CLASS___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.ASSOCIATION_CLASS___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.ASSOCIATION_CLASS___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.ASSOCIATION_CLASS___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.ASSOCIATION_CLASS___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.ASSOCIATION_CLASS___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.ASSOCIATION_CLASS___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.ASSOCIATION_CLASS___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.ASSOCIATION_CLASS___GET_PARTS:
+			return getParts();
+		case UMLPackage.ASSOCIATION_CLASS___ALL_ROLES:
+			return allRoles();
+		case UMLPackage.ASSOCIATION_CLASS___GET_OWNED_PORTS:
+			return getOwnedPorts();
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateClassBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___GET_ALL_IMPLEMENTED_INTERFACES:
+			return getAllImplementedInterfaces();
+		case UMLPackage.ASSOCIATION_CLASS___GET_IMPLEMENTED_INTERFACES:
+			return getImplementedInterfaces();
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP:
+			return validatePassiveClass((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.ASSOCIATION_CLASS___IS_METACLASS:
+			return isMetaclass();
+		case UMLPackage.ASSOCIATION_CLASS___GET_EXTENSIONS:
+			return getExtensions();
+		case UMLPackage.ASSOCIATION_CLASS___GET_SUPER_CLASSES:
+			return getSuperClasses();
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_SPECIALIZED_END_NUMBER__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializedEndNumber((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_SPECIALIZED_END_TYPES__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializedEndTypes((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_BINARY_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP:
+			return validateBinaryAssociations((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_ASSOCIATION_ENDS__DIAGNOSTICCHAIN_MAP:
+			return validateAssociationEnds((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_ENDS_MUST_BE_TYPED__DIAGNOSTICCHAIN_MAP:
+			return validateEndsMustBeTyped((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___IS_BINARY:
+			return isBinary();
+		case UMLPackage.ASSOCIATION_CLASS___GET_END_TYPES:
+			return getEndTypes();
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_CANNOT_BE_DEFINED__DIAGNOSTICCHAIN_MAP:
+			return validateCannotBeDefined((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION_CLASS___VALIDATE_DISJOINT_ATTRIBUTES_ENDS__DIAGNOSTICCHAIN_MAP:
+			return validateDisjointAttributesEnds((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1670,8 +1478,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] RELATED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.ASSOCIATION_CLASS__END_TYPE};
+	protected static final int[] RELATED_ELEMENT_ESUBSETS = new int[] { UMLPackage.ASSOCIATION_CLASS__END_TYPE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1690,7 +1497,7 @@
 	@Override
 	public boolean isSetMembers() {
 		return super.isSetMembers()
-			|| eIsSet(UMLPackage.ASSOCIATION_CLASS__MEMBER_END);
+				|| eIsSet(UMLPackage.ASSOCIATION_CLASS__MEMBER_END);
 	}
 
 	/**
@@ -1701,7 +1508,7 @@
 	@Override
 	public boolean isSetFeatures() {
 		return super.isSetFeatures()
-			|| eIsSet(UMLPackage.ASSOCIATION_CLASS__OWNED_END);
+				|| eIsSet(UMLPackage.ASSOCIATION_CLASS__OWNED_END);
 	}
 
 	/**
@@ -1712,7 +1519,7 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.ASSOCIATION_CLASS__OWNED_END);
+				|| eIsSet(UMLPackage.ASSOCIATION_CLASS__OWNED_END);
 	}
 
 	/**
@@ -1723,13 +1530,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] MEMBER_ESUBSETS = new int[]{
-		UMLPackage.ASSOCIATION_CLASS__OWNED_MEMBER,
-		UMLPackage.ASSOCIATION_CLASS__IMPORTED_MEMBER,
-		UMLPackage.ASSOCIATION_CLASS__FEATURE,
-		UMLPackage.ASSOCIATION_CLASS__INHERITED_MEMBER,
-		UMLPackage.ASSOCIATION_CLASS__ROLE,
-		UMLPackage.ASSOCIATION_CLASS__MEMBER_END};
+	protected static final int[] MEMBER_ESUBSETS = new int[] { UMLPackage.ASSOCIATION_CLASS__OWNED_MEMBER, UMLPackage.ASSOCIATION_CLASS__IMPORTED_MEMBER, UMLPackage.ASSOCIATION_CLASS__FEATURE, UMLPackage.ASSOCIATION_CLASS__INHERITED_MEMBER,
+			UMLPackage.ASSOCIATION_CLASS__ROLE, UMLPackage.ASSOCIATION_CLASS__MEMBER_END };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getFeatures() <em>Feature</em>}' reference list.
@@ -1739,12 +1541,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] FEATURE_ESUBSETS = new int[]{
-		UMLPackage.ASSOCIATION_CLASS__ATTRIBUTE,
-		UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR,
-		UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION,
-		UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION,
-		UMLPackage.ASSOCIATION_CLASS__OWNED_END};
+	protected static final int[] FEATURE_ESUBSETS = new int[] { UMLPackage.ASSOCIATION_CLASS__ATTRIBUTE, UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR, UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION, UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION,
+			UMLPackage.ASSOCIATION_CLASS__OWNED_END };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedMembers() <em>Owned Member</em>}' reference list.
@@ -1754,16 +1552,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.ASSOCIATION_CLASS__OWNED_RULE,
-		UMLPackage.ASSOCIATION_CLASS__OWNED_USE_CASE,
-		UMLPackage.ASSOCIATION_CLASS__OWNED_ATTRIBUTE,
-		UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR,
-		UMLPackage.ASSOCIATION_CLASS__OWNED_BEHAVIOR,
-		UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION,
-		UMLPackage.ASSOCIATION_CLASS__NESTED_CLASSIFIER,
-		UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION,
-		UMLPackage.ASSOCIATION_CLASS__OWNED_END};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.ASSOCIATION_CLASS__OWNED_RULE, UMLPackage.ASSOCIATION_CLASS__OWNED_USE_CASE, UMLPackage.ASSOCIATION_CLASS__OWNED_ATTRIBUTE, UMLPackage.ASSOCIATION_CLASS__OWNED_CONNECTOR,
+			UMLPackage.ASSOCIATION_CLASS__OWNED_BEHAVIOR, UMLPackage.ASSOCIATION_CLASS__OWNED_OPERATION, UMLPackage.ASSOCIATION_CLASS__NESTED_CLASSIFIER, UMLPackage.ASSOCIATION_CLASS__OWNED_RECEPTION, UMLPackage.ASSOCIATION_CLASS__OWNED_END };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getMemberEnds() <em>Member End</em>}' reference list.
@@ -1773,8 +1563,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] MEMBER_END_ESUBSETS = new int[]{
-		UMLPackage.ASSOCIATION_CLASS__OWNED_END};
+	protected static final int[] MEMBER_END_ESUBSETS = new int[] { UMLPackage.ASSOCIATION_CLASS__OWNED_END };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1792,12 +1581,10 @@
 	 */
 	public Property getMemberEnd(String name, Type type, boolean ignoreCase,
 			EClass eClass) {
-		memberEndLoop : for (Property memberEnd : getMemberEnds()) {
+		memberEndLoop: for (Property memberEnd : getMemberEnds()) {
 			if (eClass != null && !eClass.isInstance(memberEnd))
 				continue memberEndLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(memberEnd.getName())
-				: name.equals(memberEnd.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(memberEnd.getName()) : name.equals(memberEnd.getName())))
 				continue memberEndLoop;
 			if (type != null && !type.equals(memberEnd.getType()))
 				continue memberEndLoop;
@@ -1814,8 +1601,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_END_ESUBSETS = new int[]{
-		UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END};
+	protected static final int[] OWNED_END_ESUBSETS = new int[] { UMLPackage.ASSOCIATION_CLASS__NAVIGABLE_OWNED_END };
 
 	/**
 	 * The array of superset feature identifiers for the '{@link #getOwnedEnds() <em>Owned End</em>}' containment reference list.
@@ -1825,8 +1611,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_END_ESUPERSETS = new int[]{
-		UMLPackage.ASSOCIATION_CLASS__MEMBER_END};
+	protected static final int[] OWNED_END_ESUPERSETS = new int[] { UMLPackage.ASSOCIATION_CLASS__MEMBER_END };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1868,20 +1653,16 @@
 	 */
 	public Property getOwnedEnd(String name, Type type, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		ownedEndLoop : for (Property ownedEnd : getOwnedEnds()) {
+		ownedEndLoop: for (Property ownedEnd : getOwnedEnds()) {
 			if (eClass != null && !eClass.isInstance(ownedEnd))
 				continue ownedEndLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedEnd.getName())
-				: name.equals(ownedEnd.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedEnd.getName()) : name.equals(ownedEnd.getName())))
 				continue ownedEndLoop;
 			if (type != null && !type.equals(ownedEnd.getType()))
 				continue ownedEndLoop;
 			return ownedEnd;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedEnd(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedEnd(name, type, eClass) : null;
 	}
 
 	/**
@@ -1892,8 +1673,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] NAVIGABLE_OWNED_END_ESUPERSETS = new int[]{
-		UMLPackage.ASSOCIATION_CLASS__OWNED_END};
+	protected static final int[] NAVIGABLE_OWNED_END_ESUPERSETS = new int[] { UMLPackage.ASSOCIATION_CLASS__OWNED_END };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1917,8 +1697,7 @@
 	 * @generated
 	 */
 	public Property createNavigableOwnedEnd(String name, Type type) {
-		return createNavigableOwnedEnd(name, type,
-			UMLPackage.Literals.PROPERTY);
+		return createNavigableOwnedEnd(name, type, UMLPackage.Literals.PROPERTY);
 	}
 
 	/**
@@ -1937,20 +1716,16 @@
 	 */
 	public Property getNavigableOwnedEnd(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		navigableOwnedEndLoop : for (Property navigableOwnedEnd : getNavigableOwnedEnds()) {
+		navigableOwnedEndLoop: for (Property navigableOwnedEnd : getNavigableOwnedEnds()) {
 			if (eClass != null && !eClass.isInstance(navigableOwnedEnd))
 				continue navigableOwnedEndLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(navigableOwnedEnd.getName())
-				: name.equals(navigableOwnedEnd.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(navigableOwnedEnd.getName()) : name.equals(navigableOwnedEnd.getName())))
 				continue navigableOwnedEndLoop;
 			if (type != null && !type.equals(navigableOwnedEnd.getType()))
 				continue navigableOwnedEndLoop;
 			return navigableOwnedEnd;
 		}
-		return createOnDemand && eClass != null
-			? createNavigableOwnedEnd(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createNavigableOwnedEnd(name, type, eClass) : null;
 	}
 
 } //AssociationClassImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AssociationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AssociationImpl.java
index 716147c..25b5ce1 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AssociationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/AssociationImpl.java
@@ -1,37 +1,48 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
+
 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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectContainmentWithInverseEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectResolvingEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectWithInverseResolvingEList;
+
 import org.eclipse.uml2.uml.AggregationKind;
 import org.eclipse.uml2.uml.Association;
 import org.eclipse.uml2.uml.Classifier;
@@ -61,6 +72,7 @@
 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;
 
 /**
@@ -117,17 +129,9 @@
 		return UMLPackage.Literals.ASSOCIATION;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.ASSOCIATION__MEMBER_END) {
 			return createMemberEndsList();
 		}
@@ -153,21 +157,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> relatedElements = (EList<Element>) cache.get(
-				eResource, this,
-				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
+			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<Element>(
-						Element.class, this,
-						UMLPackage.ASSOCIATION__RELATED_ELEMENT,
-						RELATED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT, relatedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ASSOCIATION__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.ASSOCIATION__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ASSOCIATION__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -181,19 +177,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> members = (EList<NamedElement>) cache
-				.get(eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER);
+			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>(
-						NamedElement.class, this,
-						UMLPackage.ASSOCIATION__MEMBER, MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER, members = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.ASSOCIATION__MEMBER, MEMBER_ESUBSETS));
 			}
 			return members;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.ASSOCIATION__MEMBER, MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.ASSOCIATION__MEMBER, MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -207,19 +197,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Feature> features = (EList<Feature>) cache.get(eResource,
-				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
+			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>(
-						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>(Feature.class, this,
-			UMLPackage.ASSOCIATION__FEATURE, FEATURE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this, UMLPackage.ASSOCIATION__FEATURE, FEATURE_ESUBSETS);
 	}
 
 	/**
@@ -233,20 +217,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.ASSOCIATION__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.ASSOCIATION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.ASSOCIATION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.ASSOCIATION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -256,15 +233,13 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Property> getMemberEnds() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.ASSOCIATION__MEMBER_END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ASSOCIATION__MEMBER_END, true, true);
+		return (EList<Property>) eDynamicGet(UMLPackage.ASSOCIATION__MEMBER_END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ASSOCIATION__MEMBER_END, true, true);
 	}
 
 	private EList<Property> createMemberEndsList() {
 		return new SubsetSupersetEObjectWithInverseResolvingEList<Property>(
-			Property.class, this, UMLPackage.ASSOCIATION__MEMBER_END, null,
-			MEMBER_END_ESUBSETS, UMLPackage.PROPERTY__ASSOCIATION);
+				Property.class, this, UMLPackage.ASSOCIATION__MEMBER_END, null,
+				MEMBER_END_ESUBSETS, UMLPackage.PROPERTY__ASSOCIATION);
 	}
 
 	/**
@@ -274,16 +249,14 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Property> getOwnedEnds() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.ASSOCIATION__OWNED_END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ASSOCIATION__OWNED_END, true, true);
+		return (EList<Property>) eDynamicGet(UMLPackage.ASSOCIATION__OWNED_END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ASSOCIATION__OWNED_END, true, true);
 	}
 
 	private EList<Property> createOwnedEndsList() {
 		return new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Property>(
-			Property.class, this, UMLPackage.ASSOCIATION__OWNED_END,
-			OWNED_END_ESUPERSETS, OWNED_END_ESUBSETS,
-			UMLPackage.PROPERTY__OWNING_ASSOCIATION);
+				Property.class, this, UMLPackage.ASSOCIATION__OWNED_END,
+				OWNED_END_ESUPERSETS, OWNED_END_ESUBSETS,
+				UMLPackage.PROPERTY__OWNING_ASSOCIATION);
 	}
 
 	/**
@@ -292,9 +265,7 @@
 	 * @generated
 	 */
 	public boolean isDerived() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.ASSOCIATION__IS_DERIVED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ASSOCIATION__IS_DERIVED, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.ASSOCIATION__IS_DERIVED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ASSOCIATION__IS_DERIVED, true, true);
 	}
 
 	/**
@@ -303,8 +274,7 @@
 	 * @generated
 	 */
 	public void setIsDerived(boolean newIsDerived) {
-		eDynamicSet(UMLPackage.ASSOCIATION__IS_DERIVED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ASSOCIATION__IS_DERIVED, newIsDerived);
+		eDynamicSet(UMLPackage.ASSOCIATION__IS_DERIVED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ASSOCIATION__IS_DERIVED, newIsDerived);
 	}
 
 	/**
@@ -316,11 +286,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Type> result = (EList<Type>) cache.get(this,
-				UMLPackage.Literals.ASSOCIATION__END_TYPE);
+			EList<Type> result = (EList<Type>) cache.get(this, UMLPackage.Literals.ASSOCIATION__END_TYPE);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.ASSOCIATION__END_TYPE,
-					result = AssociationOperations.getEndTypes(this));
+				cache.put(this, UMLPackage.Literals.ASSOCIATION__END_TYPE, result = AssociationOperations.getEndTypes(this));
 			}
 			return result;
 		}
@@ -342,12 +310,10 @@
 	 * @generated
 	 */
 	public Type getEndType(String name, boolean ignoreCase, EClass eClass) {
-		endTypeLoop : for (Type endType : getEndTypes()) {
+		endTypeLoop: for (Type endType : getEndTypes()) {
 			if (eClass != null && !eClass.isInstance(endType))
 				continue endTypeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(endType.getName())
-				: name.equals(endType.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(endType.getName()) : name.equals(endType.getName())))
 				continue endTypeLoop;
 			return endType;
 		}
@@ -361,15 +327,13 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Property> getNavigableOwnedEnds() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ASSOCIATION__NAVIGABLE_OWNED_END, true, true);
+		return (EList<Property>) eDynamicGet(UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ASSOCIATION__NAVIGABLE_OWNED_END, true, true);
 	}
 
 	private EList<Property> createNavigableOwnedEndsList() {
 		return new SubsetSupersetEObjectResolvingEList<Property>(Property.class,
-			this, UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END,
-			NAVIGABLE_OWNED_END_ESUPERSETS, null);
+				this, UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END,
+				NAVIGABLE_OWNED_END_ESUPERSETS, null);
 	}
 
 	/**
@@ -379,8 +343,7 @@
 	 */
 	public boolean validateSpecializedEndNumber(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AssociationOperations.validateSpecializedEndNumber(this,
-			diagnostics, context);
+		return AssociationOperations.validateSpecializedEndNumber(this, diagnostics, context);
 	}
 
 	/**
@@ -390,8 +353,7 @@
 	 */
 	public boolean validateSpecializedEndTypes(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AssociationOperations.validateSpecializedEndTypes(this,
-			diagnostics, context);
+		return AssociationOperations.validateSpecializedEndTypes(this, diagnostics, context);
 	}
 
 	/**
@@ -401,8 +363,7 @@
 	 */
 	public boolean validateBinaryAssociations(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AssociationOperations.validateBinaryAssociations(this,
-			diagnostics, context);
+		return AssociationOperations.validateBinaryAssociations(this, diagnostics, context);
 	}
 
 	/**
@@ -412,8 +373,7 @@
 	 */
 	public boolean validateAssociationEnds(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AssociationOperations.validateAssociationEnds(this, diagnostics,
-			context);
+		return AssociationOperations.validateAssociationEnds(this, diagnostics, context);
 	}
 
 	/**
@@ -423,8 +383,7 @@
 	 */
 	public boolean validateEndsMustBeTyped(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return AssociationOperations.validateEndsMustBeTyped(this, diagnostics,
-			context);
+		return AssociationOperations.validateEndsMustBeTyped(this, diagnostics, context);
 	}
 
 	/**
@@ -446,62 +405,42 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ASSOCIATION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.ASSOCIATION__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__MEMBER_END :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getMemberEnds())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__OWNED_END :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedEnds())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__MEMBER_END:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getMemberEnds()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__OWNED_END:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedEnds()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -515,56 +454,42 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ASSOCIATION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ASSOCIATION__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.ASSOCIATION__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ASSOCIATION__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__MEMBER_END :
-				return ((InternalEList<?>) getMemberEnds())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ASSOCIATION__OWNED_END :
-				return ((InternalEList<?>) getOwnedEnds()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.ASSOCIATION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ASSOCIATION__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.ASSOCIATION__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__MEMBER_END:
+			return ((InternalEList<?>) getMemberEnds()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ASSOCIATION__OWNED_END:
+			return ((InternalEList<?>) getOwnedEnds()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -577,110 +502,110 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ASSOCIATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ASSOCIATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ASSOCIATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ASSOCIATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ASSOCIATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ASSOCIATION__NAME :
-				return getName();
-			case UMLPackage.ASSOCIATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ASSOCIATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ASSOCIATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ASSOCIATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ASSOCIATION__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.ASSOCIATION__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.ASSOCIATION__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.ASSOCIATION__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.ASSOCIATION__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.ASSOCIATION__MEMBER :
-				return getMembers();
-			case UMLPackage.ASSOCIATION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.ASSOCIATION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.ASSOCIATION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.ASSOCIATION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.ASSOCIATION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.ASSOCIATION__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.ASSOCIATION__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.ASSOCIATION__FEATURE :
-				return getFeatures();
-			case UMLPackage.ASSOCIATION__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.ASSOCIATION__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.ASSOCIATION__GENERAL :
-				return getGenerals();
-			case UMLPackage.ASSOCIATION__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.ASSOCIATION__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.ASSOCIATION__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.ASSOCIATION__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.ASSOCIATION__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.ASSOCIATION__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.ASSOCIATION__USE_CASE :
-				return getUseCases();
-			case UMLPackage.ASSOCIATION__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.ASSOCIATION__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.ASSOCIATION__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.ASSOCIATION__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.ASSOCIATION__END_TYPE :
-				return getEndTypes();
-			case UMLPackage.ASSOCIATION__IS_DERIVED :
-				return isDerived();
-			case UMLPackage.ASSOCIATION__MEMBER_END :
-				return getMemberEnds();
-			case UMLPackage.ASSOCIATION__OWNED_END :
-				return getOwnedEnds();
-			case UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END :
-				return getNavigableOwnedEnds();
+		case UMLPackage.ASSOCIATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ASSOCIATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ASSOCIATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ASSOCIATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ASSOCIATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ASSOCIATION__NAME:
+			return getName();
+		case UMLPackage.ASSOCIATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ASSOCIATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ASSOCIATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ASSOCIATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ASSOCIATION__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.ASSOCIATION__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.ASSOCIATION__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.ASSOCIATION__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.ASSOCIATION__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.ASSOCIATION__MEMBER:
+			return getMembers();
+		case UMLPackage.ASSOCIATION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.ASSOCIATION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.ASSOCIATION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.ASSOCIATION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.ASSOCIATION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.ASSOCIATION__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.ASSOCIATION__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.ASSOCIATION__FEATURE:
+			return getFeatures();
+		case UMLPackage.ASSOCIATION__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.ASSOCIATION__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.ASSOCIATION__GENERAL:
+			return getGenerals();
+		case UMLPackage.ASSOCIATION__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.ASSOCIATION__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.ASSOCIATION__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.ASSOCIATION__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.ASSOCIATION__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.ASSOCIATION__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.ASSOCIATION__USE_CASE:
+			return getUseCases();
+		case UMLPackage.ASSOCIATION__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.ASSOCIATION__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.ASSOCIATION__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.ASSOCIATION__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.ASSOCIATION__END_TYPE:
+			return getEndTypes();
+		case UMLPackage.ASSOCIATION__IS_DERIVED:
+			return isDerived();
+		case UMLPackage.ASSOCIATION__MEMBER_END:
+			return getMemberEnds();
+		case UMLPackage.ASSOCIATION__OWNED_END:
+			return getOwnedEnds();
+		case UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END:
+			return getNavigableOwnedEnds();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -694,126 +619,110 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ASSOCIATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__IS_DERIVED :
-				setIsDerived((Boolean) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__MEMBER_END :
-				getMemberEnds().clear();
-				getMemberEnds()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__OWNED_END :
-				getOwnedEnds().clear();
-				getOwnedEnds()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END :
-				getNavigableOwnedEnds().clear();
-				getNavigableOwnedEnds()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
+		case UMLPackage.ASSOCIATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__IS_DERIVED:
+			setIsDerived((Boolean) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__MEMBER_END:
+			getMemberEnds().clear();
+			getMemberEnds().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__OWNED_END:
+			getOwnedEnds().clear();
+			getOwnedEnds().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END:
+			getNavigableOwnedEnds().clear();
+			getNavigableOwnedEnds().addAll((Collection<? extends Property>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -826,93 +735,93 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ASSOCIATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ASSOCIATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ASSOCIATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ASSOCIATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ASSOCIATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ASSOCIATION__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.ASSOCIATION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.ASSOCIATION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.ASSOCIATION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.ASSOCIATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ASSOCIATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ASSOCIATION__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.ASSOCIATION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.ASSOCIATION__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.ASSOCIATION__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.ASSOCIATION__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.ASSOCIATION__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.ASSOCIATION__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.ASSOCIATION__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.ASSOCIATION__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.ASSOCIATION__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.ASSOCIATION__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.ASSOCIATION__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.ASSOCIATION__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.ASSOCIATION__IS_DERIVED :
-				setIsDerived(IS_DERIVED_EDEFAULT);
-				return;
-			case UMLPackage.ASSOCIATION__MEMBER_END :
-				getMemberEnds().clear();
-				return;
-			case UMLPackage.ASSOCIATION__OWNED_END :
-				getOwnedEnds().clear();
-				return;
-			case UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END :
-				getNavigableOwnedEnds().clear();
-				return;
+		case UMLPackage.ASSOCIATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ASSOCIATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ASSOCIATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ASSOCIATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ASSOCIATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ASSOCIATION__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.ASSOCIATION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.ASSOCIATION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.ASSOCIATION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.ASSOCIATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ASSOCIATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ASSOCIATION__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.ASSOCIATION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.ASSOCIATION__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.ASSOCIATION__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.ASSOCIATION__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.ASSOCIATION__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.ASSOCIATION__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.ASSOCIATION__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.ASSOCIATION__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.ASSOCIATION__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.ASSOCIATION__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.ASSOCIATION__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.ASSOCIATION__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.ASSOCIATION__IS_DERIVED:
+			setIsDerived(IS_DERIVED_EDEFAULT);
+			return;
+		case UMLPackage.ASSOCIATION__MEMBER_END:
+			getMemberEnds().clear();
+			return;
+		case UMLPackage.ASSOCIATION__OWNED_END:
+			getOwnedEnds().clear();
+			return;
+		case UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END:
+			getNavigableOwnedEnds().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -925,96 +834,94 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ASSOCIATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ASSOCIATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ASSOCIATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ASSOCIATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.ASSOCIATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ASSOCIATION__NAME :
-				return isSetName();
-			case UMLPackage.ASSOCIATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ASSOCIATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ASSOCIATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ASSOCIATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ASSOCIATION__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.ASSOCIATION__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.ASSOCIATION__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.ASSOCIATION__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.ASSOCIATION__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.ASSOCIATION__MEMBER :
-				return isSetMembers();
-			case UMLPackage.ASSOCIATION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.ASSOCIATION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.ASSOCIATION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.ASSOCIATION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.ASSOCIATION__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.ASSOCIATION__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.ASSOCIATION__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.ASSOCIATION__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.ASSOCIATION__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.ASSOCIATION__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.ASSOCIATION__GENERAL :
-				return !getGenerals().isEmpty();
-			case UMLPackage.ASSOCIATION__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.ASSOCIATION__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.ASSOCIATION__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.ASSOCIATION__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.ASSOCIATION__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.ASSOCIATION__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.ASSOCIATION__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.ASSOCIATION__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.ASSOCIATION__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.ASSOCIATION__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.ASSOCIATION__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.ASSOCIATION__END_TYPE :
-				return !getEndTypes().isEmpty();
-			case UMLPackage.ASSOCIATION__IS_DERIVED :
-				return isDerived() != IS_DERIVED_EDEFAULT;
-			case UMLPackage.ASSOCIATION__MEMBER_END :
-				return !getMemberEnds().isEmpty();
-			case UMLPackage.ASSOCIATION__OWNED_END :
-				return !getOwnedEnds().isEmpty();
-			case UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END :
-				return !getNavigableOwnedEnds().isEmpty();
+		case UMLPackage.ASSOCIATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ASSOCIATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ASSOCIATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ASSOCIATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.ASSOCIATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ASSOCIATION__NAME:
+			return isSetName();
+		case UMLPackage.ASSOCIATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ASSOCIATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ASSOCIATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ASSOCIATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ASSOCIATION__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.ASSOCIATION__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.ASSOCIATION__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.ASSOCIATION__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.ASSOCIATION__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.ASSOCIATION__MEMBER:
+			return isSetMembers();
+		case UMLPackage.ASSOCIATION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.ASSOCIATION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.ASSOCIATION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.ASSOCIATION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.ASSOCIATION__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.ASSOCIATION__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.ASSOCIATION__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.ASSOCIATION__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.ASSOCIATION__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.ASSOCIATION__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.ASSOCIATION__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.ASSOCIATION__GENERAL:
+			return !getGenerals().isEmpty();
+		case UMLPackage.ASSOCIATION__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.ASSOCIATION__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.ASSOCIATION__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.ASSOCIATION__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.ASSOCIATION__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.ASSOCIATION__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.ASSOCIATION__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.ASSOCIATION__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.ASSOCIATION__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.ASSOCIATION__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.ASSOCIATION__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.ASSOCIATION__END_TYPE:
+			return !getEndTypes().isEmpty();
+		case UMLPackage.ASSOCIATION__IS_DERIVED:
+			return isDerived() != IS_DERIVED_EDEFAULT;
+		case UMLPackage.ASSOCIATION__MEMBER_END:
+			return !getMemberEnds().isEmpty();
+		case UMLPackage.ASSOCIATION__OWNED_END:
+			return !getOwnedEnds().isEmpty();
+		case UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END:
+			return !getNavigableOwnedEnds().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1029,10 +936,10 @@
 			Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.ASSOCIATION__RELATED_ELEMENT :
-					return UMLPackage.RELATIONSHIP__RELATED_ELEMENT;
-				default :
-					return -1;
+			case UMLPackage.ASSOCIATION__RELATED_ELEMENT:
+				return UMLPackage.RELATIONSHIP__RELATED_ELEMENT;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -1048,10 +955,10 @@
 			Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.RELATIONSHIP__RELATED_ELEMENT :
-					return UMLPackage.ASSOCIATION__RELATED_ELEMENT;
-				default :
-					return -1;
+			case UMLPackage.RELATIONSHIP__RELATED_ELEMENT:
+				return UMLPackage.ASSOCIATION__RELATED_ELEMENT;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1067,296 +974,231 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ASSOCIATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ASSOCIATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ASSOCIATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ASSOCIATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ASSOCIATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ASSOCIATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ASSOCIATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ASSOCIATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.ASSOCIATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ASSOCIATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ASSOCIATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ASSOCIATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ASSOCIATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ASSOCIATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ASSOCIATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ASSOCIATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ASSOCIATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ASSOCIATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ASSOCIATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ASSOCIATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ASSOCIATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ASSOCIATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ASSOCIATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ASSOCIATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ASSOCIATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ASSOCIATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ASSOCIATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ASSOCIATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ASSOCIATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ASSOCIATION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ASSOCIATION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ASSOCIATION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ASSOCIATION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ASSOCIATION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ASSOCIATION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ASSOCIATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ASSOCIATION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ASSOCIATION___SEPARATOR :
-				return separator();
-			case UMLPackage.ASSOCIATION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ASSOCIATION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.ASSOCIATION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.ASSOCIATION___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.ASSOCIATION___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.ASSOCIATION___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.ASSOCIATION___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.ASSOCIATION___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.ASSOCIATION___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.ASSOCIATION___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.ASSOCIATION___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.ASSOCIATION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.ASSOCIATION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.ASSOCIATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.ASSOCIATION___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.ASSOCIATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.ASSOCIATION___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.ASSOCIATION___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.ASSOCIATION___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.ASSOCIATION___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.ASSOCIATION___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.ASSOCIATION___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.ASSOCIATION___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.ASSOCIATION___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.ASSOCIATION___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.ASSOCIATION___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.ASSOCIATION___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.ASSOCIATION___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.ASSOCIATION___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.ASSOCIATION___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.ASSOCIATION___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.ASSOCIATION___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.ASSOCIATION___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.ASSOCIATION___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.ASSOCIATION___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.ASSOCIATION___PARENTS :
-				return parents();
-			case UMLPackage.ASSOCIATION___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.ASSOCIATION___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.ASSOCIATION___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.ASSOCIATION___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.ASSOCIATION___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.ASSOCIATION___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.ASSOCIATION___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.ASSOCIATION___VALIDATE_SPECIALIZED_END_NUMBER__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializedEndNumber(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___VALIDATE_SPECIALIZED_END_TYPES__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializedEndTypes(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___VALIDATE_BINARY_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP :
-				return validateBinaryAssociations(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___VALIDATE_ASSOCIATION_ENDS__DIAGNOSTICCHAIN_MAP :
-				return validateAssociationEnds(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___VALIDATE_ENDS_MUST_BE_TYPED__DIAGNOSTICCHAIN_MAP :
-				return validateEndsMustBeTyped(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ASSOCIATION___IS_BINARY :
-				return isBinary();
-			case UMLPackage.ASSOCIATION___GET_END_TYPES :
-				return getEndTypes();
+		case UMLPackage.ASSOCIATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ASSOCIATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ASSOCIATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ASSOCIATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ASSOCIATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ASSOCIATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ASSOCIATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ASSOCIATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.ASSOCIATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ASSOCIATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ASSOCIATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ASSOCIATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ASSOCIATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ASSOCIATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ASSOCIATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ASSOCIATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ASSOCIATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ASSOCIATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ASSOCIATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ASSOCIATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ASSOCIATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ASSOCIATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ASSOCIATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ASSOCIATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ASSOCIATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ASSOCIATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ASSOCIATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ASSOCIATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ASSOCIATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ASSOCIATION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ASSOCIATION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ASSOCIATION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ASSOCIATION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ASSOCIATION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ASSOCIATION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ASSOCIATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ASSOCIATION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ASSOCIATION___SEPARATOR:
+			return separator();
+		case UMLPackage.ASSOCIATION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ASSOCIATION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.ASSOCIATION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.ASSOCIATION___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.ASSOCIATION___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.ASSOCIATION___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.ASSOCIATION___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.ASSOCIATION___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.ASSOCIATION___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.ASSOCIATION___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.ASSOCIATION___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.ASSOCIATION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.ASSOCIATION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.ASSOCIATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.ASSOCIATION___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.ASSOCIATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.ASSOCIATION___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.ASSOCIATION___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.ASSOCIATION___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.ASSOCIATION___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.ASSOCIATION___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.ASSOCIATION___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.ASSOCIATION___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.ASSOCIATION___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.ASSOCIATION___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.ASSOCIATION___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.ASSOCIATION___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.ASSOCIATION___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.ASSOCIATION___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.ASSOCIATION___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.ASSOCIATION___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.ASSOCIATION___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.ASSOCIATION___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.ASSOCIATION___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.ASSOCIATION___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.ASSOCIATION___PARENTS:
+			return parents();
+		case UMLPackage.ASSOCIATION___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.ASSOCIATION___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.ASSOCIATION___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.ASSOCIATION___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.ASSOCIATION___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.ASSOCIATION___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.ASSOCIATION___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.ASSOCIATION___VALIDATE_SPECIALIZED_END_NUMBER__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializedEndNumber((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___VALIDATE_SPECIALIZED_END_TYPES__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializedEndTypes((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___VALIDATE_BINARY_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP:
+			return validateBinaryAssociations((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___VALIDATE_ASSOCIATION_ENDS__DIAGNOSTICCHAIN_MAP:
+			return validateAssociationEnds((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___VALIDATE_ENDS_MUST_BE_TYPED__DIAGNOSTICCHAIN_MAP:
+			return validateEndsMustBeTyped((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ASSOCIATION___IS_BINARY:
+			return isBinary();
+		case UMLPackage.ASSOCIATION___GET_END_TYPES:
+			return getEndTypes();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1369,8 +1211,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] RELATED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.ASSOCIATION__END_TYPE};
+	protected static final int[] RELATED_ELEMENT_ESUBSETS = new int[] { UMLPackage.ASSOCIATION__END_TYPE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1389,7 +1230,7 @@
 	@Override
 	public boolean isSetMembers() {
 		return super.isSetMembers()
-			|| eIsSet(UMLPackage.ASSOCIATION__MEMBER_END);
+				|| eIsSet(UMLPackage.ASSOCIATION__MEMBER_END);
 	}
 
 	/**
@@ -1400,7 +1241,7 @@
 	@Override
 	public boolean isSetFeatures() {
 		return super.isSetFeatures()
-			|| eIsSet(UMLPackage.ASSOCIATION__OWNED_END);
+				|| eIsSet(UMLPackage.ASSOCIATION__OWNED_END);
 	}
 
 	/**
@@ -1411,7 +1252,7 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.ASSOCIATION__OWNED_END);
+				|| eIsSet(UMLPackage.ASSOCIATION__OWNED_END);
 	}
 
 	/**
@@ -1422,12 +1263,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] MEMBER_ESUBSETS = new int[]{
-		UMLPackage.ASSOCIATION__OWNED_MEMBER,
-		UMLPackage.ASSOCIATION__IMPORTED_MEMBER,
-		UMLPackage.ASSOCIATION__FEATURE,
-		UMLPackage.ASSOCIATION__INHERITED_MEMBER,
-		UMLPackage.ASSOCIATION__MEMBER_END};
+	protected static final int[] MEMBER_ESUBSETS = new int[] { UMLPackage.ASSOCIATION__OWNED_MEMBER, UMLPackage.ASSOCIATION__IMPORTED_MEMBER, UMLPackage.ASSOCIATION__FEATURE, UMLPackage.ASSOCIATION__INHERITED_MEMBER, UMLPackage.ASSOCIATION__MEMBER_END };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getFeatures() <em>Feature</em>}' reference list.
@@ -1437,8 +1273,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] FEATURE_ESUBSETS = new int[]{
-		UMLPackage.ASSOCIATION__ATTRIBUTE, UMLPackage.ASSOCIATION__OWNED_END};
+	protected static final int[] FEATURE_ESUBSETS = new int[] { UMLPackage.ASSOCIATION__ATTRIBUTE, UMLPackage.ASSOCIATION__OWNED_END };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedMembers() <em>Owned Member</em>}' reference list.
@@ -1448,10 +1283,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.ASSOCIATION__OWNED_RULE,
-		UMLPackage.ASSOCIATION__OWNED_USE_CASE,
-		UMLPackage.ASSOCIATION__OWNED_END};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.ASSOCIATION__OWNED_RULE, UMLPackage.ASSOCIATION__OWNED_USE_CASE, UMLPackage.ASSOCIATION__OWNED_END };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getMemberEnds() <em>Member End</em>}' reference list.
@@ -1461,8 +1293,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] MEMBER_END_ESUBSETS = new int[]{
-		UMLPackage.ASSOCIATION__OWNED_END};
+	protected static final int[] MEMBER_END_ESUBSETS = new int[] { UMLPackage.ASSOCIATION__OWNED_END };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1480,12 +1311,10 @@
 	 */
 	public Property getMemberEnd(String name, Type type, boolean ignoreCase,
 			EClass eClass) {
-		memberEndLoop : for (Property memberEnd : getMemberEnds()) {
+		memberEndLoop: for (Property memberEnd : getMemberEnds()) {
 			if (eClass != null && !eClass.isInstance(memberEnd))
 				continue memberEndLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(memberEnd.getName())
-				: name.equals(memberEnd.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(memberEnd.getName()) : name.equals(memberEnd.getName())))
 				continue memberEndLoop;
 			if (type != null && !type.equals(memberEnd.getType()))
 				continue memberEndLoop;
@@ -1502,8 +1331,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_END_ESUBSETS = new int[]{
-		UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END};
+	protected static final int[] OWNED_END_ESUBSETS = new int[] { UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END };
 
 	/**
 	 * The array of superset feature identifiers for the '{@link #getOwnedEnds() <em>Owned End</em>}' containment reference list.
@@ -1513,8 +1341,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_END_ESUPERSETS = new int[]{
-		UMLPackage.ASSOCIATION__MEMBER_END};
+	protected static final int[] OWNED_END_ESUPERSETS = new int[] { UMLPackage.ASSOCIATION__MEMBER_END };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1556,20 +1383,16 @@
 	 */
 	public Property getOwnedEnd(String name, Type type, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		ownedEndLoop : for (Property ownedEnd : getOwnedEnds()) {
+		ownedEndLoop: for (Property ownedEnd : getOwnedEnds()) {
 			if (eClass != null && !eClass.isInstance(ownedEnd))
 				continue ownedEndLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedEnd.getName())
-				: name.equals(ownedEnd.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedEnd.getName()) : name.equals(ownedEnd.getName())))
 				continue ownedEndLoop;
 			if (type != null && !type.equals(ownedEnd.getType()))
 				continue ownedEndLoop;
 			return ownedEnd;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedEnd(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedEnd(name, type, eClass) : null;
 	}
 
 	/**
@@ -1580,8 +1403,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] NAVIGABLE_OWNED_END_ESUPERSETS = new int[]{
-		UMLPackage.ASSOCIATION__OWNED_END};
+	protected static final int[] NAVIGABLE_OWNED_END_ESUPERSETS = new int[] { UMLPackage.ASSOCIATION__OWNED_END };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1605,8 +1427,7 @@
 	 * @generated
 	 */
 	public Property createNavigableOwnedEnd(String name, Type type) {
-		return createNavigableOwnedEnd(name, type,
-			UMLPackage.Literals.PROPERTY);
+		return createNavigableOwnedEnd(name, type, UMLPackage.Literals.PROPERTY);
 	}
 
 	/**
@@ -1625,20 +1446,16 @@
 	 */
 	public Property getNavigableOwnedEnd(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		navigableOwnedEndLoop : for (Property navigableOwnedEnd : getNavigableOwnedEnds()) {
+		navigableOwnedEndLoop: for (Property navigableOwnedEnd : getNavigableOwnedEnds()) {
 			if (eClass != null && !eClass.isInstance(navigableOwnedEnd))
 				continue navigableOwnedEndLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(navigableOwnedEnd.getName())
-				: name.equals(navigableOwnedEnd.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(navigableOwnedEnd.getName()) : name.equals(navigableOwnedEnd.getName())))
 				continue navigableOwnedEndLoop;
 			if (type != null && !type.equals(navigableOwnedEnd.getType()))
 				continue navigableOwnedEndLoop;
 			return navigableOwnedEnd;
 		}
-		return createOnDemand && eClass != null
-			? createNavigableOwnedEnd(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createNavigableOwnedEnd(name, type, eClass) : null;
 	}
 
 } //AssociationImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehaviorExecutionSpecificationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehaviorExecutionSpecificationImpl.java
index 634f1e5..0d05d6b 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehaviorExecutionSpecificationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehaviorExecutionSpecificationImpl.java
@@ -1,20 +1,27 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.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.Behavior;
 import org.eclipse.uml2.uml.BehaviorExecutionSpecification;
 import org.eclipse.uml2.uml.Comment;
@@ -69,11 +76,7 @@
 	 * @generated
 	 */
 	public Behavior getBehavior() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR,
-			true, true);
+		return (Behavior) eDynamicGet(UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR, true, true);
 	}
 
 	/**
@@ -82,11 +85,7 @@
 	 * @generated
 	 */
 	public Behavior basicGetBehavior() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR,
-			false, true);
+		return (Behavior) eDynamicGet(UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR, false, true);
 	}
 
 	/**
@@ -95,11 +94,7 @@
 	 * @generated
 	 */
 	public void setBehavior(Behavior newBehavior) {
-		eDynamicSet(
-			UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR,
-			newBehavior);
+		eDynamicSet(UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR, newBehavior);
 	}
 
 	/**
@@ -110,56 +105,56 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME :
-				return getName();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__COVERED :
-				return getCovereds();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND :
-				if (resolve)
-					return getEnclosingOperand();
-				return basicGetEnclosingOperand();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION :
-				if (resolve)
-					return getEnclosingInteraction();
-				return basicGetEnclosingInteraction();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__GENERAL_ORDERING :
-				return getGeneralOrderings();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__FINISH :
-				if (resolve)
-					return getFinish();
-				return basicGetFinish();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__START :
-				if (resolve)
-					return getStart();
-				return basicGetStart();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR :
-				if (resolve)
-					return getBehavior();
-				return basicGetBehavior();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME:
+			return getName();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__COVERED:
+			return getCovereds();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND:
+			if (resolve)
+				return getEnclosingOperand();
+			return basicGetEnclosingOperand();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION:
+			if (resolve)
+				return getEnclosingInteraction();
+			return basicGetEnclosingInteraction();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__GENERAL_ORDERING:
+			return getGeneralOrderings();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__FINISH:
+			if (resolve)
+				return getFinish();
+			return basicGetFinish();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__START:
+			if (resolve)
+				return getStart();
+			return basicGetStart();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR:
+			if (resolve)
+				return getBehavior();
+			return basicGetBehavior();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -173,49 +168,46 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__COVERED :
-				getCovereds().clear();
-				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) newValue);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				getGeneralOrderings()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__FINISH :
-				setFinish((OccurrenceSpecification) newValue);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__START :
-				setStart((OccurrenceSpecification) newValue);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR :
-				setBehavior((Behavior) newValue);
-				return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__COVERED:
+			getCovereds().clear();
+			getCovereds().addAll((Collection<? extends Lifeline>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) newValue);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			getGeneralOrderings().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__FINISH:
+			setFinish((OccurrenceSpecification) newValue);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__START:
+			setStart((OccurrenceSpecification) newValue);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR:
+			setBehavior((Behavior) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -228,42 +220,42 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__COVERED :
-				getCovereds().clear();
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) null);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) null);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__FINISH :
-				setFinish((OccurrenceSpecification) null);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__START :
-				setStart((OccurrenceSpecification) null);
-				return;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR :
-				setBehavior((Behavior) null);
-				return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__COVERED:
+			getCovereds().clear();
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) null);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) null);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__FINISH:
+			setFinish((OccurrenceSpecification) null);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__START:
+			setStart((OccurrenceSpecification) null);
+			return;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR:
+			setBehavior((Behavior) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -276,42 +268,40 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME :
-				return isSetName();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__COVERED :
-				return !getCovereds().isEmpty();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND :
-				return basicGetEnclosingOperand() != null;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION :
-				return basicGetEnclosingInteraction() != null;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__GENERAL_ORDERING :
-				return !getGeneralOrderings().isEmpty();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__FINISH :
-				return basicGetFinish() != null;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__START :
-				return basicGetStart() != null;
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR :
-				return basicGetBehavior() != null;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME:
+			return isSetName();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__COVERED:
+			return !getCovereds().isEmpty();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_OPERAND:
+			return basicGetEnclosingOperand() != null;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION:
+			return basicGetEnclosingInteraction() != null;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__GENERAL_ORDERING:
+			return !getGeneralOrderings().isEmpty();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__FINISH:
+			return basicGetFinish() != null;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__START:
+			return basicGetStart() != null;
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION__BEHAVIOR:
+			return basicGetBehavior() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehaviorImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehaviorImpl.java
index a199a60..ca81034 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehaviorImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehaviorImpl.java
@@ -1,15 +1,16 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -18,19 +19,29 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
+
 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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectContainmentWithInverseEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectResolvingEList;
+
 import org.eclipse.uml2.uml.AggregationKind;
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.BehavioralFeature;
@@ -66,6 +77,7 @@
 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;
 
 /**
@@ -125,17 +137,9 @@
 		return UMLPackage.Literals.BEHAVIOR;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.BEHAVIOR__REDEFINED_BEHAVIOR) {
 			return createRedefinedBehaviorsList();
 		}
@@ -170,20 +174,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.BEHAVIOR__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.BEHAVIOR__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.BEHAVIOR__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.BEHAVIOR__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -197,22 +194,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			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<Classifier>(
-						Classifier.class, this,
-						UMLPackage.BEHAVIOR__REDEFINITION_CONTEXT,
-						REDEFINITION_CONTEXT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
+						redefinitionContexts = new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.BEHAVIOR__REDEFINITION_CONTEXT, REDEFINITION_CONTEXT_ESUBSETS));
 			}
 			return redefinitionContexts;
 		}
-		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
-			UMLPackage.BEHAVIOR__REDEFINITION_CONTEXT,
-			REDEFINITION_CONTEXT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.BEHAVIOR__REDEFINITION_CONTEXT, REDEFINITION_CONTEXT_ESUBSETS);
 	}
 
 	/**
@@ -221,9 +210,7 @@
 	 * @generated
 	 */
 	public boolean isReentrant() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.BEHAVIOR__IS_REENTRANT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIOR__IS_REENTRANT, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.BEHAVIOR__IS_REENTRANT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIOR__IS_REENTRANT, true, true);
 	}
 
 	/**
@@ -232,8 +219,7 @@
 	 * @generated
 	 */
 	public void setIsReentrant(boolean newIsReentrant) {
-		eDynamicSet(UMLPackage.BEHAVIOR__IS_REENTRANT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIOR__IS_REENTRANT, newIsReentrant);
+		eDynamicSet(UMLPackage.BEHAVIOR__IS_REENTRANT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIOR__IS_REENTRANT, newIsReentrant);
 	}
 
 	/**
@@ -242,8 +228,7 @@
 	 * @generated
 	 */
 	public void unsetIsReentrant() {
-		eDynamicUnset(UMLPackage.BEHAVIOR__IS_REENTRANT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIOR__IS_REENTRANT);
+		eDynamicUnset(UMLPackage.BEHAVIOR__IS_REENTRANT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIOR__IS_REENTRANT);
 	}
 
 	/**
@@ -252,9 +237,7 @@
 	 * @generated
 	 */
 	public boolean isSetIsReentrant() {
-		return eDynamicIsSet(
-			UMLPackage.BEHAVIOR__IS_REENTRANT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIOR__IS_REENTRANT);
+		return eDynamicIsSet(UMLPackage.BEHAVIOR__IS_REENTRANT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIOR__IS_REENTRANT);
 	}
 
 	/**
@@ -264,15 +247,13 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Behavior> getRedefinedBehaviors() {
-		return (EList<Behavior>) eDynamicGet(
-			UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIOR__REDEFINED_BEHAVIOR, true, true);
+		return (EList<Behavior>) eDynamicGet(UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIOR__REDEFINED_BEHAVIOR, true, true);
 	}
 
 	private EList<Behavior> createRedefinedBehaviorsList() {
 		return new SubsetSupersetEObjectResolvingEList<Behavior>(Behavior.class,
-			this, UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR,
-			REDEFINED_BEHAVIOR_ESUPERSETS, null);
+				this, UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR,
+				REDEFINED_BEHAVIOR_ESUPERSETS, null);
 	}
 
 	/**
@@ -282,9 +263,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Parameter> getOwnedParameters() {
-		return (EList<Parameter>) eDynamicGet(
-			UMLPackage.BEHAVIOR__OWNED_PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIOR__OWNED_PARAMETER, true, true);
+		return (EList<Parameter>) eDynamicGet(UMLPackage.BEHAVIOR__OWNED_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIOR__OWNED_PARAMETER, true, true);
 	}
 
 	/**
@@ -293,8 +272,7 @@
 	 * @generated
 	 */
 	public Parameter createOwnedParameter(String name, Type type) {
-		Parameter newOwnedParameter = (Parameter) create(
-			UMLPackage.Literals.PARAMETER);
+		Parameter newOwnedParameter = (Parameter) create(UMLPackage.Literals.PARAMETER);
 		getOwnedParameters().add(newOwnedParameter);
 		if (name != null)
 			newOwnedParameter.setName(name);
@@ -319,18 +297,14 @@
 	 */
 	public Parameter getOwnedParameter(String name, Type type,
 			boolean ignoreCase, boolean createOnDemand) {
-		ownedParameterLoop : for (Parameter ownedParameter : getOwnedParameters()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedParameter.getName())
-				: name.equals(ownedParameter.getName())))
+		ownedParameterLoop: for (Parameter ownedParameter : getOwnedParameters()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedParameter.getName()) : name.equals(ownedParameter.getName())))
 				continue ownedParameterLoop;
 			if (type != null && !type.equals(ownedParameter.getType()))
 				continue ownedParameterLoop;
 			return ownedParameter;
 		}
-		return createOnDemand
-			? createOwnedParameter(name, type)
-			: null;
+		return createOnDemand ? createOwnedParameter(name, type) : null;
 	}
 
 	/**
@@ -340,9 +314,7 @@
 	 */
 	public BehavioredClassifier getContext() {
 		BehavioredClassifier context = basicGetContext();
-		return context != null && context.eIsProxy()
-			? (BehavioredClassifier) eResolveProxy((InternalEObject) context)
-			: context;
+		return context != null && context.eIsProxy() ? (BehavioredClassifier) eResolveProxy((InternalEObject) context) : context;
 	}
 
 	/**
@@ -361,16 +333,14 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Constraint> getPreconditions() {
-		return (EList<Constraint>) eDynamicGet(
-			UMLPackage.BEHAVIOR__PRECONDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIOR__PRECONDITION, true, true);
+		return (EList<Constraint>) eDynamicGet(UMLPackage.BEHAVIOR__PRECONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIOR__PRECONDITION, true, true);
 	}
 
 	@SuppressWarnings("serial")
 	private EList<Constraint> createPreconditionsList() {
 		return new SubsetSupersetEObjectResolvingEList<Constraint>(
-			Constraint.class, this, UMLPackage.BEHAVIOR__PRECONDITION,
-			PRECONDITION_ESUPERSETS, null) {
+				Constraint.class, this, UMLPackage.BEHAVIOR__PRECONDITION,
+				PRECONDITION_ESUPERSETS, null) {
 
 			@Override
 			protected boolean enforceSubsetConstraints() {
@@ -393,16 +363,14 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Constraint> getPostconditions() {
-		return (EList<Constraint>) eDynamicGet(
-			UMLPackage.BEHAVIOR__POSTCONDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIOR__POSTCONDITION, true, true);
+		return (EList<Constraint>) eDynamicGet(UMLPackage.BEHAVIOR__POSTCONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIOR__POSTCONDITION, true, true);
 	}
 
 	@SuppressWarnings("serial")
 	private EList<Constraint> createPostconditionsList() {
 		return new SubsetSupersetEObjectResolvingEList<Constraint>(
-			Constraint.class, this, UMLPackage.BEHAVIOR__POSTCONDITION,
-			POSTCONDITION_ESUPERSETS, null) {
+				Constraint.class, this, UMLPackage.BEHAVIOR__POSTCONDITION,
+				POSTCONDITION_ESUPERSETS, null) {
 
 			@Override
 			protected boolean enforceSubsetConstraints() {
@@ -425,9 +393,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ParameterSet> getOwnedParameterSets() {
-		return (EList<ParameterSet>) eDynamicGet(
-			UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIOR__OWNED_PARAMETER_SET, true, true);
+		return (EList<ParameterSet>) eDynamicGet(UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIOR__OWNED_PARAMETER_SET, true, true);
 	}
 
 	/**
@@ -436,8 +402,7 @@
 	 * @generated
 	 */
 	public ParameterSet createOwnedParameterSet(String name) {
-		ParameterSet newOwnedParameterSet = (ParameterSet) create(
-			UMLPackage.Literals.PARAMETER_SET);
+		ParameterSet newOwnedParameterSet = (ParameterSet) create(UMLPackage.Literals.PARAMETER_SET);
 		getOwnedParameterSets().add(newOwnedParameterSet);
 		if (name != null)
 			newOwnedParameterSet.setName(name);
@@ -460,16 +425,12 @@
 	 */
 	public ParameterSet getOwnedParameterSet(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedParameterSetLoop : for (ParameterSet ownedParameterSet : getOwnedParameterSets()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedParameterSet.getName())
-				: name.equals(ownedParameterSet.getName())))
+		ownedParameterSetLoop: for (ParameterSet ownedParameterSet : getOwnedParameterSets()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedParameterSet.getName()) : name.equals(ownedParameterSet.getName())))
 				continue ownedParameterSetLoop;
 			return ownedParameterSet;
 		}
-		return createOnDemand
-			? createOwnedParameterSet(name)
-			: null;
+		return createOnDemand ? createOwnedParameterSet(name) : null;
 	}
 
 	/**
@@ -478,9 +439,7 @@
 	 * @generated
 	 */
 	public BehavioralFeature getSpecification() {
-		return (BehavioralFeature) eDynamicGet(
-			UMLPackage.BEHAVIOR__SPECIFICATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIOR__SPECIFICATION, true, true);
+		return (BehavioralFeature) eDynamicGet(UMLPackage.BEHAVIOR__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIOR__SPECIFICATION, true, true);
 	}
 
 	/**
@@ -489,9 +448,7 @@
 	 * @generated
 	 */
 	public BehavioralFeature basicGetSpecification() {
-		return (BehavioralFeature) eDynamicGet(
-			UMLPackage.BEHAVIOR__SPECIFICATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIOR__SPECIFICATION, false, true);
+		return (BehavioralFeature) eDynamicGet(UMLPackage.BEHAVIOR__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIOR__SPECIFICATION, false, true);
 	}
 
 	/**
@@ -501,8 +458,7 @@
 	 */
 	public NotificationChain basicSetSpecification(
 			BehavioralFeature newSpecification, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newSpecification,
-			UMLPackage.BEHAVIOR__SPECIFICATION, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newSpecification, UMLPackage.BEHAVIOR__SPECIFICATION, msgs);
 		return msgs;
 	}
 
@@ -512,8 +468,7 @@
 	 * @generated
 	 */
 	public void setSpecification(BehavioralFeature newSpecification) {
-		eDynamicSet(UMLPackage.BEHAVIOR__SPECIFICATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIOR__SPECIFICATION, newSpecification);
+		eDynamicSet(UMLPackage.BEHAVIOR__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIOR__SPECIFICATION, newSpecification);
 	}
 
 	/**
@@ -523,8 +478,7 @@
 	 */
 	public boolean validateParametersMatch(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return BehaviorOperations.validateParametersMatch(this, diagnostics,
-			context);
+		return BehaviorOperations.validateParametersMatch(this, diagnostics, context);
 	}
 
 	/**
@@ -534,8 +488,7 @@
 	 */
 	public boolean validateFeatureOfContextClassifier(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return BehaviorOperations.validateFeatureOfContextClassifier(this,
-			diagnostics, context);
+		return BehaviorOperations.validateFeatureOfContextClassifier(this, diagnostics, context);
 	}
 
 	/**
@@ -556,11 +509,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Parameter> result = (EList<Parameter>) cache.get(this,
-				UMLPackage.Literals.BEHAVIOR___INPUT_PARAMETERS);
+			EList<Parameter> result = (EList<Parameter>) cache.get(this, UMLPackage.Literals.BEHAVIOR___INPUT_PARAMETERS);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.BEHAVIOR___INPUT_PARAMETERS,
-					result = BehaviorOperations.inputParameters(this));
+				cache.put(this, UMLPackage.Literals.BEHAVIOR___INPUT_PARAMETERS, result = BehaviorOperations.inputParameters(this));
 			}
 			return result;
 		}
@@ -576,12 +527,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Parameter> result = (EList<Parameter>) cache.get(this,
-				UMLPackage.Literals.BEHAVIOR___OUTPUT_PARAMETERS);
+			EList<Parameter> result = (EList<Parameter>) cache.get(this, UMLPackage.Literals.BEHAVIOR___OUTPUT_PARAMETERS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.BEHAVIOR___OUTPUT_PARAMETERS,
-					result = BehaviorOperations.outputParameters(this));
+				cache.put(this, UMLPackage.Literals.BEHAVIOR___OUTPUT_PARAMETERS, result = BehaviorOperations.outputParameters(this));
 			}
 			return result;
 		}
@@ -598,71 +546,47 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIOR__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.BEHAVIOR__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this,
-							EOPPOSITE_FEATURE_BASE
-								- UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__INTERFACE_REALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__OWNED_OPERATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__SPECIFICATION :
-				BehavioralFeature specification = basicGetSpecification();
-				if (specification != null)
-					msgs = ((InternalEObject) specification).eInverseRemove(
-						this, UMLPackage.BEHAVIORAL_FEATURE__METHOD,
-						BehavioralFeature.class, msgs);
-				return basicSetSpecification((BehavioralFeature) otherEnd,
-					msgs);
+		case UMLPackage.BEHAVIOR__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__INTERFACE_REALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__OWNED_OPERATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__SPECIFICATION:
+			BehavioralFeature specification = basicGetSpecification();
+			if (specification != null)
+				msgs = ((InternalEObject) specification).eInverseRemove(this, UMLPackage.BEHAVIORAL_FEATURE__METHOD, BehavioralFeature.class, msgs);
+			return basicSetSpecification((BehavioralFeature) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -676,79 +600,58 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIOR__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.BEHAVIOR__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.BEHAVIOR__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.BEHAVIOR__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__OWNED_CONNECTOR :
-				return ((InternalEList<?>) getOwnedConnectors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__INTERFACE_REALIZATION :
-				return ((InternalEList<?>) getInterfaceRealizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__OWNED_BEHAVIOR :
-				return ((InternalEList<?>) getOwnedBehaviors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__OWNED_OPERATION :
-				return ((InternalEList<?>) getOwnedOperations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__NESTED_CLASSIFIER :
-				return ((InternalEList<?>) getNestedClassifiers())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__OWNED_RECEPTION :
-				return ((InternalEList<?>) getOwnedReceptions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__SPECIFICATION :
-				return basicSetSpecification(null, msgs);
-			case UMLPackage.BEHAVIOR__OWNED_PARAMETER :
-				return ((InternalEList<?>) getOwnedParameters())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET :
-				return ((InternalEList<?>) getOwnedParameterSets())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.BEHAVIOR__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.BEHAVIOR__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__OWNED_CONNECTOR:
+			return ((InternalEList<?>) getOwnedConnectors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__INTERFACE_REALIZATION:
+			return ((InternalEList<?>) getInterfaceRealizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__OWNED_BEHAVIOR:
+			return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__OWNED_OPERATION:
+			return ((InternalEList<?>) getOwnedOperations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__NESTED_CLASSIFIER:
+			return ((InternalEList<?>) getNestedClassifiers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__OWNED_RECEPTION:
+			return ((InternalEList<?>) getOwnedReceptions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__SPECIFICATION:
+			return basicSetSpecification(null, msgs);
+		case UMLPackage.BEHAVIOR__OWNED_PARAMETER:
+			return ((InternalEList<?>) getOwnedParameters()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET:
+			return ((InternalEList<?>) getOwnedParameterSets()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -761,148 +664,148 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIOR__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.BEHAVIOR__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.BEHAVIOR__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.BEHAVIOR__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.BEHAVIOR__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.BEHAVIOR__NAME :
-				return getName();
-			case UMLPackage.BEHAVIOR__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.BEHAVIOR__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.BEHAVIOR__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.BEHAVIOR__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.BEHAVIOR__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.BEHAVIOR__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.BEHAVIOR__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.BEHAVIOR__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.BEHAVIOR__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.BEHAVIOR__MEMBER :
-				return getMembers();
-			case UMLPackage.BEHAVIOR__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.BEHAVIOR__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.BEHAVIOR__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.BEHAVIOR__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.BEHAVIOR__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.BEHAVIOR__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.BEHAVIOR__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.BEHAVIOR__FEATURE :
-				return getFeatures();
-			case UMLPackage.BEHAVIOR__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.BEHAVIOR__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.BEHAVIOR__GENERAL :
-				return getGenerals();
-			case UMLPackage.BEHAVIOR__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.BEHAVIOR__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.BEHAVIOR__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.BEHAVIOR__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.BEHAVIOR__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.BEHAVIOR__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.BEHAVIOR__USE_CASE :
-				return getUseCases();
-			case UMLPackage.BEHAVIOR__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.BEHAVIOR__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.BEHAVIOR__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.BEHAVIOR__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.BEHAVIOR__OWNED_CONNECTOR :
-				return getOwnedConnectors();
-			case UMLPackage.BEHAVIOR__PART :
-				return getParts();
-			case UMLPackage.BEHAVIOR__ROLE :
-				return getRoles();
-			case UMLPackage.BEHAVIOR__OWNED_PORT :
-				return getOwnedPorts();
-			case UMLPackage.BEHAVIOR__CLASSIFIER_BEHAVIOR :
-				if (resolve)
-					return getClassifierBehavior();
-				return basicGetClassifierBehavior();
-			case UMLPackage.BEHAVIOR__INTERFACE_REALIZATION :
-				return getInterfaceRealizations();
-			case UMLPackage.BEHAVIOR__OWNED_BEHAVIOR :
-				return getOwnedBehaviors();
-			case UMLPackage.BEHAVIOR__OWNED_OPERATION :
-				return getOwnedOperations();
-			case UMLPackage.BEHAVIOR__EXTENSION :
-				return getExtensions();
-			case UMLPackage.BEHAVIOR__IS_ACTIVE :
-				return isActive();
-			case UMLPackage.BEHAVIOR__NESTED_CLASSIFIER :
-				return getNestedClassifiers();
-			case UMLPackage.BEHAVIOR__OWNED_RECEPTION :
-				return getOwnedReceptions();
-			case UMLPackage.BEHAVIOR__SUPER_CLASS :
-				return getSuperClasses();
-			case UMLPackage.BEHAVIOR__SPECIFICATION :
-				if (resolve)
-					return getSpecification();
-				return basicGetSpecification();
-			case UMLPackage.BEHAVIOR__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.BEHAVIOR__IS_REENTRANT :
-				return isReentrant();
-			case UMLPackage.BEHAVIOR__OWNED_PARAMETER :
-				return getOwnedParameters();
-			case UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET :
-				return getOwnedParameterSets();
-			case UMLPackage.BEHAVIOR__POSTCONDITION :
-				return getPostconditions();
-			case UMLPackage.BEHAVIOR__PRECONDITION :
-				return getPreconditions();
-			case UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR :
-				return getRedefinedBehaviors();
+		case UMLPackage.BEHAVIOR__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.BEHAVIOR__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.BEHAVIOR__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.BEHAVIOR__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.BEHAVIOR__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.BEHAVIOR__NAME:
+			return getName();
+		case UMLPackage.BEHAVIOR__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.BEHAVIOR__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.BEHAVIOR__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.BEHAVIOR__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.BEHAVIOR__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.BEHAVIOR__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.BEHAVIOR__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.BEHAVIOR__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.BEHAVIOR__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.BEHAVIOR__MEMBER:
+			return getMembers();
+		case UMLPackage.BEHAVIOR__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.BEHAVIOR__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.BEHAVIOR__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.BEHAVIOR__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.BEHAVIOR__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.BEHAVIOR__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.BEHAVIOR__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.BEHAVIOR__FEATURE:
+			return getFeatures();
+		case UMLPackage.BEHAVIOR__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.BEHAVIOR__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.BEHAVIOR__GENERAL:
+			return getGenerals();
+		case UMLPackage.BEHAVIOR__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.BEHAVIOR__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.BEHAVIOR__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.BEHAVIOR__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.BEHAVIOR__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.BEHAVIOR__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.BEHAVIOR__USE_CASE:
+			return getUseCases();
+		case UMLPackage.BEHAVIOR__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.BEHAVIOR__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.BEHAVIOR__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.BEHAVIOR__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.BEHAVIOR__OWNED_CONNECTOR:
+			return getOwnedConnectors();
+		case UMLPackage.BEHAVIOR__PART:
+			return getParts();
+		case UMLPackage.BEHAVIOR__ROLE:
+			return getRoles();
+		case UMLPackage.BEHAVIOR__OWNED_PORT:
+			return getOwnedPorts();
+		case UMLPackage.BEHAVIOR__CLASSIFIER_BEHAVIOR:
+			if (resolve)
+				return getClassifierBehavior();
+			return basicGetClassifierBehavior();
+		case UMLPackage.BEHAVIOR__INTERFACE_REALIZATION:
+			return getInterfaceRealizations();
+		case UMLPackage.BEHAVIOR__OWNED_BEHAVIOR:
+			return getOwnedBehaviors();
+		case UMLPackage.BEHAVIOR__OWNED_OPERATION:
+			return getOwnedOperations();
+		case UMLPackage.BEHAVIOR__EXTENSION:
+			return getExtensions();
+		case UMLPackage.BEHAVIOR__IS_ACTIVE:
+			return isActive();
+		case UMLPackage.BEHAVIOR__NESTED_CLASSIFIER:
+			return getNestedClassifiers();
+		case UMLPackage.BEHAVIOR__OWNED_RECEPTION:
+			return getOwnedReceptions();
+		case UMLPackage.BEHAVIOR__SUPER_CLASS:
+			return getSuperClasses();
+		case UMLPackage.BEHAVIOR__SPECIFICATION:
+			if (resolve)
+				return getSpecification();
+			return basicGetSpecification();
+		case UMLPackage.BEHAVIOR__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.BEHAVIOR__IS_REENTRANT:
+			return isReentrant();
+		case UMLPackage.BEHAVIOR__OWNED_PARAMETER:
+			return getOwnedParameters();
+		case UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET:
+			return getOwnedParameterSets();
+		case UMLPackage.BEHAVIOR__POSTCONDITION:
+			return getPostconditions();
+		case UMLPackage.BEHAVIOR__PRECONDITION:
+			return getPreconditions();
+		case UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR:
+			return getRedefinedBehaviors();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -916,185 +819,159 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIOR__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				getOwnedConnectors()
-					.addAll((Collection<? extends Connector>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll(
-					(Collection<? extends InterfaceRealization>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				getOwnedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__IS_ACTIVE :
-				setIsActive((Boolean) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				getNestedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				getOwnedReceptions()
-					.addAll((Collection<? extends Reception>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__SUPER_CLASS :
-				getSuperClasses().clear();
-				getSuperClasses().addAll(
-					(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__SPECIFICATION :
-				setSpecification((BehavioralFeature) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__IS_REENTRANT :
-				setIsReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				getOwnedParameters()
-					.addAll((Collection<? extends Parameter>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				getOwnedParameterSets()
-					.addAll((Collection<? extends ParameterSet>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__POSTCONDITION :
-				getPostconditions().clear();
-				getPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__PRECONDITION :
-				getPreconditions().clear();
-				getPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR :
-				getRedefinedBehaviors().clear();
-				getRedefinedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
+		case UMLPackage.BEHAVIOR__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			getOwnedConnectors().addAll((Collection<? extends Connector>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			getInterfaceRealizations().addAll((Collection<? extends InterfaceRealization>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			getOwnedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__IS_ACTIVE:
+			setIsActive((Boolean) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			getNestedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			getOwnedReceptions().addAll((Collection<? extends Reception>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__SUPER_CLASS:
+			getSuperClasses().clear();
+			getSuperClasses().addAll((Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__SPECIFICATION:
+			setSpecification((BehavioralFeature) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__IS_REENTRANT:
+			setIsReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			getOwnedParameters().addAll((Collection<? extends Parameter>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			getOwnedParameterSets().addAll((Collection<? extends ParameterSet>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__POSTCONDITION:
+			getPostconditions().clear();
+			getPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__PRECONDITION:
+			getPreconditions().clear();
+			getPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR:
+			getRedefinedBehaviors().clear();
+			getRedefinedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -1107,132 +984,132 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIOR__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.BEHAVIOR__NAME :
-				unsetName();
-				return;
-			case UMLPackage.BEHAVIOR__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.BEHAVIOR__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.BEHAVIOR__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.BEHAVIOR__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.BEHAVIOR__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.BEHAVIOR__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.BEHAVIOR__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.BEHAVIOR__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.BEHAVIOR__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.BEHAVIOR__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.BEHAVIOR__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.BEHAVIOR__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.BEHAVIOR__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.BEHAVIOR__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.BEHAVIOR__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.BEHAVIOR__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.BEHAVIOR__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.BEHAVIOR__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.BEHAVIOR__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				return;
-			case UMLPackage.BEHAVIOR__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) null);
-				return;
-			case UMLPackage.BEHAVIOR__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
-			case UMLPackage.BEHAVIOR__IS_ACTIVE :
-				setIsActive(IS_ACTIVE_EDEFAULT);
-				return;
-			case UMLPackage.BEHAVIOR__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				return;
-			case UMLPackage.BEHAVIOR__SUPER_CLASS :
-				getSuperClasses().clear();
-				return;
-			case UMLPackage.BEHAVIOR__SPECIFICATION :
-				setSpecification((BehavioralFeature) null);
-				return;
-			case UMLPackage.BEHAVIOR__IS_REENTRANT :
-				unsetIsReentrant();
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				return;
-			case UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				return;
-			case UMLPackage.BEHAVIOR__POSTCONDITION :
-				getPostconditions().clear();
-				return;
-			case UMLPackage.BEHAVIOR__PRECONDITION :
-				getPreconditions().clear();
-				return;
-			case UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR :
-				getRedefinedBehaviors().clear();
-				return;
+		case UMLPackage.BEHAVIOR__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.BEHAVIOR__NAME:
+			unsetName();
+			return;
+		case UMLPackage.BEHAVIOR__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.BEHAVIOR__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.BEHAVIOR__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.BEHAVIOR__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.BEHAVIOR__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.BEHAVIOR__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.BEHAVIOR__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.BEHAVIOR__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.BEHAVIOR__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.BEHAVIOR__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.BEHAVIOR__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.BEHAVIOR__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.BEHAVIOR__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.BEHAVIOR__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.BEHAVIOR__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.BEHAVIOR__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.BEHAVIOR__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.BEHAVIOR__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.BEHAVIOR__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			return;
+		case UMLPackage.BEHAVIOR__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) null);
+			return;
+		case UMLPackage.BEHAVIOR__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
+		case UMLPackage.BEHAVIOR__IS_ACTIVE:
+			setIsActive(IS_ACTIVE_EDEFAULT);
+			return;
+		case UMLPackage.BEHAVIOR__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			return;
+		case UMLPackage.BEHAVIOR__SUPER_CLASS:
+			getSuperClasses().clear();
+			return;
+		case UMLPackage.BEHAVIOR__SPECIFICATION:
+			setSpecification((BehavioralFeature) null);
+			return;
+		case UMLPackage.BEHAVIOR__IS_REENTRANT:
+			unsetIsReentrant();
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			return;
+		case UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			return;
+		case UMLPackage.BEHAVIOR__POSTCONDITION:
+			getPostconditions().clear();
+			return;
+		case UMLPackage.BEHAVIOR__PRECONDITION:
+			getPreconditions().clear();
+			return;
+		case UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR:
+			getRedefinedBehaviors().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1245,128 +1122,126 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIOR__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.BEHAVIOR__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.BEHAVIOR__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.BEHAVIOR__OWNER :
-				return isSetOwner();
-			case UMLPackage.BEHAVIOR__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.BEHAVIOR__NAME :
-				return isSetName();
-			case UMLPackage.BEHAVIOR__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.BEHAVIOR__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.BEHAVIOR__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.BEHAVIOR__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.BEHAVIOR__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.BEHAVIOR__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.BEHAVIOR__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.BEHAVIOR__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.BEHAVIOR__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.BEHAVIOR__MEMBER :
-				return isSetMembers();
-			case UMLPackage.BEHAVIOR__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.BEHAVIOR__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.BEHAVIOR__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.BEHAVIOR__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.BEHAVIOR__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.BEHAVIOR__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.BEHAVIOR__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.BEHAVIOR__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.BEHAVIOR__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.BEHAVIOR__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.BEHAVIOR__GENERAL :
-				return isSetGenerals();
-			case UMLPackage.BEHAVIOR__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.BEHAVIOR__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.BEHAVIOR__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.BEHAVIOR__IS_ABSTRACT :
-				return isSetIsAbstract();
-			case UMLPackage.BEHAVIOR__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.BEHAVIOR__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.BEHAVIOR__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.BEHAVIOR__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.BEHAVIOR__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.BEHAVIOR__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.BEHAVIOR__OWNED_ATTRIBUTE :
-				return isSetOwnedAttributes();
-			case UMLPackage.BEHAVIOR__OWNED_CONNECTOR :
-				return !getOwnedConnectors().isEmpty();
-			case UMLPackage.BEHAVIOR__PART :
-				return !getParts().isEmpty();
-			case UMLPackage.BEHAVIOR__ROLE :
-				return isSetRoles();
-			case UMLPackage.BEHAVIOR__OWNED_PORT :
-				return !getOwnedPorts().isEmpty();
-			case UMLPackage.BEHAVIOR__CLASSIFIER_BEHAVIOR :
-				return basicGetClassifierBehavior() != null;
-			case UMLPackage.BEHAVIOR__INTERFACE_REALIZATION :
-				return !getInterfaceRealizations().isEmpty();
-			case UMLPackage.BEHAVIOR__OWNED_BEHAVIOR :
-				return !getOwnedBehaviors().isEmpty();
-			case UMLPackage.BEHAVIOR__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
-			case UMLPackage.BEHAVIOR__EXTENSION :
-				return !getExtensions().isEmpty();
-			case UMLPackage.BEHAVIOR__IS_ACTIVE :
-				return isActive() != IS_ACTIVE_EDEFAULT;
-			case UMLPackage.BEHAVIOR__NESTED_CLASSIFIER :
-				return !getNestedClassifiers().isEmpty();
-			case UMLPackage.BEHAVIOR__OWNED_RECEPTION :
-				return !getOwnedReceptions().isEmpty();
-			case UMLPackage.BEHAVIOR__SUPER_CLASS :
-				return isSetSuperClasses();
-			case UMLPackage.BEHAVIOR__SPECIFICATION :
-				return basicGetSpecification() != null;
-			case UMLPackage.BEHAVIOR__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.BEHAVIOR__IS_REENTRANT :
-				return isSetIsReentrant();
-			case UMLPackage.BEHAVIOR__OWNED_PARAMETER :
-				return !getOwnedParameters().isEmpty();
-			case UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET :
-				return !getOwnedParameterSets().isEmpty();
-			case UMLPackage.BEHAVIOR__POSTCONDITION :
-				return !getPostconditions().isEmpty();
-			case UMLPackage.BEHAVIOR__PRECONDITION :
-				return !getPreconditions().isEmpty();
-			case UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR :
-				return !getRedefinedBehaviors().isEmpty();
+		case UMLPackage.BEHAVIOR__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.BEHAVIOR__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.BEHAVIOR__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.BEHAVIOR__OWNER:
+			return isSetOwner();
+		case UMLPackage.BEHAVIOR__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.BEHAVIOR__NAME:
+			return isSetName();
+		case UMLPackage.BEHAVIOR__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.BEHAVIOR__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.BEHAVIOR__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.BEHAVIOR__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.BEHAVIOR__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.BEHAVIOR__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.BEHAVIOR__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.BEHAVIOR__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.BEHAVIOR__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.BEHAVIOR__MEMBER:
+			return isSetMembers();
+		case UMLPackage.BEHAVIOR__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.BEHAVIOR__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.BEHAVIOR__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.BEHAVIOR__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.BEHAVIOR__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.BEHAVIOR__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.BEHAVIOR__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.BEHAVIOR__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.BEHAVIOR__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.BEHAVIOR__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.BEHAVIOR__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.BEHAVIOR__GENERAL:
+			return isSetGenerals();
+		case UMLPackage.BEHAVIOR__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.BEHAVIOR__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.BEHAVIOR__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.BEHAVIOR__IS_ABSTRACT:
+			return isSetIsAbstract();
+		case UMLPackage.BEHAVIOR__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.BEHAVIOR__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.BEHAVIOR__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.BEHAVIOR__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.BEHAVIOR__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.BEHAVIOR__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.BEHAVIOR__OWNED_ATTRIBUTE:
+			return isSetOwnedAttributes();
+		case UMLPackage.BEHAVIOR__OWNED_CONNECTOR:
+			return !getOwnedConnectors().isEmpty();
+		case UMLPackage.BEHAVIOR__PART:
+			return !getParts().isEmpty();
+		case UMLPackage.BEHAVIOR__ROLE:
+			return isSetRoles();
+		case UMLPackage.BEHAVIOR__OWNED_PORT:
+			return !getOwnedPorts().isEmpty();
+		case UMLPackage.BEHAVIOR__CLASSIFIER_BEHAVIOR:
+			return basicGetClassifierBehavior() != null;
+		case UMLPackage.BEHAVIOR__INTERFACE_REALIZATION:
+			return !getInterfaceRealizations().isEmpty();
+		case UMLPackage.BEHAVIOR__OWNED_BEHAVIOR:
+			return !getOwnedBehaviors().isEmpty();
+		case UMLPackage.BEHAVIOR__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
+		case UMLPackage.BEHAVIOR__EXTENSION:
+			return !getExtensions().isEmpty();
+		case UMLPackage.BEHAVIOR__IS_ACTIVE:
+			return isActive() != IS_ACTIVE_EDEFAULT;
+		case UMLPackage.BEHAVIOR__NESTED_CLASSIFIER:
+			return !getNestedClassifiers().isEmpty();
+		case UMLPackage.BEHAVIOR__OWNED_RECEPTION:
+			return !getOwnedReceptions().isEmpty();
+		case UMLPackage.BEHAVIOR__SUPER_CLASS:
+			return isSetSuperClasses();
+		case UMLPackage.BEHAVIOR__SPECIFICATION:
+			return basicGetSpecification() != null;
+		case UMLPackage.BEHAVIOR__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.BEHAVIOR__IS_REENTRANT:
+			return isSetIsReentrant();
+		case UMLPackage.BEHAVIOR__OWNED_PARAMETER:
+			return !getOwnedParameters().isEmpty();
+		case UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET:
+			return !getOwnedParameterSets().isEmpty();
+		case UMLPackage.BEHAVIOR__POSTCONDITION:
+			return !getPostconditions().isEmpty();
+		case UMLPackage.BEHAVIOR__PRECONDITION:
+			return !getPreconditions().isEmpty();
+		case UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR:
+			return !getRedefinedBehaviors().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1381,322 +1256,255 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.BEHAVIOR___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.BEHAVIOR___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.BEHAVIOR___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIOR___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.BEHAVIOR___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.BEHAVIOR___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.BEHAVIOR___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.BEHAVIOR___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.BEHAVIOR___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.BEHAVIOR___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.BEHAVIOR___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.BEHAVIOR___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIOR___GET_MODEL :
-				return getModel();
-			case UMLPackage.BEHAVIOR___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.BEHAVIOR___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.BEHAVIOR___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.BEHAVIOR___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.BEHAVIOR___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.BEHAVIOR___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.BEHAVIOR___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.BEHAVIOR___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIOR___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.BEHAVIOR___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.BEHAVIOR___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.BEHAVIOR___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.BEHAVIOR___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.BEHAVIOR___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.BEHAVIOR___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIOR___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIOR___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIOR___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.BEHAVIOR___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.BEHAVIOR___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIOR___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.BEHAVIOR___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.BEHAVIOR___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.BEHAVIOR___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.BEHAVIOR___GET_LABEL :
-				return getLabel();
-			case UMLPackage.BEHAVIOR___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.BEHAVIOR___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.BEHAVIOR___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.BEHAVIOR___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.BEHAVIOR___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.BEHAVIOR___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.BEHAVIOR___SEPARATOR :
-				return separator();
-			case UMLPackage.BEHAVIOR___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.BEHAVIOR___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.BEHAVIOR___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.BEHAVIOR___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.BEHAVIOR___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.BEHAVIOR___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.BEHAVIOR___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.BEHAVIOR___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.BEHAVIOR___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.BEHAVIOR___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.BEHAVIOR___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.BEHAVIOR___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.BEHAVIOR___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.BEHAVIOR___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.BEHAVIOR___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.BEHAVIOR___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.BEHAVIOR___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.BEHAVIOR___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.BEHAVIOR___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.BEHAVIOR___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.BEHAVIOR___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.BEHAVIOR___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.BEHAVIOR___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.BEHAVIOR___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.BEHAVIOR___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.BEHAVIOR___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.BEHAVIOR___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.BEHAVIOR___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.BEHAVIOR___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.BEHAVIOR___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.BEHAVIOR___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.BEHAVIOR___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.BEHAVIOR___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.BEHAVIOR___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.BEHAVIOR___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.BEHAVIOR___PARENTS :
-				return parents();
-			case UMLPackage.BEHAVIOR___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.BEHAVIOR___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.BEHAVIOR___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.BEHAVIOR___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.BEHAVIOR___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.BEHAVIOR___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.BEHAVIOR___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.BEHAVIOR___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.BEHAVIOR___GET_PARTS :
-				return getParts();
-			case UMLPackage.BEHAVIOR___ALL_ROLES :
-				return allRoles();
-			case UMLPackage.BEHAVIOR___GET_OWNED_PORTS :
-				return getOwnedPorts();
-			case UMLPackage.BEHAVIOR___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateClassBehavior((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___GET_ALL_IMPLEMENTED_INTERFACES :
-				return getAllImplementedInterfaces();
-			case UMLPackage.BEHAVIOR___GET_IMPLEMENTED_INTERFACES :
-				return getImplementedInterfaces();
-			case UMLPackage.BEHAVIOR___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP :
-				return validatePassiveClass((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
-			case UMLPackage.BEHAVIOR___IS_METACLASS :
-				return isMetaclass();
-			case UMLPackage.BEHAVIOR___GET_EXTENSIONS :
-				return getExtensions();
-			case UMLPackage.BEHAVIOR___GET_SUPER_CLASSES :
-				return getSuperClasses();
-			case UMLPackage.BEHAVIOR___VALIDATE_MOST_ONE_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateMostOneBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___VALIDATE_PARAMETERS_MATCH__DIAGNOSTICCHAIN_MAP :
-				return validateParametersMatch(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___VALIDATE_FEATURE_OF_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateFeatureOfContextClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIOR___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.BEHAVIOR___BEHAVIORED_CLASSIFIER__ELEMENT :
-				return behavioredClassifier((Element) arguments.get(0));
-			case UMLPackage.BEHAVIOR___INPUT_PARAMETERS :
-				return inputParameters();
-			case UMLPackage.BEHAVIOR___OUTPUT_PARAMETERS :
-				return outputParameters();
+		case UMLPackage.BEHAVIOR___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.BEHAVIOR___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.BEHAVIOR___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIOR___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.BEHAVIOR___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.BEHAVIOR___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.BEHAVIOR___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.BEHAVIOR___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.BEHAVIOR___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.BEHAVIOR___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.BEHAVIOR___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.BEHAVIOR___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIOR___GET_MODEL:
+			return getModel();
+		case UMLPackage.BEHAVIOR___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.BEHAVIOR___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.BEHAVIOR___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.BEHAVIOR___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.BEHAVIOR___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.BEHAVIOR___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.BEHAVIOR___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.BEHAVIOR___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIOR___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.BEHAVIOR___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.BEHAVIOR___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.BEHAVIOR___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.BEHAVIOR___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.BEHAVIOR___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.BEHAVIOR___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIOR___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIOR___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIOR___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.BEHAVIOR___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.BEHAVIOR___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIOR___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.BEHAVIOR___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.BEHAVIOR___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.BEHAVIOR___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.BEHAVIOR___GET_LABEL:
+			return getLabel();
+		case UMLPackage.BEHAVIOR___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.BEHAVIOR___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.BEHAVIOR___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.BEHAVIOR___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.BEHAVIOR___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.BEHAVIOR___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.BEHAVIOR___SEPARATOR:
+			return separator();
+		case UMLPackage.BEHAVIOR___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.BEHAVIOR___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.BEHAVIOR___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.BEHAVIOR___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.BEHAVIOR___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.BEHAVIOR___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.BEHAVIOR___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.BEHAVIOR___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.BEHAVIOR___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.BEHAVIOR___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.BEHAVIOR___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.BEHAVIOR___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.BEHAVIOR___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.BEHAVIOR___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.BEHAVIOR___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.BEHAVIOR___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.BEHAVIOR___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.BEHAVIOR___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.BEHAVIOR___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.BEHAVIOR___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.BEHAVIOR___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.BEHAVIOR___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.BEHAVIOR___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.BEHAVIOR___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.BEHAVIOR___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.BEHAVIOR___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.BEHAVIOR___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.BEHAVIOR___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.BEHAVIOR___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.BEHAVIOR___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.BEHAVIOR___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.BEHAVIOR___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.BEHAVIOR___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.BEHAVIOR___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.BEHAVIOR___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.BEHAVIOR___PARENTS:
+			return parents();
+		case UMLPackage.BEHAVIOR___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.BEHAVIOR___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.BEHAVIOR___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.BEHAVIOR___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.BEHAVIOR___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.BEHAVIOR___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.BEHAVIOR___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.BEHAVIOR___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.BEHAVIOR___GET_PARTS:
+			return getParts();
+		case UMLPackage.BEHAVIOR___ALL_ROLES:
+			return allRoles();
+		case UMLPackage.BEHAVIOR___GET_OWNED_PORTS:
+			return getOwnedPorts();
+		case UMLPackage.BEHAVIOR___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateClassBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___GET_ALL_IMPLEMENTED_INTERFACES:
+			return getAllImplementedInterfaces();
+		case UMLPackage.BEHAVIOR___GET_IMPLEMENTED_INTERFACES:
+			return getImplementedInterfaces();
+		case UMLPackage.BEHAVIOR___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP:
+			return validatePassiveClass((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.BEHAVIOR___IS_METACLASS:
+			return isMetaclass();
+		case UMLPackage.BEHAVIOR___GET_EXTENSIONS:
+			return getExtensions();
+		case UMLPackage.BEHAVIOR___GET_SUPER_CLASSES:
+			return getSuperClasses();
+		case UMLPackage.BEHAVIOR___VALIDATE_MOST_ONE_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateMostOneBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___VALIDATE_PARAMETERS_MATCH__DIAGNOSTICCHAIN_MAP:
+			return validateParametersMatch((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___VALIDATE_FEATURE_OF_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateFeatureOfContextClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIOR___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.BEHAVIOR___BEHAVIORED_CLASSIFIER__ELEMENT:
+			return behavioredClassifier((Element) arguments.get(0));
+		case UMLPackage.BEHAVIOR___INPUT_PARAMETERS:
+			return inputParameters();
+		case UMLPackage.BEHAVIOR___OUTPUT_PARAMETERS:
+			return outputParameters();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1709,8 +1517,8 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.BEHAVIOR__OWNED_PARAMETER)
-			|| eIsSet(UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET);
+				|| eIsSet(UMLPackage.BEHAVIOR__OWNED_PARAMETER)
+				|| eIsSet(UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET);
 	}
 
 	/**
@@ -1721,8 +1529,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[]{
-		UMLPackage.BEHAVIOR__CONTEXT};
+	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[] { UMLPackage.BEHAVIOR__CONTEXT };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedMembers() <em>Owned Member</em>}' reference list.
@@ -1732,16 +1539,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.BEHAVIOR__OWNED_RULE, UMLPackage.BEHAVIOR__OWNED_USE_CASE,
-		UMLPackage.BEHAVIOR__OWNED_ATTRIBUTE,
-		UMLPackage.BEHAVIOR__OWNED_CONNECTOR,
-		UMLPackage.BEHAVIOR__OWNED_BEHAVIOR,
-		UMLPackage.BEHAVIOR__OWNED_OPERATION,
-		UMLPackage.BEHAVIOR__NESTED_CLASSIFIER,
-		UMLPackage.BEHAVIOR__OWNED_RECEPTION,
-		UMLPackage.BEHAVIOR__OWNED_PARAMETER,
-		UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.BEHAVIOR__OWNED_RULE, UMLPackage.BEHAVIOR__OWNED_USE_CASE, UMLPackage.BEHAVIOR__OWNED_ATTRIBUTE, UMLPackage.BEHAVIOR__OWNED_CONNECTOR, UMLPackage.BEHAVIOR__OWNED_BEHAVIOR,
+			UMLPackage.BEHAVIOR__OWNED_OPERATION, UMLPackage.BEHAVIOR__NESTED_CLASSIFIER, UMLPackage.BEHAVIOR__OWNED_RECEPTION, UMLPackage.BEHAVIOR__OWNED_PARAMETER, UMLPackage.BEHAVIOR__OWNED_PARAMETER_SET };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1752,15 +1551,13 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Constraint> getOwnedRules() {
-		return (EList<Constraint>) eDynamicGet(
-			UMLPackage.BEHAVIOR__OWNED_RULE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMESPACE__OWNED_RULE, true, true);
+		return (EList<Constraint>) eDynamicGet(UMLPackage.BEHAVIOR__OWNED_RULE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMESPACE__OWNED_RULE, true, true);
 	}
 
 	private EList<Constraint> createOwnedRulesList() {
 		return new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Constraint>(
-			Constraint.class, this, UMLPackage.BEHAVIOR__OWNED_RULE, null,
-			OWNED_RULE_ESUBSETS, UMLPackage.CONSTRAINT__CONTEXT);
+				Constraint.class, this, UMLPackage.BEHAVIOR__OWNED_RULE, null,
+				OWNED_RULE_ESUBSETS, UMLPackage.CONSTRAINT__CONTEXT);
 	}
 
 	/**
@@ -1771,8 +1568,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_RULE_ESUBSETS = new int[]{
-		UMLPackage.BEHAVIOR__POSTCONDITION, UMLPackage.BEHAVIOR__PRECONDITION};
+	protected static final int[] OWNED_RULE_ESUBSETS = new int[] { UMLPackage.BEHAVIOR__POSTCONDITION, UMLPackage.BEHAVIOR__PRECONDITION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1782,15 +1578,13 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Classifier> getRedefinedClassifiers() {
-		return (EList<Classifier>) eDynamicGet(
-			UMLPackage.BEHAVIOR__REDEFINED_CLASSIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__REDEFINED_CLASSIFIER, true, true);
+		return (EList<Classifier>) eDynamicGet(UMLPackage.BEHAVIOR__REDEFINED_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__REDEFINED_CLASSIFIER, true, true);
 	}
 
 	private EList<Classifier> createRedefinedClassifiersList() {
 		return new SubsetSupersetEObjectResolvingEList<Classifier>(
-			Classifier.class, this, UMLPackage.BEHAVIOR__REDEFINED_CLASSIFIER,
-			null, REDEFINED_CLASSIFIER_ESUBSETS);
+				Classifier.class, this, UMLPackage.BEHAVIOR__REDEFINED_CLASSIFIER,
+				null, REDEFINED_CLASSIFIER_ESUBSETS);
 	}
 
 	/**
@@ -1801,8 +1595,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_CLASSIFIER_ESUBSETS = new int[]{
-		UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR};
+	protected static final int[] REDEFINED_CLASSIFIER_ESUBSETS = new int[] { UMLPackage.BEHAVIOR__REDEFINED_BEHAVIOR };
 
 	/**
 	 * The array of superset feature identifiers for the '{@link #getPostconditions() <em>Postcondition</em>}' reference list.
@@ -1812,8 +1605,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] POSTCONDITION_ESUPERSETS = new int[]{
-		UMLPackage.BEHAVIOR__OWNED_RULE};
+	protected static final int[] POSTCONDITION_ESUPERSETS = new int[] { UMLPackage.BEHAVIOR__OWNED_RULE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1853,18 +1645,14 @@
 	 */
 	public Constraint getPostcondition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		postconditionLoop : for (Constraint postcondition : getPostconditions()) {
+		postconditionLoop: for (Constraint postcondition : getPostconditions()) {
 			if (eClass != null && !eClass.isInstance(postcondition))
 				continue postconditionLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(postcondition.getName())
-				: name.equals(postcondition.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(postcondition.getName()) : name.equals(postcondition.getName())))
 				continue postconditionLoop;
 			return postcondition;
 		}
-		return createOnDemand && eClass != null
-			? createPostcondition(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createPostcondition(name, eClass) : null;
 	}
 
 	/**
@@ -1875,8 +1663,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] PRECONDITION_ESUPERSETS = new int[]{
-		UMLPackage.BEHAVIOR__OWNED_RULE};
+	protected static final int[] PRECONDITION_ESUPERSETS = new int[] { UMLPackage.BEHAVIOR__OWNED_RULE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1916,18 +1703,14 @@
 	 */
 	public Constraint getPrecondition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		preconditionLoop : for (Constraint precondition : getPreconditions()) {
+		preconditionLoop: for (Constraint precondition : getPreconditions()) {
 			if (eClass != null && !eClass.isInstance(precondition))
 				continue preconditionLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(precondition.getName())
-				: name.equals(precondition.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(precondition.getName()) : name.equals(precondition.getName())))
 				continue preconditionLoop;
 			return precondition;
 		}
-		return createOnDemand && eClass != null
-			? createPrecondition(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createPrecondition(name, eClass) : null;
 	}
 
 	/**
@@ -1938,8 +1721,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_BEHAVIOR_ESUPERSETS = new int[]{
-		UMLPackage.BEHAVIOR__REDEFINED_CLASSIFIER};
+	protected static final int[] REDEFINED_BEHAVIOR_ESUPERSETS = new int[] { UMLPackage.BEHAVIOR__REDEFINED_CLASSIFIER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1957,12 +1739,10 @@
 	 */
 	public Behavior getRedefinedBehavior(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinedBehaviorLoop : for (Behavior redefinedBehavior : getRedefinedBehaviors()) {
+		redefinedBehaviorLoop: for (Behavior redefinedBehavior : getRedefinedBehaviors()) {
 			if (eClass != null && !eClass.isInstance(redefinedBehavior))
 				continue redefinedBehaviorLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinedBehavior.getName())
-				: name.equals(redefinedBehavior.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinedBehavior.getName()) : name.equals(redefinedBehavior.getName())))
 				continue redefinedBehaviorLoop;
 			return redefinedBehavior;
 		}
@@ -1976,8 +1756,7 @@
 	 */
 	public boolean validateMostOneBehavior(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return BehaviorOperations.validateMostOneBehavior(this, diagnostics,
-			context);
+		return BehaviorOperations.validateMostOneBehavior(this, diagnostics, context);
 	}
 
 	/**
@@ -1988,7 +1767,7 @@
 	@Override
 	public boolean isSetRedefinitionContexts() {
 		return super.isSetRedefinitionContexts()
-			|| eIsSet(UMLPackage.BEHAVIOR__CONTEXT);
+				|| eIsSet(UMLPackage.BEHAVIOR__CONTEXT);
 	}
 
 } //BehaviorImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehavioralFeatureImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehavioralFeatureImpl.java
index 99b91e3..b0036b7 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehavioralFeatureImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehavioralFeatureImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,8 +29,13 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -156,22 +162,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			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>(
-						RedefinableElement.class, this,
-						UMLPackage.BEHAVIORAL_FEATURE__REDEFINED_ELEMENT,
-						null));
+				cache.put(eResource, this, UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(RedefinableElement.class, this, UMLPackage.BEHAVIORAL_FEATURE__REDEFINED_ELEMENT, null));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList<RedefinableElement>(
-			RedefinableElement.class, this,
-			UMLPackage.BEHAVIORAL_FEATURE__REDEFINED_ELEMENT, null);
+		return new DerivedUnionEObjectEList<RedefinableElement>(RedefinableElement.class, this, UMLPackage.BEHAVIORAL_FEATURE__REDEFINED_ELEMENT, null);
 	}
 
 	/**
@@ -190,12 +188,10 @@
 	 */
 	public RedefinableElement getRedefinedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		redefinedElementLoop : for (RedefinableElement redefinedElement : getRedefinedElements()) {
+		redefinedElementLoop: for (RedefinableElement redefinedElement : getRedefinedElements()) {
 			if (eClass != null && !eClass.isInstance(redefinedElement))
 				continue redefinedElementLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinedElement.getName())
-				: name.equals(redefinedElement.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinedElement.getName()) : name.equals(redefinedElement.getName())))
 				continue redefinedElementLoop;
 			return redefinedElement;
 		}
@@ -212,29 +208,21 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			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<Classifier>(
-						Classifier.class, this,
-						UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT,
-						null));
+				cache.put(eResource, this, UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT, redefinitionContexts = new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT, null));
 			}
 			return redefinitionContexts;
 		}
-		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
-			UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT, null);
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT, null);
 	}
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getRedefinitionContexts() <em>Redefinition Context</em>}' reference list.
 	 * @see #getRedefinitionContexts()
 	 */
-	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[]{
-		UMLPackage.BEHAVIORAL_FEATURE__NAMESPACE};
+	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[] {
+			UMLPackage.BEHAVIORAL_FEATURE__NAMESPACE };
 
 	public EList<Classifier> getRedefinitionContexts() {
 		CacheAdapter cache = getCacheAdapter();
@@ -242,21 +230,21 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<Classifier> redefinitionContext = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+					.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<Classifier>(
-						Classifier.class, this,
-						UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT,
-						REDEFINITION_CONTEXT_ESUBSETS));
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
+						redefinitionContext = new DerivedUnionEObjectEList<Classifier>(
+								Classifier.class, this,
+								UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT,
+								REDEFINITION_CONTEXT_ESUBSETS));
 			}
 			return redefinitionContext;
 		}
 		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
-			UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT,
-			REDEFINITION_CONTEXT_ESUBSETS);
+				UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT,
+				REDEFINITION_CONTEXT_ESUBSETS);
 	}
 
 	/**
@@ -275,12 +263,10 @@
 	 */
 	public Classifier getRedefinitionContext(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinitionContextLoop : for (Classifier redefinitionContext : getRedefinitionContexts()) {
+		redefinitionContextLoop: for (Classifier redefinitionContext : getRedefinitionContexts()) {
 			if (eClass != null && !eClass.isInstance(redefinitionContext))
 				continue redefinitionContextLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinitionContext.getName())
-				: name.equals(redefinitionContext.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinitionContext.getName()) : name.equals(redefinitionContext.getName())))
 				continue redefinitionContextLoop;
 			return redefinitionContext;
 		}
@@ -293,9 +279,7 @@
 	 * @generated
 	 */
 	public boolean isLeaf() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, true, true);
 	}
 
 	/**
@@ -304,9 +288,7 @@
 	 * @generated
 	 */
 	public void setIsLeaf(boolean newIsLeaf) {
-		eDynamicSet(
-			UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, newIsLeaf);
+		eDynamicSet(UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, newIsLeaf);
 	}
 
 	/**
@@ -319,29 +301,21 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Classifier> featuringClassifiers = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
+			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>(
-						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>(Classifier.class, this,
-			UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER, null);
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER, null);
 	}
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getFeaturingClassifiers() <em>Featuring Classifier</em>}' reference list.
 	 * @see #getFeaturingClassifiers()
 	 */
-	protected static final int[] FEATURING_CLASSIFIER_ESUBSETS = new int[]{
-		UMLPackage.BEHAVIORAL_FEATURE__NAMESPACE};
+	protected static final int[] FEATURING_CLASSIFIER_ESUBSETS = new int[] {
+			UMLPackage.BEHAVIORAL_FEATURE__NAMESPACE };
 
 	public EList<Classifier> getFeaturingClassifiers() {
 		CacheAdapter cache = getCacheAdapter();
@@ -349,21 +323,21 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<Classifier> featuringClassifiers = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
+					.get(eResource, this,
+							UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
 			if (featuringClassifiers == null) {
 				cache.put(eResource, this,
-					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER,
-					featuringClassifiers = new DerivedUnionEObjectEList<Classifier>(
-						Classifier.class, this,
-						UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER,
-						FEATURING_CLASSIFIER_ESUBSETS));
+						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>(Classifier.class, this,
-			UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER,
-			FEATURING_CLASSIFIER_ESUBSETS);
+				UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER,
+				FEATURING_CLASSIFIER_ESUBSETS);
 	}
 
 	/**
@@ -382,12 +356,10 @@
 	 */
 	public Classifier getFeaturingClassifier(String name, boolean ignoreCase,
 			EClass eClass) {
-		featuringClassifierLoop : for (Classifier featuringClassifier : getFeaturingClassifiers()) {
+		featuringClassifierLoop: for (Classifier featuringClassifier : getFeaturingClassifiers()) {
 			if (eClass != null && !eClass.isInstance(featuringClassifier))
 				continue featuringClassifierLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(featuringClassifier.getName())
-				: name.equals(featuringClassifier.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(featuringClassifier.getName()) : name.equals(featuringClassifier.getName())))
 				continue featuringClassifierLoop;
 			return featuringClassifier;
 		}
@@ -402,10 +374,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE,
-		UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER,
-		UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE, UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER, UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -413,9 +382,7 @@
 	 * @generated
 	 */
 	public boolean isStatic() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.FEATURE__IS_STATIC, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.FEATURE__IS_STATIC, true, true);
 	}
 
 	/**
@@ -424,9 +391,7 @@
 	 * @generated
 	 */
 	public void setIsStatic(boolean newIsStatic) {
-		eDynamicSet(
-			UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.FEATURE__IS_STATIC, newIsStatic);
+		eDynamicSet(UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.FEATURE__IS_STATIC, newIsStatic);
 	}
 
 	/**
@@ -440,21 +405,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.BEHAVIORAL_FEATURE__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.BEHAVIORAL_FEATURE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(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);
 	}
 
 	/**
@@ -464,11 +421,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Parameter> getOwnedParameters() {
-		return (EList<Parameter>) eDynamicGet(
-			UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORAL_FEATURE__OWNED_PARAMETER, true,
-			true);
+		return (EList<Parameter>) eDynamicGet(UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORAL_FEATURE__OWNED_PARAMETER, true, true);
 	}
 
 	/**
@@ -477,8 +430,7 @@
 	 * @generated
 	 */
 	public Parameter createOwnedParameter(String name, Type type) {
-		Parameter newOwnedParameter = (Parameter) create(
-			UMLPackage.Literals.PARAMETER);
+		Parameter newOwnedParameter = (Parameter) create(UMLPackage.Literals.PARAMETER);
 		getOwnedParameters().add(newOwnedParameter);
 		if (name != null)
 			newOwnedParameter.setName(name);
@@ -503,18 +455,14 @@
 	 */
 	public Parameter getOwnedParameter(String name, Type type,
 			boolean ignoreCase, boolean createOnDemand) {
-		ownedParameterLoop : for (Parameter ownedParameter : getOwnedParameters()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedParameter.getName())
-				: name.equals(ownedParameter.getName())))
+		ownedParameterLoop: for (Parameter ownedParameter : getOwnedParameters()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedParameter.getName()) : name.equals(ownedParameter.getName())))
 				continue ownedParameterLoop;
 			if (type != null && !type.equals(ownedParameter.getType()))
 				continue ownedParameterLoop;
 			return ownedParameter;
 		}
-		return createOnDemand
-			? createOwnedParameter(name, type)
-			: null;
+		return createOnDemand ? createOwnedParameter(name, type) : null;
 	}
 
 	/**
@@ -523,9 +471,7 @@
 	 * @generated
 	 */
 	public boolean isAbstract() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.BEHAVIORAL_FEATURE__IS_ABSTRACT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORAL_FEATURE__IS_ABSTRACT, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.BEHAVIORAL_FEATURE__IS_ABSTRACT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORAL_FEATURE__IS_ABSTRACT, true, true);
 	}
 
 	/**
@@ -534,9 +480,7 @@
 	 * @generated
 	 */
 	public void setIsAbstract(boolean newIsAbstract) {
-		eDynamicSet(
-			UMLPackage.BEHAVIORAL_FEATURE__IS_ABSTRACT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORAL_FEATURE__IS_ABSTRACT, newIsAbstract);
+		eDynamicSet(UMLPackage.BEHAVIORAL_FEATURE__IS_ABSTRACT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORAL_FEATURE__IS_ABSTRACT, newIsAbstract);
 	}
 
 	/**
@@ -546,9 +490,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Behavior> getMethods() {
-		return (EList<Behavior>) eDynamicGet(
-			UMLPackage.BEHAVIORAL_FEATURE__METHOD - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORAL_FEATURE__METHOD, true, true);
+		return (EList<Behavior>) eDynamicGet(UMLPackage.BEHAVIORAL_FEATURE__METHOD - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORAL_FEATURE__METHOD, true, true);
 	}
 
 	/**
@@ -566,12 +508,10 @@
 	 * @generated
 	 */
 	public Behavior getMethod(String name, boolean ignoreCase, EClass eClass) {
-		methodLoop : for (Behavior method : getMethods()) {
+		methodLoop: for (Behavior method : getMethods()) {
 			if (eClass != null && !eClass.isInstance(method))
 				continue methodLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(method.getName())
-				: name.equals(method.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(method.getName()) : name.equals(method.getName())))
 				continue methodLoop;
 			return method;
 		}
@@ -584,9 +524,7 @@
 	 * @generated
 	 */
 	public CallConcurrencyKind getConcurrency() {
-		return (CallConcurrencyKind) eDynamicGet(
-			UMLPackage.BEHAVIORAL_FEATURE__CONCURRENCY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORAL_FEATURE__CONCURRENCY, true, true);
+		return (CallConcurrencyKind) eDynamicGet(UMLPackage.BEHAVIORAL_FEATURE__CONCURRENCY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORAL_FEATURE__CONCURRENCY, true, true);
 	}
 
 	/**
@@ -595,10 +533,7 @@
 	 * @generated
 	 */
 	public void setConcurrency(CallConcurrencyKind newConcurrency) {
-		eDynamicSet(
-			UMLPackage.BEHAVIORAL_FEATURE__CONCURRENCY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORAL_FEATURE__CONCURRENCY,
-			newConcurrency);
+		eDynamicSet(UMLPackage.BEHAVIORAL_FEATURE__CONCURRENCY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORAL_FEATURE__CONCURRENCY, newConcurrency);
 	}
 
 	/**
@@ -608,11 +543,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Type> getRaisedExceptions() {
-		return (EList<Type>) eDynamicGet(
-			UMLPackage.BEHAVIORAL_FEATURE__RAISED_EXCEPTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORAL_FEATURE__RAISED_EXCEPTION, true,
-			true);
+		return (EList<Type>) eDynamicGet(UMLPackage.BEHAVIORAL_FEATURE__RAISED_EXCEPTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORAL_FEATURE__RAISED_EXCEPTION, true, true);
 	}
 
 	/**
@@ -631,12 +562,10 @@
 	 */
 	public Type getRaisedException(String name, boolean ignoreCase,
 			EClass eClass) {
-		raisedExceptionLoop : for (Type raisedException : getRaisedExceptions()) {
+		raisedExceptionLoop: for (Type raisedException : getRaisedExceptions()) {
 			if (eClass != null && !eClass.isInstance(raisedException))
 				continue raisedExceptionLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(raisedException.getName())
-				: name.equals(raisedException.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(raisedException.getName()) : name.equals(raisedException.getName())))
 				continue raisedExceptionLoop;
 			return raisedException;
 		}
@@ -650,11 +579,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ParameterSet> getOwnedParameterSets() {
-		return (EList<ParameterSet>) eDynamicGet(
-			UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET, true,
-			true);
+		return (EList<ParameterSet>) eDynamicGet(UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET, true, true);
 	}
 
 	/**
@@ -663,8 +588,7 @@
 	 * @generated
 	 */
 	public ParameterSet createOwnedParameterSet(String name) {
-		ParameterSet newOwnedParameterSet = (ParameterSet) create(
-			UMLPackage.Literals.PARAMETER_SET);
+		ParameterSet newOwnedParameterSet = (ParameterSet) create(UMLPackage.Literals.PARAMETER_SET);
 		getOwnedParameterSets().add(newOwnedParameterSet);
 		if (name != null)
 			newOwnedParameterSet.setName(name);
@@ -687,16 +611,12 @@
 	 */
 	public ParameterSet getOwnedParameterSet(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedParameterSetLoop : for (ParameterSet ownedParameterSet : getOwnedParameterSets()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedParameterSet.getName())
-				: name.equals(ownedParameterSet.getName())))
+		ownedParameterSetLoop: for (ParameterSet ownedParameterSet : getOwnedParameterSets()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedParameterSet.getName()) : name.equals(ownedParameterSet.getName())))
 				continue ownedParameterSetLoop;
 			return ownedParameterSet;
 		}
-		return createOnDemand
-			? createOwnedParameterSet(name)
-			: null;
+		return createOnDemand ? createOwnedParameterSet(name) : null;
 	}
 
 	/**
@@ -706,8 +626,7 @@
 	 */
 	public boolean validateRedefinitionContextValid(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations
-			.validateRedefinitionContextValid(this, diagnostics, context);
+		return RedefinableElementOperations.validateRedefinitionContextValid(this, diagnostics, context);
 	}
 
 	/**
@@ -717,8 +636,7 @@
 	 */
 	public boolean validateRedefinitionConsistent(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations.validateRedefinitionConsistent(this,
-			diagnostics, context);
+		return RedefinableElementOperations.validateRedefinitionConsistent(this, diagnostics, context);
 	}
 
 	/**
@@ -728,8 +646,7 @@
 	 */
 	public boolean validateNonLeafRedefinition(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations.validateNonLeafRedefinition(this,
-			diagnostics, context);
+		return RedefinableElementOperations.validateNonLeafRedefinition(this, diagnostics, context);
 	}
 
 	/**
@@ -739,8 +656,7 @@
 	 */
 	public boolean isRedefinitionContextValid(
 			RedefinableElement redefinedElement) {
-		return RedefinableElementOperations.isRedefinitionContextValid(this,
-			redefinedElement);
+		return RedefinableElementOperations.isRedefinitionContextValid(this, redefinedElement);
 	}
 
 	/**
@@ -750,8 +666,7 @@
 	 */
 	public boolean validateAbstractNoMethod(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return BehavioralFeatureOperations.validateAbstractNoMethod(this,
-			diagnostics, context);
+		return BehavioralFeatureOperations.validateAbstractNoMethod(this, diagnostics, context);
 	}
 
 	/**
@@ -772,12 +687,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Parameter> result = (EList<Parameter>) cache.get(this,
-				UMLPackage.Literals.BEHAVIORAL_FEATURE___INPUT_PARAMETERS);
+			EList<Parameter> result = (EList<Parameter>) cache.get(this, UMLPackage.Literals.BEHAVIORAL_FEATURE___INPUT_PARAMETERS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.BEHAVIORAL_FEATURE___INPUT_PARAMETERS,
-					result = BehavioralFeatureOperations.inputParameters(this));
+				cache.put(this, UMLPackage.Literals.BEHAVIORAL_FEATURE___INPUT_PARAMETERS, result = BehavioralFeatureOperations.inputParameters(this));
 			}
 			return result;
 		}
@@ -793,13 +705,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Parameter> result = (EList<Parameter>) cache.get(this,
-				UMLPackage.Literals.BEHAVIORAL_FEATURE___OUTPUT_PARAMETERS);
+			EList<Parameter> result = (EList<Parameter>) cache.get(this, UMLPackage.Literals.BEHAVIORAL_FEATURE___OUTPUT_PARAMETERS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.BEHAVIORAL_FEATURE___OUTPUT_PARAMETERS,
-					result = BehavioralFeatureOperations
-						.outputParameters(this));
+				cache.put(this, UMLPackage.Literals.BEHAVIORAL_FEATURE___OUTPUT_PARAMETERS, result = BehavioralFeatureOperations.outputParameters(this));
 			}
 			return result;
 		}
@@ -812,8 +720,7 @@
 	 * @generated
 	 */
 	public boolean isConsistentWith(RedefinableElement redefiningElement) {
-		return RedefinableElementOperations.isConsistentWith(this,
-			redefiningElement);
+		return RedefinableElementOperations.isConsistentWith(this, redefiningElement);
 	}
 
 	/**
@@ -836,21 +743,16 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIORAL_FEATURE__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIORAL_FEATURE__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIORAL_FEATURE__METHOD :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getMethods())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIORAL_FEATURE__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIORAL_FEATURE__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIORAL_FEATURE__METHOD:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getMethods()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -864,32 +766,24 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORAL_FEATURE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORAL_FEATURE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORAL_FEATURE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORAL_FEATURE__METHOD :
-				return ((InternalEList<?>) getMethods()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER :
-				return ((InternalEList<?>) getOwnedParameters())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET :
-				return ((InternalEList<?>) getOwnedParameterSets())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORAL_FEATURE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORAL_FEATURE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORAL_FEATURE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORAL_FEATURE__METHOD:
+			return ((InternalEList<?>) getMethods()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER:
+			return ((InternalEList<?>) getOwnedParameters()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET:
+			return ((InternalEList<?>) getOwnedParameterSets()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -902,66 +796,66 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.BEHAVIORAL_FEATURE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.BEHAVIORAL_FEATURE__NAME :
-				return getName();
-			case UMLPackage.BEHAVIORAL_FEATURE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.BEHAVIORAL_FEATURE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.BEHAVIORAL_FEATURE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.BEHAVIORAL_FEATURE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.BEHAVIORAL_FEATURE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.BEHAVIORAL_FEATURE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.BEHAVIORAL_FEATURE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.BEHAVIORAL_FEATURE__MEMBER :
-				return getMembers();
-			case UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.BEHAVIORAL_FEATURE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER :
-				return getFeaturingClassifiers();
-			case UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC :
-				return isStatic();
-			case UMLPackage.BEHAVIORAL_FEATURE__CONCURRENCY :
-				return getConcurrency();
-			case UMLPackage.BEHAVIORAL_FEATURE__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.BEHAVIORAL_FEATURE__METHOD :
-				return getMethods();
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER :
-				return getOwnedParameters();
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET :
-				return getOwnedParameterSets();
-			case UMLPackage.BEHAVIORAL_FEATURE__RAISED_EXCEPTION :
-				return getRaisedExceptions();
+		case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.BEHAVIORAL_FEATURE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.BEHAVIORAL_FEATURE__NAME:
+			return getName();
+		case UMLPackage.BEHAVIORAL_FEATURE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.BEHAVIORAL_FEATURE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.BEHAVIORAL_FEATURE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.BEHAVIORAL_FEATURE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.BEHAVIORAL_FEATURE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.BEHAVIORAL_FEATURE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.BEHAVIORAL_FEATURE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.BEHAVIORAL_FEATURE__MEMBER:
+			return getMembers();
+		case UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.BEHAVIORAL_FEATURE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER:
+			return getFeaturingClassifiers();
+		case UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC:
+			return isStatic();
+		case UMLPackage.BEHAVIORAL_FEATURE__CONCURRENCY:
+			return getConcurrency();
+		case UMLPackage.BEHAVIORAL_FEATURE__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.BEHAVIORAL_FEATURE__METHOD:
+			return getMethods();
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER:
+			return getOwnedParameters();
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET:
+			return getOwnedParameterSets();
+		case UMLPackage.BEHAVIORAL_FEATURE__RAISED_EXCEPTION:
+			return getRaisedExceptions();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -975,71 +869,63 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC :
-				setIsStatic((Boolean) newValue);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__CONCURRENCY :
-				setConcurrency((CallConcurrencyKind) newValue);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__METHOD :
-				getMethods().clear();
-				getMethods().addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				getOwnedParameters()
-					.addAll((Collection<? extends Parameter>) newValue);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				getOwnedParameterSets()
-					.addAll((Collection<? extends ParameterSet>) newValue);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__RAISED_EXCEPTION :
-				getRaisedExceptions().clear();
-				getRaisedExceptions()
-					.addAll((Collection<? extends Type>) newValue);
-				return;
+		case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC:
+			setIsStatic((Boolean) newValue);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__CONCURRENCY:
+			setConcurrency((CallConcurrencyKind) newValue);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__METHOD:
+			getMethods().clear();
+			getMethods().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			getOwnedParameters().addAll((Collection<? extends Parameter>) newValue);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			getOwnedParameterSets().addAll((Collection<? extends ParameterSet>) newValue);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__RAISED_EXCEPTION:
+			getRaisedExceptions().clear();
+			getRaisedExceptions().addAll((Collection<? extends Type>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -1052,54 +938,54 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC :
-				setIsStatic(IS_STATIC_EDEFAULT);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__CONCURRENCY :
-				setConcurrency(CONCURRENCY_EDEFAULT);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__METHOD :
-				getMethods().clear();
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				return;
-			case UMLPackage.BEHAVIORAL_FEATURE__RAISED_EXCEPTION :
-				getRaisedExceptions().clear();
-				return;
+		case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC:
+			setIsStatic(IS_STATIC_EDEFAULT);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__CONCURRENCY:
+			setConcurrency(CONCURRENCY_EDEFAULT);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__METHOD:
+			getMethods().clear();
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			return;
+		case UMLPackage.BEHAVIORAL_FEATURE__RAISED_EXCEPTION:
+			getRaisedExceptions().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1112,62 +998,60 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNER :
-				return isSetOwner();
-			case UMLPackage.BEHAVIORAL_FEATURE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.BEHAVIORAL_FEATURE__NAME :
-				return isSetName();
-			case UMLPackage.BEHAVIORAL_FEATURE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.BEHAVIORAL_FEATURE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.BEHAVIORAL_FEATURE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.BEHAVIORAL_FEATURE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.BEHAVIORAL_FEATURE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.BEHAVIORAL_FEATURE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.BEHAVIORAL_FEATURE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.BEHAVIORAL_FEATURE__MEMBER :
-				return isSetMembers();
-			case UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.BEHAVIORAL_FEATURE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER :
-				return isSetFeaturingClassifiers();
-			case UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC :
-				return isStatic() != IS_STATIC_EDEFAULT;
-			case UMLPackage.BEHAVIORAL_FEATURE__CONCURRENCY :
-				return getConcurrency() != CONCURRENCY_EDEFAULT;
-			case UMLPackage.BEHAVIORAL_FEATURE__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.BEHAVIORAL_FEATURE__METHOD :
-				return !getMethods().isEmpty();
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER :
-				return !getOwnedParameters().isEmpty();
-			case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET :
-				return !getOwnedParameterSets().isEmpty();
-			case UMLPackage.BEHAVIORAL_FEATURE__RAISED_EXCEPTION :
-				return !getRaisedExceptions().isEmpty();
+		case UMLPackage.BEHAVIORAL_FEATURE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNER:
+			return isSetOwner();
+		case UMLPackage.BEHAVIORAL_FEATURE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.BEHAVIORAL_FEATURE__NAME:
+			return isSetName();
+		case UMLPackage.BEHAVIORAL_FEATURE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.BEHAVIORAL_FEATURE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.BEHAVIORAL_FEATURE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.BEHAVIORAL_FEATURE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.BEHAVIORAL_FEATURE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.BEHAVIORAL_FEATURE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.BEHAVIORAL_FEATURE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.BEHAVIORAL_FEATURE__MEMBER:
+			return isSetMembers();
+		case UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.BEHAVIORAL_FEATURE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER:
+			return isSetFeaturingClassifiers();
+		case UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC:
+			return isStatic() != IS_STATIC_EDEFAULT;
+		case UMLPackage.BEHAVIORAL_FEATURE__CONCURRENCY:
+			return getConcurrency() != CONCURRENCY_EDEFAULT;
+		case UMLPackage.BEHAVIORAL_FEATURE__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.BEHAVIORAL_FEATURE__METHOD:
+			return !getMethods().isEmpty();
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER:
+			return !getOwnedParameters().isEmpty();
+		case UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET:
+			return !getOwnedParameterSets().isEmpty();
+		case UMLPackage.BEHAVIORAL_FEATURE__RAISED_EXCEPTION:
+			return !getRaisedExceptions().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1182,24 +1066,24 @@
 			Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF :
-					return UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF;
-				case UMLPackage.BEHAVIORAL_FEATURE__REDEFINED_ELEMENT :
-					return UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT;
-				case UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT :
-					return UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT;
-				default :
-					return -1;
+			case UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF:
+				return UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF;
+			case UMLPackage.BEHAVIORAL_FEATURE__REDEFINED_ELEMENT:
+				return UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT;
+			case UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT:
+				return UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == Feature.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER :
-					return UMLPackage.FEATURE__FEATURING_CLASSIFIER;
-				case UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC :
-					return UMLPackage.FEATURE__IS_STATIC;
-				default :
-					return -1;
+			case UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER:
+				return UMLPackage.FEATURE__FEATURING_CLASSIFIER;
+			case UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC:
+				return UMLPackage.FEATURE__IS_STATIC;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -1215,24 +1099,24 @@
 			Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF :
-					return UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF;
-				case UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT :
-					return UMLPackage.BEHAVIORAL_FEATURE__REDEFINED_ELEMENT;
-				case UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT :
-					return UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT;
-				default :
-					return -1;
+			case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF:
+				return UMLPackage.BEHAVIORAL_FEATURE__IS_LEAF;
+			case UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT:
+				return UMLPackage.BEHAVIORAL_FEATURE__REDEFINED_ELEMENT;
+			case UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT:
+				return UMLPackage.BEHAVIORAL_FEATURE__REDEFINITION_CONTEXT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == Feature.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.FEATURE__FEATURING_CLASSIFIER :
-					return UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER;
-				case UMLPackage.FEATURE__IS_STATIC :
-					return UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC;
-				default :
-					return -1;
+			case UMLPackage.FEATURE__FEATURING_CLASSIFIER:
+				return UMLPackage.BEHAVIORAL_FEATURE__FEATURING_CLASSIFIER;
+			case UMLPackage.FEATURE__IS_STATIC:
+				return UMLPackage.BEHAVIORAL_FEATURE__IS_STATIC;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1247,24 +1131,24 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.REDEFINABLE_ELEMENT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-					return UMLPackage.BEHAVIORAL_FEATURE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT;
-				case UMLPackage.REDEFINABLE_ELEMENT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-					return UMLPackage.BEHAVIORAL_FEATURE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT;
-				default :
-					return -1;
+			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.REDEFINABLE_ELEMENT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+				return UMLPackage.BEHAVIORAL_FEATURE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT;
+			case UMLPackage.REDEFINABLE_ELEMENT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+				return UMLPackage.BEHAVIORAL_FEATURE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == Feature.class) {
 			switch (baseOperationID) {
-				default :
-					return -1;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -1280,191 +1164,154 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_MODEL :
-				return getModel();
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.BEHAVIORAL_FEATURE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.BEHAVIORAL_FEATURE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.BEHAVIORAL_FEATURE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.BEHAVIORAL_FEATURE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.BEHAVIORAL_FEATURE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.BEHAVIORAL_FEATURE___SEPARATOR :
-				return separator();
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.BEHAVIORAL_FEATURE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.BEHAVIORAL_FEATURE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_ABSTRACT_NO_METHOD__DIAGNOSTICCHAIN_MAP :
-				return validateAbstractNoMethod(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___CREATE_RETURN_RESULT__STRING_TYPE :
-				return createReturnResult((String) arguments.get(0),
-					(Type) arguments.get(1));
-			case UMLPackage.BEHAVIORAL_FEATURE___INPUT_PARAMETERS :
-				return inputParameters();
-			case UMLPackage.BEHAVIORAL_FEATURE___OUTPUT_PARAMETERS :
-				return outputParameters();
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_MODEL:
+			return getModel();
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.BEHAVIORAL_FEATURE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.BEHAVIORAL_FEATURE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.BEHAVIORAL_FEATURE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.BEHAVIORAL_FEATURE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.BEHAVIORAL_FEATURE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.BEHAVIORAL_FEATURE___SEPARATOR:
+			return separator();
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.BEHAVIORAL_FEATURE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.BEHAVIORAL_FEATURE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.BEHAVIORAL_FEATURE___VALIDATE_ABSTRACT_NO_METHOD__DIAGNOSTICCHAIN_MAP:
+			return validateAbstractNoMethod((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___CREATE_RETURN_RESULT__STRING_TYPE:
+			return createReturnResult((String) arguments.get(0), (Type) arguments.get(1));
+		case UMLPackage.BEHAVIORAL_FEATURE___INPUT_PARAMETERS:
+			return inputParameters();
+		case UMLPackage.BEHAVIORAL_FEATURE___OUTPUT_PARAMETERS:
+			return outputParameters();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1512,8 +1359,8 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER)
-			|| eIsSet(UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET);
+				|| eIsSet(UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER)
+				|| eIsSet(UMLPackage.BEHAVIORAL_FEATURE__OWNED_PARAMETER_SET);
 	}
 
 } //BehavioralFeatureImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehavioredClassifierImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehavioredClassifierImpl.java
index c3bf419..97c0f35 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehavioredClassifierImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BehavioredClassifierImpl.java
@@ -1,34 +1,46 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
+
 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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectContainmentEList;
+
 import org.eclipse.uml2.uml.AggregationKind;
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.BehavioredClassifier;
@@ -58,6 +70,7 @@
 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;
 
 /**
@@ -100,17 +113,9 @@
 		return UMLPackage.Literals.BEHAVIORED_CLASSIFIER;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR) {
 			return createOwnedBehaviorsList();
 		}
@@ -129,21 +134,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_MEMBER,
-			OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -157,21 +154,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -181,18 +170,14 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Behavior> getOwnedBehaviors() {
-		return (EList<Behavior>) eDynamicGet(
-			UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR, true,
-			true);
+		return (EList<Behavior>) eDynamicGet(UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR, true, true);
 	}
 
 	private EList<Behavior> createOwnedBehaviorsList() {
 		return new SubsetSupersetEObjectContainmentEList.Resolving<Behavior>(
-			Behavior.class, this,
-			UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR, null,
-			OWNED_BEHAVIOR_ESUBSETS);
+				Behavior.class, this,
+				UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR, null,
+				OWNED_BEHAVIOR_ESUBSETS);
 	}
 
 	/**
@@ -201,11 +186,7 @@
 	 * @generated
 	 */
 	public Behavior getClassifierBehavior() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR,
-			true, true);
+		return (Behavior) eDynamicGet(UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR, true, true);
 	}
 
 	/**
@@ -214,11 +195,7 @@
 	 * @generated
 	 */
 	public Behavior basicGetClassifierBehavior() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR,
-			false, true);
+		return (Behavior) eDynamicGet(UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR, false, true);
 	}
 
 	/**
@@ -227,11 +204,7 @@
 	 * @generated
 	 */
 	public void setClassifierBehavior(Behavior newClassifierBehavior) {
-		eDynamicSet(
-			UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR,
-			newClassifierBehavior);
+		eDynamicSet(UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR, newClassifierBehavior);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newClassifierBehavior != null) {
@@ -263,11 +236,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<InterfaceRealization> getInterfaceRealizations() {
-		return (EList<InterfaceRealization>) eDynamicGet(
-			UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION,
-			true, true);
+		return (EList<InterfaceRealization>) eDynamicGet(UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION, true, true);
 	}
 
 	/**
@@ -277,8 +246,7 @@
 	 */
 	public boolean validateClassBehavior(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return BehavioredClassifierOperations.validateClassBehavior(this,
-			diagnostics, context);
+		return BehavioredClassifierOperations.validateClassBehavior(this, diagnostics, context);
 	}
 
 	/**
@@ -290,13 +258,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES,
-					result = BehavioredClassifierOperations
-						.getImplementedInterfaces(this));
+				cache.put(this, UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES, result = BehavioredClassifierOperations.getImplementedInterfaces(this));
 			}
 			return result;
 		}
@@ -312,13 +276,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES,
-					result = BehavioredClassifierOperations
-						.getAllImplementedInterfaces(this));
+				cache.put(this, UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES, result = BehavioredClassifierOperations.getAllImplementedInterfaces(this));
 			}
 			return result;
 		}
@@ -335,59 +295,40 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -401,56 +342,42 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION :
-				return ((InternalEList<?>) getInterfaceRealizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR :
-				return ((InternalEList<?>) getOwnedBehaviors())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION:
+			return ((InternalEList<?>) getInterfaceRealizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR:
+			return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -463,106 +390,106 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__NAME :
-				return getName();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__MEMBER :
-				return getMembers();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__FEATURE :
-				return getFeatures();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__GENERAL :
-				return getGenerals();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__USE_CASE :
-				return getUseCases();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR :
-				if (resolve)
-					return getClassifierBehavior();
-				return basicGetClassifierBehavior();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION :
-				return getInterfaceRealizations();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR :
-				return getOwnedBehaviors();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__NAME:
+			return getName();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__MEMBER:
+			return getMembers();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__FEATURE:
+			return getFeatures();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__GENERAL:
+			return getGenerals();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__USE_CASE:
+			return getUseCases();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR:
+			if (resolve)
+				return getClassifierBehavior();
+			return basicGetClassifierBehavior();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION:
+			return getInterfaceRealizations();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR:
+			return getOwnedBehaviors();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -576,121 +503,106 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll(
-					(Collection<? extends InterfaceRealization>) newValue);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				getOwnedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			getInterfaceRealizations().addAll((Collection<? extends InterfaceRealization>) newValue);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			getOwnedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -703,90 +615,90 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__NAME :
-				unsetName();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) null);
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				return;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__NAME:
+			unsetName();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) null);
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			return;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -799,90 +711,88 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNER :
-				return isSetOwner();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__NAME :
-				return isSetName();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.BEHAVIORED_CLASSIFIER__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__MEMBER :
-				return isSetMembers();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__GENERAL :
-				return !getGenerals().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR :
-				return basicGetClassifierBehavior() != null;
-			case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION :
-				return !getInterfaceRealizations().isEmpty();
-			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR :
-				return !getOwnedBehaviors().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNER:
+			return isSetOwner();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__NAME:
+			return isSetName();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.BEHAVIORED_CLASSIFIER__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__MEMBER:
+			return isSetMembers();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__GENERAL:
+			return !getGenerals().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR:
+			return basicGetClassifierBehavior() != null;
+		case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION:
+			return !getInterfaceRealizations().isEmpty();
+		case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR:
+			return !getOwnedBehaviors().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -897,279 +807,223 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_MODEL :
-				return getModel();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.BEHAVIORED_CLASSIFIER___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_LABEL :
-				return getLabel();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___SEPARATOR :
-				return separator();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___PARENTS :
-				return parents();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateClassBehavior((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES :
-				return getAllImplementedInterfaces();
-			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES :
-				return getImplementedInterfaces();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_MODEL:
+			return getModel();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.BEHAVIORED_CLASSIFIER___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_LABEL:
+			return getLabel();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___SEPARATOR:
+			return separator();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___PARENTS:
+			return parents();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateClassBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES:
+			return getAllImplementedInterfaces();
+		case UMLPackage.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES:
+			return getImplementedInterfaces();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1182,7 +1036,7 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR);
+				|| eIsSet(UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR);
 	}
 
 	/**
@@ -1193,18 +1047,9 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_COMMENT,
-		UMLPackage.BEHAVIORED_CLASSIFIER__NAME_EXPRESSION,
-		UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT,
-		UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT,
-		UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_MEMBER,
-		UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_BINDING,
-		UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE,
-		UMLPackage.BEHAVIORED_CLASSIFIER__COLLABORATION_USE,
-		UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION,
-		UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION,
-		UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_COMMENT, UMLPackage.BEHAVIORED_CLASSIFIER__NAME_EXPRESSION, UMLPackage.BEHAVIORED_CLASSIFIER__ELEMENT_IMPORT,
+			UMLPackage.BEHAVIORED_CLASSIFIER__PACKAGE_IMPORT, UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_MEMBER, UMLPackage.BEHAVIORED_CLASSIFIER__TEMPLATE_BINDING, UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE,
+			UMLPackage.BEHAVIORED_CLASSIFIER__COLLABORATION_USE, UMLPackage.BEHAVIORED_CLASSIFIER__GENERALIZATION, UMLPackage.BEHAVIORED_CLASSIFIER__SUBSTITUTION, UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedMembers() <em>Owned Member</em>}' reference list.
@@ -1214,10 +1059,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE,
-		UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_USE_CASE,
-		UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_RULE, UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_USE_CASE, UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedBehaviors() <em>Owned Behavior</em>}' containment reference list.
@@ -1227,8 +1069,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_BEHAVIOR_ESUBSETS = new int[]{
-		UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR};
+	protected static final int[] OWNED_BEHAVIOR_ESUBSETS = new int[] { UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1259,18 +1100,14 @@
 	 */
 	public Behavior getOwnedBehavior(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		ownedBehaviorLoop : for (Behavior ownedBehavior : getOwnedBehaviors()) {
+		ownedBehaviorLoop: for (Behavior ownedBehavior : getOwnedBehaviors()) {
 			if (eClass != null && !eClass.isInstance(ownedBehavior))
 				continue ownedBehaviorLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedBehavior.getName())
-				: name.equals(ownedBehavior.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedBehavior.getName()) : name.equals(ownedBehavior.getName())))
 				continue ownedBehaviorLoop;
 			return ownedBehavior;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedBehavior(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedBehavior(name, eClass) : null;
 	}
 
 	/**
@@ -1280,8 +1117,7 @@
 	 */
 	public InterfaceRealization createInterfaceRealization(String name,
 			Interface contract) {
-		InterfaceRealization newInterfaceRealization = (InterfaceRealization) create(
-			UMLPackage.Literals.INTERFACE_REALIZATION);
+		InterfaceRealization newInterfaceRealization = (InterfaceRealization) create(UMLPackage.Literals.INTERFACE_REALIZATION);
 		getInterfaceRealizations().add(newInterfaceRealization);
 		if (name != null)
 			newInterfaceRealization.setName(name);
@@ -1307,19 +1143,14 @@
 	 */
 	public InterfaceRealization getInterfaceRealization(String name,
 			Interface contract, boolean ignoreCase, boolean createOnDemand) {
-		interfaceRealizationLoop : for (InterfaceRealization interfaceRealization : getInterfaceRealizations()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(interfaceRealization.getName())
-				: name.equals(interfaceRealization.getName())))
+		interfaceRealizationLoop: for (InterfaceRealization interfaceRealization : getInterfaceRealizations()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(interfaceRealization.getName()) : name.equals(interfaceRealization.getName())))
 				continue interfaceRealizationLoop;
-			if (contract != null
-				&& !contract.equals(interfaceRealization.getContract()))
+			if (contract != null && !contract.equals(interfaceRealization.getContract()))
 				continue interfaceRealizationLoop;
 			return interfaceRealization;
 		}
-		return createOnDemand
-			? createInterfaceRealization(name, contract)
-			: null;
+		return createOnDemand ? createInterfaceRealization(name, contract) : null;
 	}
 
 	/**
@@ -1330,7 +1161,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION);
+				|| eIsSet(UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION);
 	}
 
 } //BehavioredClassifierImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BroadcastSignalActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BroadcastSignalActionImpl.java
index 7cb83c4..b3cbc1e 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BroadcastSignalActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/BroadcastSignalActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,11 +17,17 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+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;
@@ -87,9 +93,7 @@
 	 * @generated
 	 */
 	public Signal getSignal() {
-		return (Signal) eDynamicGet(
-			UMLPackage.BROADCAST_SIGNAL_ACTION__SIGNAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BROADCAST_SIGNAL_ACTION__SIGNAL, true, true);
+		return (Signal) eDynamicGet(UMLPackage.BROADCAST_SIGNAL_ACTION__SIGNAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BROADCAST_SIGNAL_ACTION__SIGNAL, true, true);
 	}
 
 	/**
@@ -98,9 +102,7 @@
 	 * @generated
 	 */
 	public Signal basicGetSignal() {
-		return (Signal) eDynamicGet(
-			UMLPackage.BROADCAST_SIGNAL_ACTION__SIGNAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BROADCAST_SIGNAL_ACTION__SIGNAL, false, true);
+		return (Signal) eDynamicGet(UMLPackage.BROADCAST_SIGNAL_ACTION__SIGNAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BROADCAST_SIGNAL_ACTION__SIGNAL, false, true);
 	}
 
 	/**
@@ -109,9 +111,7 @@
 	 * @generated
 	 */
 	public void setSignal(Signal newSignal) {
-		eDynamicSet(
-			UMLPackage.BROADCAST_SIGNAL_ACTION__SIGNAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BROADCAST_SIGNAL_ACTION__SIGNAL, newSignal);
+		eDynamicSet(UMLPackage.BROADCAST_SIGNAL_ACTION__SIGNAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BROADCAST_SIGNAL_ACTION__SIGNAL, newSignal);
 	}
 
 	/**
@@ -121,8 +121,7 @@
 	 */
 	public boolean validateNumberOfArguments(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return BroadcastSignalActionOperations.validateNumberOfArguments(this,
-			diagnostics, context);
+		return BroadcastSignalActionOperations.validateNumberOfArguments(this, diagnostics, context);
 	}
 
 	/**
@@ -132,8 +131,7 @@
 	 */
 	public boolean validateTypeOrderingMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return BroadcastSignalActionOperations
-			.validateTypeOrderingMultiplicity(this, diagnostics, context);
+		return BroadcastSignalActionOperations.validateTypeOrderingMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -143,8 +141,7 @@
 	 */
 	public boolean validateNoOnport(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return BroadcastSignalActionOperations.validateNoOnport(this,
-			diagnostics, context);
+		return BroadcastSignalActionOperations.validateNoOnport(this, diagnostics, context);
 	}
 
 	/**
@@ -155,84 +152,84 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME :
-				return getName();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__ARGUMENT :
-				return getArguments();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__ON_PORT :
-				if (resolve)
-					return getOnPort();
-				return basicGetOnPort();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__SIGNAL :
-				if (resolve)
-					return getSignal();
-				return basicGetSignal();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME:
+			return getName();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__ARGUMENT:
+			return getArguments();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__ON_PORT:
+			if (resolve)
+				return getOnPort();
+			return basicGetOnPort();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__SIGNAL:
+			if (resolve)
+				return getSignal();
+			return basicGetSignal();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -246,88 +243,77 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__ARGUMENT :
-				getArguments().clear();
-				getArguments()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__ON_PORT :
-				setOnPort((Port) newValue);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__SIGNAL :
-				setSignal((Signal) newValue);
-				return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__ARGUMENT:
+			getArguments().clear();
+			getArguments().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__ON_PORT:
+			setOnPort((Port) newValue);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__SIGNAL:
+			setSignal((Signal) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -340,66 +326,66 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__ARGUMENT :
-				getArguments().clear();
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__ON_PORT :
-				setOnPort((Port) null);
-				return;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__SIGNAL :
-				setSignal((Signal) null);
-				return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__ARGUMENT:
+			getArguments().clear();
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__ON_PORT:
+			setOnPort((Port) null);
+			return;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__SIGNAL:
+			setSignal((Signal) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -412,70 +398,68 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__ARGUMENT :
-				return !getArguments().isEmpty();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__ON_PORT :
-				return basicGetOnPort() != null;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION__SIGNAL :
-				return basicGetSignal() != null;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__ARGUMENT:
+			return !getArguments().isEmpty();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__ON_PORT:
+			return basicGetOnPort() != null;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION__SIGNAL:
+			return basicGetSignal() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -490,163 +474,136 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_NUMBER_OF_ARGUMENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNumberOfArguments(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_TYPE_ORDERING_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOrderingMultiplicity(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_NO_ONPORT__DIAGNOSTICCHAIN_MAP :
-				return validateNoOnport((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_NUMBER_OF_ARGUMENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNumberOfArguments((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_TYPE_ORDERING_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOrderingMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.BROADCAST_SIGNAL_ACTION___VALIDATE_NO_ONPORT__DIAGNOSTICCHAIN_MAP:
+			return validateNoOnport((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallActionImpl.java
index 5dc13ee..555e10b 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallActionImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,8 +29,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -119,18 +123,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this, UMLPackage.CALL_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.CALL_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.CALL_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.CALL_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -139,9 +138,7 @@
 	 * @generated
 	 */
 	public boolean isSynchronous() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.CALL_ACTION__IS_SYNCHRONOUS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CALL_ACTION__IS_SYNCHRONOUS, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.CALL_ACTION__IS_SYNCHRONOUS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CALL_ACTION__IS_SYNCHRONOUS, true, true);
 	}
 
 	/**
@@ -150,9 +147,7 @@
 	 * @generated
 	 */
 	public void setIsSynchronous(boolean newIsSynchronous) {
-		eDynamicSet(
-			UMLPackage.CALL_ACTION__IS_SYNCHRONOUS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CALL_ACTION__IS_SYNCHRONOUS, newIsSynchronous);
+		eDynamicSet(UMLPackage.CALL_ACTION__IS_SYNCHRONOUS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CALL_ACTION__IS_SYNCHRONOUS, newIsSynchronous);
 	}
 
 	/**
@@ -162,9 +157,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<OutputPin> getResults() {
-		return (EList<OutputPin>) eDynamicGet(
-			UMLPackage.CALL_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CALL_ACTION__RESULT, true, true);
+		return (EList<OutputPin>) eDynamicGet(UMLPackage.CALL_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CALL_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -173,8 +166,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		getResults().add(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -199,18 +191,14 @@
 	 */
 	public OutputPin getResult(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		resultLoop : for (OutputPin result : getResults()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(result.getName())
-				: name.equals(result.getName())))
+		resultLoop: for (OutputPin result : getResults()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(result.getName()) : name.equals(result.getName())))
 				continue resultLoop;
 			if (type != null && !type.equals(result.getType()))
 				continue resultLoop;
 			return result;
 		}
-		return createOnDemand
-			? createResult(name, type)
-			: null;
+		return createOnDemand ? createResult(name, type) : null;
 	}
 
 	/**
@@ -220,8 +208,7 @@
 	 */
 	public boolean validateArgumentPins(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CallActionOperations.validateArgumentPins(this, diagnostics,
-			context);
+		return CallActionOperations.validateArgumentPins(this, diagnostics, context);
 	}
 
 	/**
@@ -231,8 +218,7 @@
 	 */
 	public boolean validateResultPins(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CallActionOperations.validateResultPins(this, diagnostics,
-			context);
+		return CallActionOperations.validateResultPins(this, diagnostics, context);
 	}
 
 	/**
@@ -242,8 +228,7 @@
 	 */
 	public boolean validateSynchronousCall(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CallActionOperations.validateSynchronousCall(this, diagnostics,
-			context);
+		return CallActionOperations.validateSynchronousCall(this, diagnostics, context);
 	}
 
 	/**
@@ -255,12 +240,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Parameter> result = (EList<Parameter>) cache.get(this,
-				UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS);
+			EList<Parameter> result = (EList<Parameter>) cache.get(this, UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS,
-					result = CallActionOperations.inputParameters(this));
+				cache.put(this, UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS, result = CallActionOperations.inputParameters(this));
 			}
 			return result;
 		}
@@ -276,12 +258,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Parameter> result = (EList<Parameter>) cache.get(this,
-				UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS);
+			EList<Parameter> result = (EList<Parameter>) cache.get(this, UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS,
-					result = CallActionOperations.outputParameters(this));
+				cache.put(this, UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS, result = CallActionOperations.outputParameters(this));
 			}
 			return result;
 		}
@@ -297,43 +276,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CALL_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CALL_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CALL_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.CALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CALL_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.CALL_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CALL_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CALL_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CALL_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CALL_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CALL_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CALL_ACTION__ARGUMENT :
-				return ((InternalEList<?>) getArguments()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CALL_ACTION__RESULT :
-				return ((InternalEList<?>) getResults()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.CALL_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.CALL_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.CALL_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_ACTION__ARGUMENT:
+			return ((InternalEList<?>) getArguments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_ACTION__RESULT:
+			return ((InternalEList<?>) getResults()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -346,84 +314,84 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CALL_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CALL_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CALL_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CALL_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CALL_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CALL_ACTION__NAME :
-				return getName();
-			case UMLPackage.CALL_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CALL_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CALL_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CALL_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CALL_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.CALL_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.CALL_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.CALL_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.CALL_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.CALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.CALL_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.CALL_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.CALL_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.CALL_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.CALL_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.CALL_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.CALL_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.CALL_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.CALL_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.CALL_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.CALL_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.CALL_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.CALL_ACTION__ARGUMENT :
-				return getArguments();
-			case UMLPackage.CALL_ACTION__ON_PORT :
-				if (resolve)
-					return getOnPort();
-				return basicGetOnPort();
-			case UMLPackage.CALL_ACTION__IS_SYNCHRONOUS :
-				return isSynchronous();
-			case UMLPackage.CALL_ACTION__RESULT :
-				return getResults();
+		case UMLPackage.CALL_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CALL_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CALL_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CALL_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CALL_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CALL_ACTION__NAME:
+			return getName();
+		case UMLPackage.CALL_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CALL_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CALL_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CALL_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CALL_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.CALL_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.CALL_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.CALL_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.CALL_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.CALL_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.CALL_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.CALL_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.CALL_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.CALL_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.CALL_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.CALL_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.CALL_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.CALL_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.CALL_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.CALL_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.CALL_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.CALL_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.CALL_ACTION__ARGUMENT:
+			return getArguments();
+		case UMLPackage.CALL_ACTION__ON_PORT:
+			if (resolve)
+				return getOnPort();
+			return basicGetOnPort();
+		case UMLPackage.CALL_ACTION__IS_SYNCHRONOUS:
+			return isSynchronous();
+		case UMLPackage.CALL_ACTION__RESULT:
+			return getResults();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -437,92 +405,81 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CALL_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__ARGUMENT :
-				getArguments().clear();
-				getArguments()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__ON_PORT :
-				setOnPort((Port) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__IS_SYNCHRONOUS :
-				setIsSynchronous((Boolean) newValue);
-				return;
-			case UMLPackage.CALL_ACTION__RESULT :
-				getResults().clear();
-				getResults().addAll((Collection<? extends OutputPin>) newValue);
-				return;
+		case UMLPackage.CALL_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__ARGUMENT:
+			getArguments().clear();
+			getArguments().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__ON_PORT:
+			setOnPort((Port) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__IS_SYNCHRONOUS:
+			setIsSynchronous((Boolean) newValue);
+			return;
+		case UMLPackage.CALL_ACTION__RESULT:
+			getResults().clear();
+			getResults().addAll((Collection<? extends OutputPin>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -535,69 +492,69 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CALL_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CALL_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CALL_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CALL_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CALL_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CALL_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.CALL_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.CALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.CALL_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.CALL_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.CALL_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.CALL_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.CALL_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.CALL_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.CALL_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.CALL_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.CALL_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.CALL_ACTION__ARGUMENT :
-				getArguments().clear();
-				return;
-			case UMLPackage.CALL_ACTION__ON_PORT :
-				setOnPort((Port) null);
-				return;
-			case UMLPackage.CALL_ACTION__IS_SYNCHRONOUS :
-				setIsSynchronous(IS_SYNCHRONOUS_EDEFAULT);
-				return;
-			case UMLPackage.CALL_ACTION__RESULT :
-				getResults().clear();
-				return;
+		case UMLPackage.CALL_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CALL_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CALL_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CALL_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CALL_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CALL_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.CALL_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.CALL_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.CALL_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.CALL_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.CALL_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.CALL_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.CALL_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.CALL_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.CALL_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.CALL_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.CALL_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.CALL_ACTION__ARGUMENT:
+			getArguments().clear();
+			return;
+		case UMLPackage.CALL_ACTION__ON_PORT:
+			setOnPort((Port) null);
+			return;
+		case UMLPackage.CALL_ACTION__IS_SYNCHRONOUS:
+			setIsSynchronous(IS_SYNCHRONOUS_EDEFAULT);
+			return;
+		case UMLPackage.CALL_ACTION__RESULT:
+			getResults().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -610,72 +567,70 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CALL_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CALL_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CALL_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CALL_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.CALL_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CALL_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.CALL_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CALL_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CALL_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CALL_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CALL_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.CALL_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.CALL_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.CALL_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.CALL_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.CALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.CALL_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.CALL_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.CALL_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.CALL_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.CALL_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.CALL_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.CALL_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.CALL_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.CALL_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.CALL_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.CALL_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.CALL_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.CALL_ACTION__ARGUMENT :
-				return !getArguments().isEmpty();
-			case UMLPackage.CALL_ACTION__ON_PORT :
-				return basicGetOnPort() != null;
-			case UMLPackage.CALL_ACTION__IS_SYNCHRONOUS :
-				return isSynchronous() != IS_SYNCHRONOUS_EDEFAULT;
-			case UMLPackage.CALL_ACTION__RESULT :
-				return !getResults().isEmpty();
+		case UMLPackage.CALL_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CALL_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CALL_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CALL_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.CALL_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CALL_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.CALL_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CALL_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CALL_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CALL_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CALL_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.CALL_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.CALL_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.CALL_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.CALL_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.CALL_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.CALL_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.CALL_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.CALL_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.CALL_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.CALL_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.CALL_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.CALL_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.CALL_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.CALL_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.CALL_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.CALL_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.CALL_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.CALL_ACTION__ARGUMENT:
+			return !getArguments().isEmpty();
+		case UMLPackage.CALL_ACTION__ON_PORT:
+			return basicGetOnPort() != null;
+		case UMLPackage.CALL_ACTION__IS_SYNCHRONOUS:
+			return isSynchronous() != IS_SYNCHRONOUS_EDEFAULT;
+		case UMLPackage.CALL_ACTION__RESULT:
+			return !getResults().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -690,166 +645,140 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CALL_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CALL_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CALL_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CALL_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CALL_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CALL_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CALL_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CALL_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CALL_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CALL_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CALL_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.CALL_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CALL_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CALL_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CALL_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CALL_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CALL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CALL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CALL_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CALL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CALL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CALL_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CALL_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CALL_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CALL_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CALL_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CALL_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CALL_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CALL_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CALL_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CALL_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CALL_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CALL_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CALL_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CALL_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CALL_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CALL_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CALL_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.CALL_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CALL_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.CALL_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.CALL_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.CALL_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.CALL_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.CALL_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.CALL_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.CALL_ACTION___VALIDATE_ARGUMENT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateArgumentPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_ACTION___VALIDATE_RESULT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateResultPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_ACTION___VALIDATE_SYNCHRONOUS_CALL__DIAGNOSTICCHAIN_MAP :
-				return validateSynchronousCall(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_ACTION___INPUT_PARAMETERS :
-				return inputParameters();
-			case UMLPackage.CALL_ACTION___OUTPUT_PARAMETERS :
-				return outputParameters();
+		case UMLPackage.CALL_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CALL_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CALL_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CALL_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CALL_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CALL_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CALL_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CALL_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CALL_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CALL_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CALL_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.CALL_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CALL_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CALL_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CALL_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CALL_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CALL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CALL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CALL_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CALL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CALL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CALL_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CALL_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CALL_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CALL_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CALL_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CALL_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CALL_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CALL_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CALL_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CALL_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CALL_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CALL_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CALL_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CALL_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CALL_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CALL_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CALL_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.CALL_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CALL_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.CALL_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.CALL_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.CALL_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.CALL_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.CALL_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.CALL_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.CALL_ACTION___VALIDATE_ARGUMENT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateArgumentPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_ACTION___VALIDATE_RESULT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateResultPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_ACTION___VALIDATE_SYNCHRONOUS_CALL__DIAGNOSTICCHAIN_MAP:
+			return validateSynchronousCall((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_ACTION___INPUT_PARAMETERS:
+			return inputParameters();
+		case UMLPackage.CALL_ACTION___OUTPUT_PARAMETERS:
+			return outputParameters();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -862,8 +791,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.CALL_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.CALL_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -872,7 +800,8 @@
 	 */
 	@Override
 	public boolean isSetOutputs() {
-		return super.isSetOutputs() || eIsSet(UMLPackage.CALL_ACTION__RESULT);
+		return super.isSetOutputs()
+				|| eIsSet(UMLPackage.CALL_ACTION__RESULT);
 	}
 
 } //CallActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallBehaviorActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallBehaviorActionImpl.java
index c09667b..140f4a5 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallBehaviorActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallBehaviorActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,11 +17,17 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.uml.Activity;
 import org.eclipse.uml2.uml.ActivityEdge;
@@ -90,9 +96,7 @@
 	 * @generated
 	 */
 	public Behavior getBehavior() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.CALL_BEHAVIOR_ACTION__BEHAVIOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CALL_BEHAVIOR_ACTION__BEHAVIOR, true, true);
+		return (Behavior) eDynamicGet(UMLPackage.CALL_BEHAVIOR_ACTION__BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CALL_BEHAVIOR_ACTION__BEHAVIOR, true, true);
 	}
 
 	/**
@@ -101,9 +105,7 @@
 	 * @generated
 	 */
 	public Behavior basicGetBehavior() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.CALL_BEHAVIOR_ACTION__BEHAVIOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CALL_BEHAVIOR_ACTION__BEHAVIOR, false, true);
+		return (Behavior) eDynamicGet(UMLPackage.CALL_BEHAVIOR_ACTION__BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CALL_BEHAVIOR_ACTION__BEHAVIOR, false, true);
 	}
 
 	/**
@@ -112,9 +114,7 @@
 	 * @generated
 	 */
 	public void setBehavior(Behavior newBehavior) {
-		eDynamicSet(
-			UMLPackage.CALL_BEHAVIOR_ACTION__BEHAVIOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CALL_BEHAVIOR_ACTION__BEHAVIOR, newBehavior);
+		eDynamicSet(UMLPackage.CALL_BEHAVIOR_ACTION__BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CALL_BEHAVIOR_ACTION__BEHAVIOR, newBehavior);
 	}
 
 	/**
@@ -124,8 +124,7 @@
 	 */
 	public boolean validateNoOnport(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CallBehaviorActionOperations.validateNoOnport(this, diagnostics,
-			context);
+		return CallBehaviorActionOperations.validateNoOnport(this, diagnostics, context);
 	}
 
 	/**
@@ -138,13 +137,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Parameter> result = (EList<Parameter>) cache.get(this,
-				UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS);
+			EList<Parameter> result = (EList<Parameter>) cache.get(this, UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS,
-					result = CallBehaviorActionOperations
-						.outputParameters(this));
+				cache.put(this, UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS, result = CallBehaviorActionOperations.outputParameters(this));
 			}
 			return result;
 		}
@@ -161,13 +156,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Parameter> result = (EList<Parameter>) cache.get(this,
-				UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS);
+			EList<Parameter> result = (EList<Parameter>) cache.get(this, UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS,
-					result = CallBehaviorActionOperations
-						.inputParameters(this));
+				cache.put(this, UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS, result = CallBehaviorActionOperations.inputParameters(this));
 			}
 			return result;
 		}
@@ -182,88 +173,88 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CALL_BEHAVIOR_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__NAME :
-				return getName();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__ARGUMENT :
-				return getArguments();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__ON_PORT :
-				if (resolve)
-					return getOnPort();
-				return basicGetOnPort();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IS_SYNCHRONOUS :
-				return isSynchronous();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__RESULT :
-				return getResults();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__BEHAVIOR :
-				if (resolve)
-					return getBehavior();
-				return basicGetBehavior();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__NAME:
+			return getName();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__ARGUMENT:
+			return getArguments();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__ON_PORT:
+			if (resolve)
+				return getOnPort();
+			return basicGetOnPort();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IS_SYNCHRONOUS:
+			return isSynchronous();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__RESULT:
+			return getResults();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__BEHAVIOR:
+			if (resolve)
+				return getBehavior();
+			return basicGetBehavior();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -277,95 +268,84 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CALL_BEHAVIOR_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__ARGUMENT :
-				getArguments().clear();
-				getArguments()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__ON_PORT :
-				setOnPort((Port) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IS_SYNCHRONOUS :
-				setIsSynchronous((Boolean) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__RESULT :
-				getResults().clear();
-				getResults().addAll((Collection<? extends OutputPin>) newValue);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__BEHAVIOR :
-				setBehavior((Behavior) newValue);
-				return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__ARGUMENT:
+			getArguments().clear();
+			getArguments().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__ON_PORT:
+			setOnPort((Port) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IS_SYNCHRONOUS:
+			setIsSynchronous((Boolean) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__RESULT:
+			getResults().clear();
+			getResults().addAll((Collection<? extends OutputPin>) newValue);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__BEHAVIOR:
+			setBehavior((Behavior) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -378,72 +358,72 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CALL_BEHAVIOR_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__ARGUMENT :
-				getArguments().clear();
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__ON_PORT :
-				setOnPort((Port) null);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IS_SYNCHRONOUS :
-				setIsSynchronous(IS_SYNCHRONOUS_EDEFAULT);
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__RESULT :
-				getResults().clear();
-				return;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__BEHAVIOR :
-				setBehavior((Behavior) null);
-				return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__ARGUMENT:
+			getArguments().clear();
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__ON_PORT:
+			setOnPort((Port) null);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IS_SYNCHRONOUS:
+			setIsSynchronous(IS_SYNCHRONOUS_EDEFAULT);
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__RESULT:
+			getResults().clear();
+			return;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__BEHAVIOR:
+			setBehavior((Behavior) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -456,74 +436,72 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CALL_BEHAVIOR_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CALL_BEHAVIOR_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__ARGUMENT :
-				return !getArguments().isEmpty();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__ON_PORT :
-				return basicGetOnPort() != null;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__IS_SYNCHRONOUS :
-				return isSynchronous() != IS_SYNCHRONOUS_EDEFAULT;
-			case UMLPackage.CALL_BEHAVIOR_ACTION__RESULT :
-				return !getResults().isEmpty();
-			case UMLPackage.CALL_BEHAVIOR_ACTION__BEHAVIOR :
-				return basicGetBehavior() != null;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CALL_BEHAVIOR_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__ARGUMENT:
+			return !getArguments().isEmpty();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__ON_PORT:
+			return basicGetOnPort() != null;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__IS_SYNCHRONOUS:
+			return isSynchronous() != IS_SYNCHRONOUS_EDEFAULT;
+		case UMLPackage.CALL_BEHAVIOR_ACTION__RESULT:
+			return !getResults().isEmpty();
+		case UMLPackage.CALL_BEHAVIOR_ACTION__BEHAVIOR:
+			return basicGetBehavior() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -538,169 +516,142 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CALL_BEHAVIOR_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_ARGUMENT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateArgumentPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_RESULT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateResultPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_SYNCHRONOUS_CALL__DIAGNOSTICCHAIN_MAP :
-				return validateSynchronousCall(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_BEHAVIOR_ACTION___INPUT_PARAMETERS :
-				return inputParameters();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___OUTPUT_PARAMETERS :
-				return outputParameters();
-			case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_NO_ONPORT__DIAGNOSTICCHAIN_MAP :
-				return validateNoOnport((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CALL_BEHAVIOR_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_ARGUMENT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateArgumentPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_RESULT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateResultPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_SYNCHRONOUS_CALL__DIAGNOSTICCHAIN_MAP:
+			return validateSynchronousCall((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_BEHAVIOR_ACTION___INPUT_PARAMETERS:
+			return inputParameters();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___OUTPUT_PARAMETERS:
+			return outputParameters();
+		case UMLPackage.CALL_BEHAVIOR_ACTION___VALIDATE_NO_ONPORT__DIAGNOSTICCHAIN_MAP:
+			return validateNoOnport((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallEventImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallEventImpl.java
index 2b6fb41..324d7b5 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallEventImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallEventImpl.java
@@ -1,20 +1,27 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.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.Operation;
@@ -65,9 +72,7 @@
 	 * @generated
 	 */
 	public Operation getOperation() {
-		return (Operation) eDynamicGet(
-			UMLPackage.CALL_EVENT__OPERATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CALL_EVENT__OPERATION, true, true);
+		return (Operation) eDynamicGet(UMLPackage.CALL_EVENT__OPERATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CALL_EVENT__OPERATION, true, true);
 	}
 
 	/**
@@ -76,9 +81,7 @@
 	 * @generated
 	 */
 	public Operation basicGetOperation() {
-		return (Operation) eDynamicGet(
-			UMLPackage.CALL_EVENT__OPERATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CALL_EVENT__OPERATION, false, true);
+		return (Operation) eDynamicGet(UMLPackage.CALL_EVENT__OPERATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CALL_EVENT__OPERATION, false, true);
 	}
 
 	/**
@@ -87,8 +90,7 @@
 	 * @generated
 	 */
 	public void setOperation(Operation newOperation) {
-		eDynamicSet(UMLPackage.CALL_EVENT__OPERATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CALL_EVENT__OPERATION, newOperation);
+		eDynamicSet(UMLPackage.CALL_EVENT__OPERATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CALL_EVENT__OPERATION, newOperation);
 	}
 
 	/**
@@ -99,44 +101,44 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CALL_EVENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CALL_EVENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CALL_EVENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CALL_EVENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CALL_EVENT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CALL_EVENT__NAME :
-				return getName();
-			case UMLPackage.CALL_EVENT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CALL_EVENT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CALL_EVENT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CALL_EVENT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CALL_EVENT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.CALL_EVENT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.CALL_EVENT__OPERATION :
-				if (resolve)
-					return getOperation();
-				return basicGetOperation();
+		case UMLPackage.CALL_EVENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CALL_EVENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CALL_EVENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CALL_EVENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CALL_EVENT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CALL_EVENT__NAME:
+			return getName();
+		case UMLPackage.CALL_EVENT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CALL_EVENT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CALL_EVENT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CALL_EVENT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CALL_EVENT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.CALL_EVENT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.CALL_EVENT__OPERATION:
+			if (resolve)
+				return getOperation();
+			return basicGetOperation();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -150,34 +152,32 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CALL_EVENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CALL_EVENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CALL_EVENT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CALL_EVENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CALL_EVENT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CALL_EVENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.CALL_EVENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.CALL_EVENT__OPERATION :
-				setOperation((Operation) newValue);
-				return;
+		case UMLPackage.CALL_EVENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CALL_EVENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CALL_EVENT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CALL_EVENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CALL_EVENT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CALL_EVENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.CALL_EVENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.CALL_EVENT__OPERATION:
+			setOperation((Operation) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -190,30 +190,30 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CALL_EVENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CALL_EVENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CALL_EVENT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CALL_EVENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CALL_EVENT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CALL_EVENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.CALL_EVENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.CALL_EVENT__OPERATION :
-				setOperation((Operation) null);
-				return;
+		case UMLPackage.CALL_EVENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CALL_EVENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CALL_EVENT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CALL_EVENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CALL_EVENT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CALL_EVENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.CALL_EVENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.CALL_EVENT__OPERATION:
+			setOperation((Operation) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -226,34 +226,32 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CALL_EVENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CALL_EVENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CALL_EVENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CALL_EVENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.CALL_EVENT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CALL_EVENT__NAME :
-				return isSetName();
-			case UMLPackage.CALL_EVENT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CALL_EVENT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CALL_EVENT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CALL_EVENT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CALL_EVENT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.CALL_EVENT__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.CALL_EVENT__OPERATION :
-				return basicGetOperation() != null;
+		case UMLPackage.CALL_EVENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CALL_EVENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CALL_EVENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CALL_EVENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.CALL_EVENT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CALL_EVENT__NAME:
+			return isSetName();
+		case UMLPackage.CALL_EVENT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CALL_EVENT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CALL_EVENT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CALL_EVENT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CALL_EVENT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.CALL_EVENT__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.CALL_EVENT__OPERATION:
+			return basicGetOperation() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallOperationActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallOperationActionImpl.java
index 38ea8f3..4dc4aa0 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallOperationActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CallOperationActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -109,19 +112,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.CALL_OPERATION_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.CALL_OPERATION_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.CALL_OPERATION_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.CALL_OPERATION_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -130,9 +127,7 @@
 	 * @generated
 	 */
 	public Operation getOperation() {
-		return (Operation) eDynamicGet(
-			UMLPackage.CALL_OPERATION_ACTION__OPERATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CALL_OPERATION_ACTION__OPERATION, true, true);
+		return (Operation) eDynamicGet(UMLPackage.CALL_OPERATION_ACTION__OPERATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CALL_OPERATION_ACTION__OPERATION, true, true);
 	}
 
 	/**
@@ -141,9 +136,7 @@
 	 * @generated
 	 */
 	public Operation basicGetOperation() {
-		return (Operation) eDynamicGet(
-			UMLPackage.CALL_OPERATION_ACTION__OPERATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CALL_OPERATION_ACTION__OPERATION, false, true);
+		return (Operation) eDynamicGet(UMLPackage.CALL_OPERATION_ACTION__OPERATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CALL_OPERATION_ACTION__OPERATION, false, true);
 	}
 
 	/**
@@ -152,9 +145,7 @@
 	 * @generated
 	 */
 	public void setOperation(Operation newOperation) {
-		eDynamicSet(
-			UMLPackage.CALL_OPERATION_ACTION__OPERATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CALL_OPERATION_ACTION__OPERATION, newOperation);
+		eDynamicSet(UMLPackage.CALL_OPERATION_ACTION__OPERATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CALL_OPERATION_ACTION__OPERATION, newOperation);
 	}
 
 	/**
@@ -163,9 +154,7 @@
 	 * @generated
 	 */
 	public InputPin getTarget() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.CALL_OPERATION_ACTION__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CALL_OPERATION_ACTION__TARGET, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.CALL_OPERATION_ACTION__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CALL_OPERATION_ACTION__TARGET, true, true);
 	}
 
 	/**
@@ -174,9 +163,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetTarget() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.CALL_OPERATION_ACTION__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CALL_OPERATION_ACTION__TARGET, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.CALL_OPERATION_ACTION__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CALL_OPERATION_ACTION__TARGET, false, true);
 	}
 
 	/**
@@ -186,8 +173,7 @@
 	 */
 	public NotificationChain basicSetTarget(InputPin newTarget,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newTarget,
-			UMLPackage.CALL_OPERATION_ACTION__TARGET, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newTarget, UMLPackage.CALL_OPERATION_ACTION__TARGET, msgs);
 		return msgs;
 	}
 
@@ -197,9 +183,7 @@
 	 * @generated
 	 */
 	public void setTarget(InputPin newTarget) {
-		eDynamicSet(
-			UMLPackage.CALL_OPERATION_ACTION__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CALL_OPERATION_ACTION__TARGET, newTarget);
+		eDynamicSet(UMLPackage.CALL_OPERATION_ACTION__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CALL_OPERATION_ACTION__TARGET, newTarget);
 	}
 
 	/**
@@ -233,8 +217,7 @@
 	 */
 	public boolean validateTypeTargetPin(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CallOperationActionOperations.validateTypeTargetPin(this,
-			diagnostics, context);
+		return CallOperationActionOperations.validateTypeTargetPin(this, diagnostics, context);
 	}
 
 	/**
@@ -247,13 +230,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Parameter> result = (EList<Parameter>) cache.get(this,
-				UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS);
+			EList<Parameter> result = (EList<Parameter>) cache.get(this, UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS,
-					result = CallOperationActionOperations
-						.outputParameters(this));
+				cache.put(this, UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS, result = CallOperationActionOperations.outputParameters(this));
 			}
 			return result;
 		}
@@ -270,13 +249,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Parameter> result = (EList<Parameter>) cache.get(this,
-				UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS);
+			EList<Parameter> result = (EList<Parameter>) cache.get(this, UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS,
-					result = CallOperationActionOperations
-						.inputParameters(this));
+				cache.put(this, UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS, result = CallOperationActionOperations.inputParameters(this));
 			}
 			return result;
 		}
@@ -292,45 +267,34 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CALL_OPERATION_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CALL_OPERATION_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CALL_OPERATION_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.CALL_OPERATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CALL_OPERATION_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.CALL_OPERATION_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CALL_OPERATION_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CALL_OPERATION_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CALL_OPERATION_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CALL_OPERATION_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CALL_OPERATION_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CALL_OPERATION_ACTION__ARGUMENT :
-				return ((InternalEList<?>) getArguments()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CALL_OPERATION_ACTION__RESULT :
-				return ((InternalEList<?>) getResults()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CALL_OPERATION_ACTION__TARGET :
-				return basicSetTarget(null, msgs);
+		case UMLPackage.CALL_OPERATION_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_OPERATION_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_OPERATION_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.CALL_OPERATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_OPERATION_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.CALL_OPERATION_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_OPERATION_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_OPERATION_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_OPERATION_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_OPERATION_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_OPERATION_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_OPERATION_ACTION__ARGUMENT:
+			return ((InternalEList<?>) getArguments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_OPERATION_ACTION__RESULT:
+			return ((InternalEList<?>) getResults()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CALL_OPERATION_ACTION__TARGET:
+			return basicSetTarget(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -343,92 +307,92 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CALL_OPERATION_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CALL_OPERATION_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CALL_OPERATION_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CALL_OPERATION_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CALL_OPERATION_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CALL_OPERATION_ACTION__NAME :
-				return getName();
-			case UMLPackage.CALL_OPERATION_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CALL_OPERATION_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CALL_OPERATION_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CALL_OPERATION_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CALL_OPERATION_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.CALL_OPERATION_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.CALL_OPERATION_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.CALL_OPERATION_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.CALL_OPERATION_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.CALL_OPERATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.CALL_OPERATION_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.CALL_OPERATION_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.CALL_OPERATION_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.CALL_OPERATION_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.CALL_OPERATION_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.CALL_OPERATION_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.CALL_OPERATION_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.CALL_OPERATION_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.CALL_OPERATION_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.CALL_OPERATION_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.CALL_OPERATION_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.CALL_OPERATION_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.CALL_OPERATION_ACTION__ARGUMENT :
-				return getArguments();
-			case UMLPackage.CALL_OPERATION_ACTION__ON_PORT :
-				if (resolve)
-					return getOnPort();
-				return basicGetOnPort();
-			case UMLPackage.CALL_OPERATION_ACTION__IS_SYNCHRONOUS :
-				return isSynchronous();
-			case UMLPackage.CALL_OPERATION_ACTION__RESULT :
-				return getResults();
-			case UMLPackage.CALL_OPERATION_ACTION__OPERATION :
-				if (resolve)
-					return getOperation();
-				return basicGetOperation();
-			case UMLPackage.CALL_OPERATION_ACTION__TARGET :
-				if (resolve)
-					return getTarget();
-				return basicGetTarget();
+		case UMLPackage.CALL_OPERATION_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CALL_OPERATION_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CALL_OPERATION_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CALL_OPERATION_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CALL_OPERATION_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CALL_OPERATION_ACTION__NAME:
+			return getName();
+		case UMLPackage.CALL_OPERATION_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CALL_OPERATION_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CALL_OPERATION_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CALL_OPERATION_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CALL_OPERATION_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.CALL_OPERATION_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.CALL_OPERATION_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.CALL_OPERATION_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.CALL_OPERATION_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.CALL_OPERATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.CALL_OPERATION_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.CALL_OPERATION_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.CALL_OPERATION_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.CALL_OPERATION_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.CALL_OPERATION_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.CALL_OPERATION_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.CALL_OPERATION_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.CALL_OPERATION_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.CALL_OPERATION_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.CALL_OPERATION_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.CALL_OPERATION_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.CALL_OPERATION_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.CALL_OPERATION_ACTION__ARGUMENT:
+			return getArguments();
+		case UMLPackage.CALL_OPERATION_ACTION__ON_PORT:
+			if (resolve)
+				return getOnPort();
+			return basicGetOnPort();
+		case UMLPackage.CALL_OPERATION_ACTION__IS_SYNCHRONOUS:
+			return isSynchronous();
+		case UMLPackage.CALL_OPERATION_ACTION__RESULT:
+			return getResults();
+		case UMLPackage.CALL_OPERATION_ACTION__OPERATION:
+			if (resolve)
+				return getOperation();
+			return basicGetOperation();
+		case UMLPackage.CALL_OPERATION_ACTION__TARGET:
+			if (resolve)
+				return getTarget();
+			return basicGetTarget();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -442,98 +406,87 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CALL_OPERATION_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__ARGUMENT :
-				getArguments().clear();
-				getArguments()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__ON_PORT :
-				setOnPort((Port) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__IS_SYNCHRONOUS :
-				setIsSynchronous((Boolean) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__RESULT :
-				getResults().clear();
-				getResults().addAll((Collection<? extends OutputPin>) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__OPERATION :
-				setOperation((Operation) newValue);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__TARGET :
-				setTarget((InputPin) newValue);
-				return;
+		case UMLPackage.CALL_OPERATION_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__ARGUMENT:
+			getArguments().clear();
+			getArguments().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__ON_PORT:
+			setOnPort((Port) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__IS_SYNCHRONOUS:
+			setIsSynchronous((Boolean) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__RESULT:
+			getResults().clear();
+			getResults().addAll((Collection<? extends OutputPin>) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__OPERATION:
+			setOperation((Operation) newValue);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__TARGET:
+			setTarget((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -546,75 +499,75 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CALL_OPERATION_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__ARGUMENT :
-				getArguments().clear();
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__ON_PORT :
-				setOnPort((Port) null);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__IS_SYNCHRONOUS :
-				setIsSynchronous(IS_SYNCHRONOUS_EDEFAULT);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__RESULT :
-				getResults().clear();
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__OPERATION :
-				setOperation((Operation) null);
-				return;
-			case UMLPackage.CALL_OPERATION_ACTION__TARGET :
-				setTarget((InputPin) null);
-				return;
+		case UMLPackage.CALL_OPERATION_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__ARGUMENT:
+			getArguments().clear();
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__ON_PORT:
+			setOnPort((Port) null);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__IS_SYNCHRONOUS:
+			setIsSynchronous(IS_SYNCHRONOUS_EDEFAULT);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__RESULT:
+			getResults().clear();
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__OPERATION:
+			setOperation((Operation) null);
+			return;
+		case UMLPackage.CALL_OPERATION_ACTION__TARGET:
+			setTarget((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -627,76 +580,74 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CALL_OPERATION_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CALL_OPERATION_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CALL_OPERATION_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CALL_OPERATION_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.CALL_OPERATION_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CALL_OPERATION_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.CALL_OPERATION_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CALL_OPERATION_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CALL_OPERATION_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CALL_OPERATION_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CALL_OPERATION_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.CALL_OPERATION_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.CALL_OPERATION_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.CALL_OPERATION_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.CALL_OPERATION_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.CALL_OPERATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.CALL_OPERATION_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.CALL_OPERATION_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.CALL_OPERATION_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.CALL_OPERATION_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.CALL_OPERATION_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.CALL_OPERATION_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.CALL_OPERATION_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.CALL_OPERATION_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.CALL_OPERATION_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.CALL_OPERATION_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.CALL_OPERATION_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.CALL_OPERATION_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.CALL_OPERATION_ACTION__ARGUMENT :
-				return !getArguments().isEmpty();
-			case UMLPackage.CALL_OPERATION_ACTION__ON_PORT :
-				return basicGetOnPort() != null;
-			case UMLPackage.CALL_OPERATION_ACTION__IS_SYNCHRONOUS :
-				return isSynchronous() != IS_SYNCHRONOUS_EDEFAULT;
-			case UMLPackage.CALL_OPERATION_ACTION__RESULT :
-				return !getResults().isEmpty();
-			case UMLPackage.CALL_OPERATION_ACTION__OPERATION :
-				return basicGetOperation() != null;
-			case UMLPackage.CALL_OPERATION_ACTION__TARGET :
-				return basicGetTarget() != null;
+		case UMLPackage.CALL_OPERATION_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CALL_OPERATION_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CALL_OPERATION_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CALL_OPERATION_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.CALL_OPERATION_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CALL_OPERATION_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.CALL_OPERATION_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CALL_OPERATION_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CALL_OPERATION_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CALL_OPERATION_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CALL_OPERATION_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.CALL_OPERATION_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.CALL_OPERATION_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.CALL_OPERATION_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.CALL_OPERATION_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.CALL_OPERATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.CALL_OPERATION_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.CALL_OPERATION_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.CALL_OPERATION_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.CALL_OPERATION_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.CALL_OPERATION_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.CALL_OPERATION_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.CALL_OPERATION_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.CALL_OPERATION_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.CALL_OPERATION_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.CALL_OPERATION_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.CALL_OPERATION_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.CALL_OPERATION_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.CALL_OPERATION_ACTION__ARGUMENT:
+			return !getArguments().isEmpty();
+		case UMLPackage.CALL_OPERATION_ACTION__ON_PORT:
+			return basicGetOnPort() != null;
+		case UMLPackage.CALL_OPERATION_ACTION__IS_SYNCHRONOUS:
+			return isSynchronous() != IS_SYNCHRONOUS_EDEFAULT;
+		case UMLPackage.CALL_OPERATION_ACTION__RESULT:
+			return !getResults().isEmpty();
+		case UMLPackage.CALL_OPERATION_ACTION__OPERATION:
+			return basicGetOperation() != null;
+		case UMLPackage.CALL_OPERATION_ACTION__TARGET:
+			return basicGetTarget() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -711,169 +662,142 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CALL_OPERATION_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_OPERATION_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CALL_OPERATION_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CALL_OPERATION_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CALL_OPERATION_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CALL_OPERATION_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CALL_OPERATION_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.CALL_OPERATION_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CALL_OPERATION_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CALL_OPERATION_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CALL_OPERATION_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CALL_OPERATION_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CALL_OPERATION_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CALL_OPERATION_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CALL_OPERATION_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CALL_OPERATION_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CALL_OPERATION_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CALL_OPERATION_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_OPERATION_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CALL_OPERATION_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CALL_OPERATION_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CALL_OPERATION_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CALL_OPERATION_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CALL_OPERATION_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CALL_OPERATION_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.CALL_OPERATION_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_OPERATION_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.CALL_OPERATION_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.CALL_OPERATION_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.CALL_OPERATION_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.CALL_OPERATION_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.CALL_OPERATION_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_ARGUMENT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateArgumentPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_RESULT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateResultPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_SYNCHRONOUS_CALL__DIAGNOSTICCHAIN_MAP :
-				return validateSynchronousCall(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CALL_OPERATION_ACTION___INPUT_PARAMETERS :
-				return inputParameters();
-			case UMLPackage.CALL_OPERATION_ACTION___OUTPUT_PARAMETERS :
-				return outputParameters();
-			case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_TYPE_TARGET_PIN__DIAGNOSTICCHAIN_MAP :
-				return validateTypeTargetPin((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CALL_OPERATION_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CALL_OPERATION_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CALL_OPERATION_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CALL_OPERATION_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.CALL_OPERATION_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CALL_OPERATION_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CALL_OPERATION_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CALL_OPERATION_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CALL_OPERATION_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CALL_OPERATION_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CALL_OPERATION_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CALL_OPERATION_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CALL_OPERATION_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CALL_OPERATION_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CALL_OPERATION_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CALL_OPERATION_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CALL_OPERATION_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CALL_OPERATION_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.CALL_OPERATION_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.CALL_OPERATION_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.CALL_OPERATION_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.CALL_OPERATION_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.CALL_OPERATION_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.CALL_OPERATION_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_ARGUMENT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateArgumentPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_RESULT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateResultPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_SYNCHRONOUS_CALL__DIAGNOSTICCHAIN_MAP:
+			return validateSynchronousCall((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CALL_OPERATION_ACTION___INPUT_PARAMETERS:
+			return inputParameters();
+		case UMLPackage.CALL_OPERATION_ACTION___OUTPUT_PARAMETERS:
+			return outputParameters();
+		case UMLPackage.CALL_OPERATION_ACTION___VALIDATE_TYPE_TARGET_PIN__DIAGNOSTICCHAIN_MAP:
+			return validateTypeTargetPin((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -886,9 +810,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.CALL_OPERATION_ACTION__ARGUMENT,
-		UMLPackage.CALL_OPERATION_ACTION__TARGET};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.CALL_OPERATION_ACTION__ARGUMENT, UMLPackage.CALL_OPERATION_ACTION__TARGET };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -898,7 +820,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.CALL_OPERATION_ACTION__TARGET);
+				|| eIsSet(UMLPackage.CALL_OPERATION_ACTION__TARGET);
 	}
 
 } //CallOperationActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CentralBufferNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CentralBufferNodeImpl.java
index 5b31b18..281affe 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CentralBufferNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CentralBufferNodeImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ChangeEventImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ChangeEventImpl.java
index bf9a958..c76a124 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ChangeEventImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ChangeEventImpl.java
@@ -1,18 +1,20 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -21,6 +23,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -86,20 +90,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.CHANGE_EVENT__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.CHANGE_EVENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.CHANGE_EVENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.CHANGE_EVENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -108,9 +105,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getChangeExpression() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CHANGE_EVENT__CHANGE_EXPRESSION, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CHANGE_EVENT__CHANGE_EXPRESSION, true, true);
 	}
 
 	/**
@@ -119,9 +114,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetChangeExpression() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CHANGE_EVENT__CHANGE_EXPRESSION, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CHANGE_EVENT__CHANGE_EXPRESSION, false, true);
 	}
 
 	/**
@@ -131,8 +124,7 @@
 	 */
 	public NotificationChain basicSetChangeExpression(
 			ValueSpecification newChangeExpression, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newChangeExpression,
-			UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newChangeExpression, UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION, msgs);
 		return msgs;
 	}
 
@@ -142,10 +134,7 @@
 	 * @generated
 	 */
 	public void setChangeExpression(ValueSpecification newChangeExpression) {
-		eDynamicSet(
-			UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CHANGE_EVENT__CHANGE_EXPRESSION,
-			newChangeExpression);
+		eDynamicSet(UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CHANGE_EVENT__CHANGE_EXPRESSION, newChangeExpression);
 	}
 
 	/**
@@ -155,8 +144,7 @@
 	 */
 	public ValueSpecification createChangeExpression(String name, Type type,
 			EClass eClass) {
-		ValueSpecification newChangeExpression = (ValueSpecification) create(
-			eClass);
+		ValueSpecification newChangeExpression = (ValueSpecification) create(eClass);
 		setChangeExpression(newChangeExpression);
 		if (name != null)
 			newChangeExpression.setName(name);
@@ -174,20 +162,18 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CHANGE_EVENT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CHANGE_EVENT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CHANGE_EVENT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.CHANGE_EVENT__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.CHANGE_EVENT__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION :
-				return basicSetChangeExpression(null, msgs);
+		case UMLPackage.CHANGE_EVENT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CHANGE_EVENT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CHANGE_EVENT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.CHANGE_EVENT__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.CHANGE_EVENT__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION:
+			return basicSetChangeExpression(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -200,44 +186,44 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CHANGE_EVENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CHANGE_EVENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CHANGE_EVENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CHANGE_EVENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CHANGE_EVENT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CHANGE_EVENT__NAME :
-				return getName();
-			case UMLPackage.CHANGE_EVENT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CHANGE_EVENT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CHANGE_EVENT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CHANGE_EVENT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CHANGE_EVENT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.CHANGE_EVENT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION :
-				if (resolve)
-					return getChangeExpression();
-				return basicGetChangeExpression();
+		case UMLPackage.CHANGE_EVENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CHANGE_EVENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CHANGE_EVENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CHANGE_EVENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CHANGE_EVENT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CHANGE_EVENT__NAME:
+			return getName();
+		case UMLPackage.CHANGE_EVENT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CHANGE_EVENT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CHANGE_EVENT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CHANGE_EVENT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CHANGE_EVENT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.CHANGE_EVENT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION:
+			if (resolve)
+				return getChangeExpression();
+			return basicGetChangeExpression();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -251,34 +237,32 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CHANGE_EVENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CHANGE_EVENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CHANGE_EVENT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CHANGE_EVENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CHANGE_EVENT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CHANGE_EVENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.CHANGE_EVENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION :
-				setChangeExpression((ValueSpecification) newValue);
-				return;
+		case UMLPackage.CHANGE_EVENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CHANGE_EVENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CHANGE_EVENT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CHANGE_EVENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CHANGE_EVENT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CHANGE_EVENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.CHANGE_EVENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION:
+			setChangeExpression((ValueSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -291,30 +275,30 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CHANGE_EVENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CHANGE_EVENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CHANGE_EVENT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CHANGE_EVENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CHANGE_EVENT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CHANGE_EVENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.CHANGE_EVENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION :
-				setChangeExpression((ValueSpecification) null);
-				return;
+		case UMLPackage.CHANGE_EVENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CHANGE_EVENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CHANGE_EVENT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CHANGE_EVENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CHANGE_EVENT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CHANGE_EVENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.CHANGE_EVENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION:
+			setChangeExpression((ValueSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -327,34 +311,32 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CHANGE_EVENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CHANGE_EVENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CHANGE_EVENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CHANGE_EVENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.CHANGE_EVENT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CHANGE_EVENT__NAME :
-				return isSetName();
-			case UMLPackage.CHANGE_EVENT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CHANGE_EVENT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CHANGE_EVENT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CHANGE_EVENT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CHANGE_EVENT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.CHANGE_EVENT__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION :
-				return basicGetChangeExpression() != null;
+		case UMLPackage.CHANGE_EVENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CHANGE_EVENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CHANGE_EVENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CHANGE_EVENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.CHANGE_EVENT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CHANGE_EVENT__NAME:
+			return isSetName();
+		case UMLPackage.CHANGE_EVENT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CHANGE_EVENT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CHANGE_EVENT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CHANGE_EVENT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CHANGE_EVENT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.CHANGE_EVENT__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION:
+			return basicGetChangeExpression() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -367,10 +349,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.CHANGE_EVENT__OWNED_COMMENT,
-		UMLPackage.CHANGE_EVENT__NAME_EXPRESSION,
-		UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.CHANGE_EVENT__OWNED_COMMENT, UMLPackage.CHANGE_EVENT__NAME_EXPRESSION, UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -380,7 +359,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION);
+				|| eIsSet(UMLPackage.CHANGE_EVENT__CHANGE_EXPRESSION);
 	}
 
 } //ChangeEventImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClassImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClassImpl.java
index d8d2e22..967802d 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClassImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClassImpl.java
@@ -1,38 +1,51 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
+
 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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.InternalEList;
+
 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.cdo.internal.util.SubsetSupersetEObjectContainmentEList;
+
 import org.eclipse.uml2.uml.AggregationKind;
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.BehavioredClassifier;
@@ -70,6 +83,7 @@
 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;
 import org.eclipse.uml2.uml.internal.operations.ClassOperations;
 
@@ -133,17 +147,9 @@
 		return UMLPackage.Literals.CLASS;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR) {
 			return createOwnedBehaviorsList();
 		}
@@ -162,19 +168,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.CLASS__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.CLASS__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.CLASS__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.CLASS__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -188,19 +188,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.CLASS__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.CLASS__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.CLASS__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.CLASS__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -210,16 +204,13 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Behavior> getOwnedBehaviors() {
-		return (EList<Behavior>) eDynamicGet(
-			UMLPackage.CLASS__OWNED_BEHAVIOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR, true,
-			true);
+		return (EList<Behavior>) eDynamicGet(UMLPackage.CLASS__OWNED_BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR, true, true);
 	}
 
 	private EList<Behavior> createOwnedBehaviorsList() {
 		return new SubsetSupersetEObjectContainmentEList.Resolving<Behavior>(
-			Behavior.class, this, UMLPackage.CLASS__OWNED_BEHAVIOR, null,
-			OWNED_BEHAVIOR_ESUBSETS);
+				Behavior.class, this, UMLPackage.CLASS__OWNED_BEHAVIOR, null,
+				OWNED_BEHAVIOR_ESUBSETS);
 	}
 
 	/**
@@ -228,10 +219,7 @@
 	 * @generated
 	 */
 	public Behavior getClassifierBehavior() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.CLASS__CLASSIFIER_BEHAVIOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR,
-			true, true);
+		return (Behavior) eDynamicGet(UMLPackage.CLASS__CLASSIFIER_BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR, true, true);
 	}
 
 	/**
@@ -240,10 +228,7 @@
 	 * @generated
 	 */
 	public Behavior basicGetClassifierBehavior() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.CLASS__CLASSIFIER_BEHAVIOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR,
-			false, true);
+		return (Behavior) eDynamicGet(UMLPackage.CLASS__CLASSIFIER_BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR, false, true);
 	}
 
 	/**
@@ -252,10 +237,7 @@
 	 * @generated
 	 */
 	public void setClassifierBehavior(Behavior newClassifierBehavior) {
-		eDynamicSet(
-			UMLPackage.CLASS__CLASSIFIER_BEHAVIOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR,
-			newClassifierBehavior);
+		eDynamicSet(UMLPackage.CLASS__CLASSIFIER_BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR, newClassifierBehavior);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newClassifierBehavior != null) {
@@ -287,10 +269,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<InterfaceRealization> getInterfaceRealizations() {
-		return (EList<InterfaceRealization>) eDynamicGet(
-			UMLPackage.CLASS__INTERFACE_REALIZATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION,
-			true, true);
+		return (EList<InterfaceRealization>) eDynamicGet(UMLPackage.CLASS__INTERFACE_REALIZATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION, true, true);
 	}
 
 	/**
@@ -304,19 +283,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Feature> features = (EList<Feature>) cache.get(eResource,
-				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
+			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>(
-						Feature.class, this, UMLPackage.CLASS__FEATURE,
-						FEATURE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.CLASSIFIER__FEATURE, features = new DerivedUnionEObjectEList<Feature>(Feature.class, this, UMLPackage.CLASS__FEATURE, FEATURE_ESUBSETS));
 			}
 			return features;
 		}
-		return new DerivedUnionEObjectEList<Feature>(Feature.class, this,
-			UMLPackage.CLASS__FEATURE, FEATURE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this, UMLPackage.CLASS__FEATURE, FEATURE_ESUBSETS);
 	}
 
 	/**
@@ -330,19 +303,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Property> attributes = (EList<Property>) cache.get(eResource,
-				this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
+			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>(
-						Property.class, this, UMLPackage.CLASS__ATTRIBUTE,
-						ATTRIBUTE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE, attributes = new DerivedUnionEObjectEList<Property>(Property.class, this, UMLPackage.CLASS__ATTRIBUTE, ATTRIBUTE_ESUBSETS));
 			}
 			return attributes;
 		}
-		return new DerivedUnionEObjectEList<Property>(Property.class, this,
-			UMLPackage.CLASS__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Property>(Property.class, this, UMLPackage.CLASS__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
 	}
 
 	/**
@@ -352,9 +319,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Operation> getOwnedOperations() {
-		return (EList<Operation>) eDynamicGet(
-			UMLPackage.CLASS__OWNED_OPERATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASS__OWNED_OPERATION, true, true);
+		return (EList<Operation>) eDynamicGet(UMLPackage.CLASS__OWNED_OPERATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASS__OWNED_OPERATION, true, true);
 	}
 
 	/**
@@ -365,29 +330,19 @@
 	public Operation createOwnedOperation(String name,
 			EList<String> ownedParameterNames,
 			EList<Type> ownedParameterTypes) {
-		Operation newOwnedOperation = (Operation) create(
-			UMLPackage.Literals.OPERATION);
+		Operation newOwnedOperation = (Operation) create(UMLPackage.Literals.OPERATION);
 		getOwnedOperations().add(newOwnedOperation);
 		if (name != null)
 			newOwnedOperation.setName(name);
 		int ownedParameterListSize = 0;
-		int ownedParameterNamesSize = ownedParameterNames == null
-			? 0
-			: ownedParameterNames.size();
+		int ownedParameterNamesSize = ownedParameterNames == null ? 0 : ownedParameterNames.size();
 		if (ownedParameterNamesSize > ownedParameterListSize)
 			ownedParameterListSize = ownedParameterNamesSize;
-		int ownedParameterTypesSize = ownedParameterTypes == null
-			? 0
-			: ownedParameterTypes.size();
+		int ownedParameterTypesSize = ownedParameterTypes == null ? 0 : ownedParameterTypes.size();
 		if (ownedParameterTypesSize > ownedParameterListSize)
 			ownedParameterListSize = ownedParameterTypesSize;
 		for (int i = 0; i < ownedParameterListSize; i++) {
-			newOwnedOperation.createOwnedParameter(i < ownedParameterNamesSize
-				? (String) ownedParameterNames.get(i)
-				: null,
-				i < ownedParameterTypesSize
-					? (Type) ownedParameterTypes.get(i)
-					: null);
+			newOwnedOperation.createOwnedParameter(i < ownedParameterNamesSize ? (String) ownedParameterNames.get(i) : null, i < ownedParameterTypesSize ? (Type) ownedParameterTypes.get(i) : null);
 		}
 		return newOwnedOperation;
 	}
@@ -400,8 +355,7 @@
 	public Operation getOwnedOperation(String name,
 			EList<String> ownedParameterNames,
 			EList<Type> ownedParameterTypes) {
-		return getOwnedOperation(name, ownedParameterNames, ownedParameterTypes,
-			false, false);
+		return getOwnedOperation(name, ownedParameterNames, ownedParameterTypes, false, false);
 	}
 
 	/**
@@ -412,37 +366,23 @@
 	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())))
+		ownedOperationLoop: for (Operation ownedOperation : getOwnedOperations()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedOperation.getName()) : name.equals(ownedOperation.getName())))
 				continue ownedOperationLoop;
-			EList<Parameter> ownedParameterList = ownedOperation
-				.getOwnedParameters();
+			EList<Parameter> ownedParameterList = ownedOperation.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
-			if (ownedParameterNames != null
-				&& ownedParameterNames.size() != ownedParameterListSize
-				|| (ownedParameterTypes != null
-					&& ownedParameterTypes.size() != ownedParameterListSize))
+			if (ownedParameterNames != null && ownedParameterNames.size() != ownedParameterListSize || (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue ownedOperationLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
 				Parameter ownedParameter = ownedParameterList.get(j);
-				if (ownedParameterNames != null && !(ignoreCase
-					? (ownedParameterNames.get(j))
-						.equalsIgnoreCase(ownedParameter.getName())
-					: ownedParameterNames.get(j)
-						.equals(ownedParameter.getName())))
+				if (ownedParameterNames != null && !(ignoreCase ? (ownedParameterNames.get(j)).equalsIgnoreCase(ownedParameter.getName()) : ownedParameterNames.get(j).equals(ownedParameter.getName())))
 					continue ownedOperationLoop;
-				if (ownedParameterTypes != null && !ownedParameterTypes.get(j)
-					.equals(ownedParameter.getType()))
+				if (ownedParameterTypes != null && !ownedParameterTypes.get(j).equals(ownedParameter.getType()))
 					continue ownedOperationLoop;
 			}
 			return ownedOperation;
 		}
-		return createOnDemand
-			? createOwnedOperation(name, ownedParameterNames,
-				ownedParameterTypes)
-			: null;
+		return createOnDemand ? createOwnedOperation(name, ownedParameterNames, ownedParameterTypes) : null;
 	}
 
 	/**
@@ -452,9 +392,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Classifier> getNestedClassifiers() {
-		return (EList<Classifier>) eDynamicGet(
-			UMLPackage.CLASS__NESTED_CLASSIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASS__NESTED_CLASSIFIER, true, true);
+		return (EList<Classifier>) eDynamicGet(UMLPackage.CLASS__NESTED_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASS__NESTED_CLASSIFIER, true, true);
 	}
 
 	/**
@@ -486,18 +424,14 @@
 	 */
 	public Classifier getNestedClassifier(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		nestedClassifierLoop : for (Classifier nestedClassifier : getNestedClassifiers()) {
+		nestedClassifierLoop: for (Classifier nestedClassifier : getNestedClassifiers()) {
 			if (eClass != null && !eClass.isInstance(nestedClassifier))
 				continue nestedClassifierLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(nestedClassifier.getName())
-				: name.equals(nestedClassifier.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(nestedClassifier.getName()) : name.equals(nestedClassifier.getName())))
 				continue nestedClassifierLoop;
 			return nestedClassifier;
 		}
-		return createOnDemand && eClass != null
-			? createNestedClassifier(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createNestedClassifier(name, eClass) : null;
 	}
 
 	protected static class SuperClassEList
@@ -511,7 +445,7 @@
 		@Override
 		public List<Object> basicList() {
 			return new SuperClassEList(dataClass, owner, featureID,
-				sourceFeatureIDs) {
+					sourceFeatureIDs) {
 
 				@Override
 				public ListIterator<Object> listIterator(int index) {
@@ -533,9 +467,9 @@
 		@Override
 		protected Generalization validate(int index, Object object) {
 			Generalization generalization = UMLFactory.eINSTANCE
-				.createGeneralization();
+					.createGeneralization();
 			generalization
-				.setGeneral((Classifier) super.validate(index, object));
+					.setGeneral((Classifier) super.validate(index, object));
 			return generalization;
 		}
 
@@ -545,8 +479,8 @@
 	 * The array of superset feature identifiers for the '{@link #getSuperClasses() <em>Super Class</em>}' reference list.
 	 * @see #getSuperClasses()
 	 */
-	protected static final int[] SUPER_CLASS_ESUPERSETS = new int[]{
-		UMLPackage.CLASS__GENERALIZATION};
+	protected static final int[] SUPER_CLASS_ESUPERSETS = new int[] {
+			UMLPackage.CLASS__GENERALIZATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -559,20 +493,20 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			EList<org.eclipse.uml2.uml.Class> superClasses = (EList<org.eclipse.uml2.uml.Class>) cache
-				.get(eResource, this, UMLPackage.Literals.CLASS__SUPER_CLASS);
+					.get(eResource, this, UMLPackage.Literals.CLASS__SUPER_CLASS);
 			if (superClasses == null) {
 				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)));
+						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 (EList<org.eclipse.uml2.uml.Class>) ((EList<?>) new SuperClassEList(
-			org.eclipse.uml2.uml.Class.class, this,
-			UMLPackage.CLASS__SUPER_CLASS, SUPER_CLASS_ESUPERSETS));
+				org.eclipse.uml2.uml.Class.class, this,
+				UMLPackage.CLASS__SUPER_CLASS, SUPER_CLASS_ESUPERSETS));
 	}
 
 	/**
@@ -591,12 +525,10 @@
 	 */
 	public org.eclipse.uml2.uml.Class getSuperClass(String name,
 			boolean ignoreCase, EClass eClass) {
-		superClassLoop : for (org.eclipse.uml2.uml.Class superClass : getSuperClasses()) {
+		superClassLoop: for (org.eclipse.uml2.uml.Class superClass : getSuperClasses()) {
 			if (eClass != null && !eClass.isInstance(superClass))
 				continue superClassLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(superClass.getName())
-				: name.equals(superClass.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(superClass.getName()) : name.equals(superClass.getName())))
 				continue superClassLoop;
 			return superClass;
 		}
@@ -618,9 +550,7 @@
 	 * @generated
 	 */
 	public boolean isActive() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.CLASS__IS_ACTIVE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASS__IS_ACTIVE, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.CLASS__IS_ACTIVE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASS__IS_ACTIVE, true, true);
 	}
 
 	/**
@@ -629,8 +559,7 @@
 	 * @generated
 	 */
 	public void setIsActive(boolean newIsActive) {
-		eDynamicSet(UMLPackage.CLASS__IS_ACTIVE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASS__IS_ACTIVE, newIsActive);
+		eDynamicSet(UMLPackage.CLASS__IS_ACTIVE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASS__IS_ACTIVE, newIsActive);
 	}
 
 	/**
@@ -640,9 +569,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Reception> getOwnedReceptions() {
-		return (EList<Reception>) eDynamicGet(
-			UMLPackage.CLASS__OWNED_RECEPTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASS__OWNED_RECEPTION, true, true);
+		return (EList<Reception>) eDynamicGet(UMLPackage.CLASS__OWNED_RECEPTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASS__OWNED_RECEPTION, true, true);
 	}
 
 	/**
@@ -653,29 +580,19 @@
 	public Reception createOwnedReception(String name,
 			EList<String> ownedParameterNames,
 			EList<Type> ownedParameterTypes) {
-		Reception newOwnedReception = (Reception) create(
-			UMLPackage.Literals.RECEPTION);
+		Reception newOwnedReception = (Reception) create(UMLPackage.Literals.RECEPTION);
 		getOwnedReceptions().add(newOwnedReception);
 		if (name != null)
 			newOwnedReception.setName(name);
 		int ownedParameterListSize = 0;
-		int ownedParameterNamesSize = ownedParameterNames == null
-			? 0
-			: ownedParameterNames.size();
+		int ownedParameterNamesSize = ownedParameterNames == null ? 0 : ownedParameterNames.size();
 		if (ownedParameterNamesSize > ownedParameterListSize)
 			ownedParameterListSize = ownedParameterNamesSize;
-		int ownedParameterTypesSize = ownedParameterTypes == null
-			? 0
-			: ownedParameterTypes.size();
+		int ownedParameterTypesSize = ownedParameterTypes == null ? 0 : ownedParameterTypes.size();
 		if (ownedParameterTypesSize > ownedParameterListSize)
 			ownedParameterListSize = ownedParameterTypesSize;
 		for (int i = 0; i < ownedParameterListSize; i++) {
-			newOwnedReception.createOwnedParameter(i < ownedParameterNamesSize
-				? (String) ownedParameterNames.get(i)
-				: null,
-				i < ownedParameterTypesSize
-					? (Type) ownedParameterTypes.get(i)
-					: null);
+			newOwnedReception.createOwnedParameter(i < ownedParameterNamesSize ? (String) ownedParameterNames.get(i) : null, i < ownedParameterTypesSize ? (Type) ownedParameterTypes.get(i) : null);
 		}
 		return newOwnedReception;
 	}
@@ -688,8 +605,7 @@
 	public Reception getOwnedReception(String name,
 			EList<String> ownedParameterNames,
 			EList<Type> ownedParameterTypes) {
-		return getOwnedReception(name, ownedParameterNames, ownedParameterTypes,
-			false, false);
+		return getOwnedReception(name, ownedParameterNames, ownedParameterTypes, false, false);
 	}
 
 	/**
@@ -700,37 +616,23 @@
 	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())))
+		ownedReceptionLoop: for (Reception ownedReception : getOwnedReceptions()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedReception.getName()) : name.equals(ownedReception.getName())))
 				continue ownedReceptionLoop;
-			EList<Parameter> ownedParameterList = ownedReception
-				.getOwnedParameters();
+			EList<Parameter> ownedParameterList = ownedReception.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
-			if (ownedParameterNames != null
-				&& ownedParameterNames.size() != ownedParameterListSize
-				|| (ownedParameterTypes != null
-					&& ownedParameterTypes.size() != ownedParameterListSize))
+			if (ownedParameterNames != null && ownedParameterNames.size() != ownedParameterListSize || (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue ownedReceptionLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
 				Parameter ownedParameter = ownedParameterList.get(j);
-				if (ownedParameterNames != null && !(ignoreCase
-					? (ownedParameterNames.get(j))
-						.equalsIgnoreCase(ownedParameter.getName())
-					: ownedParameterNames.get(j)
-						.equals(ownedParameter.getName())))
+				if (ownedParameterNames != null && !(ignoreCase ? (ownedParameterNames.get(j)).equalsIgnoreCase(ownedParameter.getName()) : ownedParameterNames.get(j).equals(ownedParameter.getName())))
 					continue ownedReceptionLoop;
-				if (ownedParameterTypes != null && !ownedParameterTypes.get(j)
-					.equals(ownedParameter.getType()))
+				if (ownedParameterTypes != null && !ownedParameterTypes.get(j).equals(ownedParameter.getType()))
 					continue ownedReceptionLoop;
 			}
 			return ownedReception;
 		}
-		return createOnDemand
-			? createOwnedReception(name, ownedParameterNames,
-				ownedParameterTypes)
-			: null;
+		return createOnDemand ? createOwnedReception(name, ownedParameterNames, ownedParameterTypes) : null;
 	}
 
 	/**
@@ -742,11 +644,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Extension> result = (EList<Extension>) cache.get(this,
-				UMLPackage.Literals.CLASS__EXTENSION);
+			EList<Extension> result = (EList<Extension>) cache.get(this, UMLPackage.Literals.CLASS__EXTENSION);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.CLASS__EXTENSION,
-					result = ClassOperations.getExtensions(this));
+				cache.put(this, UMLPackage.Literals.CLASS__EXTENSION, result = ClassOperations.getExtensions(this));
 			}
 			return result;
 		}
@@ -768,10 +668,8 @@
 	 * @generated
 	 */
 	public Extension getExtension(String name, boolean ignoreCase) {
-		extensionLoop : for (Extension extension : getExtensions()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(extension.getName())
-				: name.equals(extension.getName())))
+		extensionLoop: for (Extension extension : getExtensions()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(extension.getName()) : name.equals(extension.getName())))
 				continue extensionLoop;
 			return extension;
 		}
@@ -786,10 +684,7 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Property> getOwnedAttributes() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.CLASS__OWNED_ATTRIBUTE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE, true,
-			true);
+		return (EList<Property>) eDynamicGet(UMLPackage.CLASS__OWNED_ATTRIBUTE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE, true, true);
 	}
 
 	/**
@@ -797,7 +692,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Property createOwnedAttribute(String name, Type type,
 			EClass eClass) {
 		Property newOwnedAttribute = (Property) create(eClass);
@@ -814,7 +708,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Property createOwnedAttribute(String name, Type type) {
 		return createOwnedAttribute(name, type, UMLPackage.Literals.PROPERTY);
 	}
@@ -824,7 +717,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Property getOwnedAttribute(String name, Type type) {
 		return getOwnedAttribute(name, type, false, null, false);
 	}
@@ -834,23 +726,18 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Property getOwnedAttribute(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		ownedAttributeLoop : for (Property ownedAttribute : getOwnedAttributes()) {
+		ownedAttributeLoop: for (Property ownedAttribute : getOwnedAttributes()) {
 			if (eClass != null && !eClass.isInstance(ownedAttribute))
 				continue ownedAttributeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedAttribute.getName())
-				: name.equals(ownedAttribute.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedAttribute.getName()) : name.equals(ownedAttribute.getName())))
 				continue ownedAttributeLoop;
 			if (type != null && !type.equals(ownedAttribute.getType()))
 				continue ownedAttributeLoop;
 			return ownedAttribute;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedAttribute(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedAttribute(name, type, eClass) : null;
 	}
 
 	/**
@@ -869,9 +756,7 @@
 	 */
 	@Override
 	public boolean isAbstract() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.CLASS__IS_ABSTRACT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__IS_ABSTRACT, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.CLASS__IS_ABSTRACT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__IS_ABSTRACT, true, true);
 	}
 
 	/**
@@ -881,8 +766,7 @@
 	 */
 	@Override
 	public void setIsAbstract(boolean newIsAbstract) {
-		eDynamicSet(UMLPackage.CLASS__IS_ABSTRACT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__IS_ABSTRACT, newIsAbstract);
+		eDynamicSet(UMLPackage.CLASS__IS_ABSTRACT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__IS_ABSTRACT, newIsAbstract);
 	}
 
 	/**
@@ -901,8 +785,7 @@
 	 */
 	public boolean validateClassBehavior(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return BehavioredClassifierOperations.validateClassBehavior(this,
-			diagnostics, context);
+		return BehavioredClassifierOperations.validateClassBehavior(this, diagnostics, context);
 	}
 
 	/**
@@ -914,13 +797,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES,
-					result = BehavioredClassifierOperations
-						.getImplementedInterfaces(this));
+				cache.put(this, UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES, result = BehavioredClassifierOperations.getImplementedInterfaces(this));
 			}
 			return result;
 		}
@@ -936,13 +815,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES,
-					result = BehavioredClassifierOperations
-						.getAllImplementedInterfaces(this));
+				cache.put(this, UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES, result = BehavioredClassifierOperations.getAllImplementedInterfaces(this));
 			}
 			return result;
 		}
@@ -967,8 +842,7 @@
 	public Operation createOwnedOperation(String name,
 			EList<String> parameterNames, EList<Type> parameterTypes,
 			Type returnType) {
-		return ClassOperations.createOwnedOperation(this, name, parameterNames,
-			parameterTypes, returnType);
+		return ClassOperations.createOwnedOperation(this, name, parameterNames, parameterTypes, returnType);
 	}
 
 	/**
@@ -990,63 +864,42 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CLASS__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASS__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASS__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASS__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASS__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.CLASS__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.CLASS__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this,
-							EOPPOSITE_FEATURE_BASE
-								- UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.CLASS__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASS__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASS__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASS__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASS__INTERFACE_REALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASS__OWNED_OPERATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASS__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASS__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASS__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASS__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASS__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.CLASS__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.CLASS__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.CLASS__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASS__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASS__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASS__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASS__INTERFACE_REALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASS__OWNED_OPERATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -1060,71 +913,52 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CLASS__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASS__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASS__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.CLASS__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASS__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASS__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.CLASS__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASS__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASS__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASS__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASS__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CLASS__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASS__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASS__OWNED_CONNECTOR :
-				return ((InternalEList<?>) getOwnedConnectors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASS__INTERFACE_REALIZATION :
-				return ((InternalEList<?>) getInterfaceRealizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASS__OWNED_BEHAVIOR :
-				return ((InternalEList<?>) getOwnedBehaviors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASS__OWNED_OPERATION :
-				return ((InternalEList<?>) getOwnedOperations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASS__NESTED_CLASSIFIER :
-				return ((InternalEList<?>) getNestedClassifiers())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASS__OWNED_RECEPTION :
-				return ((InternalEList<?>) getOwnedReceptions())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.CLASS__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.CLASS__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__OWNED_CONNECTOR:
+			return ((InternalEList<?>) getOwnedConnectors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__INTERFACE_REALIZATION:
+			return ((InternalEList<?>) getInterfaceRealizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__OWNED_BEHAVIOR:
+			return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__OWNED_OPERATION:
+			return ((InternalEList<?>) getOwnedOperations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__NESTED_CLASSIFIER:
+			return ((InternalEList<?>) getNestedClassifiers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASS__OWNED_RECEPTION:
+			return ((InternalEList<?>) getOwnedReceptions()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -1137,128 +971,128 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CLASS__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CLASS__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CLASS__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CLASS__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CLASS__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CLASS__NAME :
-				return getName();
-			case UMLPackage.CLASS__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CLASS__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CLASS__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CLASS__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CLASS__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.CLASS__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.CLASS__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.CLASS__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.CLASS__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.CLASS__MEMBER :
-				return getMembers();
-			case UMLPackage.CLASS__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.CLASS__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.CLASS__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.CLASS__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.CLASS__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.CLASS__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.CLASS__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.CLASS__FEATURE :
-				return getFeatures();
-			case UMLPackage.CLASS__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.CLASS__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.CLASS__GENERAL :
-				return getGenerals();
-			case UMLPackage.CLASS__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.CLASS__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.CLASS__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.CLASS__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.CLASS__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.CLASS__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.CLASS__USE_CASE :
-				return getUseCases();
-			case UMLPackage.CLASS__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.CLASS__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.CLASS__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.CLASS__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.CLASS__OWNED_CONNECTOR :
-				return getOwnedConnectors();
-			case UMLPackage.CLASS__PART :
-				return getParts();
-			case UMLPackage.CLASS__ROLE :
-				return getRoles();
-			case UMLPackage.CLASS__OWNED_PORT :
-				return getOwnedPorts();
-			case UMLPackage.CLASS__CLASSIFIER_BEHAVIOR :
-				if (resolve)
-					return getClassifierBehavior();
-				return basicGetClassifierBehavior();
-			case UMLPackage.CLASS__INTERFACE_REALIZATION :
-				return getInterfaceRealizations();
-			case UMLPackage.CLASS__OWNED_BEHAVIOR :
-				return getOwnedBehaviors();
-			case UMLPackage.CLASS__OWNED_OPERATION :
-				return getOwnedOperations();
-			case UMLPackage.CLASS__EXTENSION :
-				return getExtensions();
-			case UMLPackage.CLASS__IS_ACTIVE :
-				return isActive();
-			case UMLPackage.CLASS__NESTED_CLASSIFIER :
-				return getNestedClassifiers();
-			case UMLPackage.CLASS__OWNED_RECEPTION :
-				return getOwnedReceptions();
-			case UMLPackage.CLASS__SUPER_CLASS :
-				return getSuperClasses();
+		case UMLPackage.CLASS__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CLASS__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CLASS__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CLASS__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CLASS__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CLASS__NAME:
+			return getName();
+		case UMLPackage.CLASS__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CLASS__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CLASS__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CLASS__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CLASS__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.CLASS__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.CLASS__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.CLASS__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.CLASS__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.CLASS__MEMBER:
+			return getMembers();
+		case UMLPackage.CLASS__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.CLASS__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.CLASS__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.CLASS__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.CLASS__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.CLASS__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.CLASS__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.CLASS__FEATURE:
+			return getFeatures();
+		case UMLPackage.CLASS__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.CLASS__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.CLASS__GENERAL:
+			return getGenerals();
+		case UMLPackage.CLASS__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.CLASS__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.CLASS__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.CLASS__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.CLASS__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.CLASS__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.CLASS__USE_CASE:
+			return getUseCases();
+		case UMLPackage.CLASS__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.CLASS__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.CLASS__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.CLASS__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.CLASS__OWNED_CONNECTOR:
+			return getOwnedConnectors();
+		case UMLPackage.CLASS__PART:
+			return getParts();
+		case UMLPackage.CLASS__ROLE:
+			return getRoles();
+		case UMLPackage.CLASS__OWNED_PORT:
+			return getOwnedPorts();
+		case UMLPackage.CLASS__CLASSIFIER_BEHAVIOR:
+			if (resolve)
+				return getClassifierBehavior();
+			return basicGetClassifierBehavior();
+		case UMLPackage.CLASS__INTERFACE_REALIZATION:
+			return getInterfaceRealizations();
+		case UMLPackage.CLASS__OWNED_BEHAVIOR:
+			return getOwnedBehaviors();
+		case UMLPackage.CLASS__OWNED_OPERATION:
+			return getOwnedOperations();
+		case UMLPackage.CLASS__EXTENSION:
+			return getExtensions();
+		case UMLPackage.CLASS__IS_ACTIVE:
+			return isActive();
+		case UMLPackage.CLASS__NESTED_CLASSIFIER:
+			return getNestedClassifiers();
+		case UMLPackage.CLASS__OWNED_RECEPTION:
+			return getOwnedReceptions();
+		case UMLPackage.CLASS__SUPER_CLASS:
+			return getSuperClasses();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -1272,154 +1106,133 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CLASS__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CLASS__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CLASS__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CLASS__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CLASS__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CLASS__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CLASS__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.CLASS__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.CLASS__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.CLASS__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.CLASS__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.CLASS__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.CLASS__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.CLASS__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.CLASS__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.CLASS__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.CLASS__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.CLASS__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.CLASS__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.CLASS__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.CLASS__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.CLASS__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.CLASS__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.CLASS__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.CLASS__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.CLASS__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				getOwnedConnectors()
-					.addAll((Collection<? extends Connector>) newValue);
-				return;
-			case UMLPackage.CLASS__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) newValue);
-				return;
-			case UMLPackage.CLASS__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll(
-					(Collection<? extends InterfaceRealization>) newValue);
-				return;
-			case UMLPackage.CLASS__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				getOwnedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.CLASS__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
-			case UMLPackage.CLASS__IS_ACTIVE :
-				setIsActive((Boolean) newValue);
-				return;
-			case UMLPackage.CLASS__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				getNestedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.CLASS__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				getOwnedReceptions()
-					.addAll((Collection<? extends Reception>) newValue);
-				return;
-			case UMLPackage.CLASS__SUPER_CLASS :
-				getSuperClasses().clear();
-				getSuperClasses().addAll(
-					(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
-				return;
+		case UMLPackage.CLASS__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CLASS__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CLASS__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CLASS__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CLASS__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CLASS__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CLASS__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.CLASS__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.CLASS__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.CLASS__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.CLASS__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.CLASS__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.CLASS__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.CLASS__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.CLASS__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.CLASS__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.CLASS__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.CLASS__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.CLASS__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.CLASS__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.CLASS__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.CLASS__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.CLASS__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.CLASS__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.CLASS__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.CLASS__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			getOwnedConnectors().addAll((Collection<? extends Connector>) newValue);
+			return;
+		case UMLPackage.CLASS__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) newValue);
+			return;
+		case UMLPackage.CLASS__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			getInterfaceRealizations().addAll((Collection<? extends InterfaceRealization>) newValue);
+			return;
+		case UMLPackage.CLASS__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			getOwnedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.CLASS__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
+		case UMLPackage.CLASS__IS_ACTIVE:
+			setIsActive((Boolean) newValue);
+			return;
+		case UMLPackage.CLASS__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			getNestedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.CLASS__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			getOwnedReceptions().addAll((Collection<? extends Reception>) newValue);
+			return;
+		case UMLPackage.CLASS__SUPER_CLASS:
+			getSuperClasses().clear();
+			getSuperClasses().addAll((Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -1432,111 +1245,111 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CLASS__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CLASS__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CLASS__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CLASS__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CLASS__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CLASS__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.CLASS__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.CLASS__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.CLASS__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.CLASS__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.CLASS__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.CLASS__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.CLASS__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.CLASS__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.CLASS__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.CLASS__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.CLASS__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.CLASS__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.CLASS__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.CLASS__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.CLASS__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.CLASS__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.CLASS__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.CLASS__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.CLASS__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.CLASS__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				return;
-			case UMLPackage.CLASS__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) null);
-				return;
-			case UMLPackage.CLASS__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				return;
-			case UMLPackage.CLASS__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				return;
-			case UMLPackage.CLASS__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
-			case UMLPackage.CLASS__IS_ACTIVE :
-				setIsActive(IS_ACTIVE_EDEFAULT);
-				return;
-			case UMLPackage.CLASS__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				return;
-			case UMLPackage.CLASS__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				return;
-			case UMLPackage.CLASS__SUPER_CLASS :
-				getSuperClasses().clear();
-				return;
+		case UMLPackage.CLASS__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CLASS__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CLASS__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CLASS__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CLASS__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CLASS__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.CLASS__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.CLASS__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.CLASS__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.CLASS__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.CLASS__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.CLASS__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.CLASS__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.CLASS__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.CLASS__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.CLASS__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.CLASS__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.CLASS__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.CLASS__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.CLASS__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.CLASS__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.CLASS__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.CLASS__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.CLASS__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.CLASS__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.CLASS__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			return;
+		case UMLPackage.CLASS__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) null);
+			return;
+		case UMLPackage.CLASS__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			return;
+		case UMLPackage.CLASS__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			return;
+		case UMLPackage.CLASS__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
+		case UMLPackage.CLASS__IS_ACTIVE:
+			setIsActive(IS_ACTIVE_EDEFAULT);
+			return;
+		case UMLPackage.CLASS__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			return;
+		case UMLPackage.CLASS__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			return;
+		case UMLPackage.CLASS__SUPER_CLASS:
+			getSuperClasses().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1549,112 +1362,110 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CLASS__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CLASS__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CLASS__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CLASS__OWNER :
-				return isSetOwner();
-			case UMLPackage.CLASS__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CLASS__NAME :
-				return isSetName();
-			case UMLPackage.CLASS__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CLASS__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CLASS__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CLASS__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CLASS__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.CLASS__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.CLASS__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.CLASS__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.CLASS__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.CLASS__MEMBER :
-				return isSetMembers();
-			case UMLPackage.CLASS__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.CLASS__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.CLASS__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.CLASS__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.CLASS__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.CLASS__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.CLASS__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.CLASS__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.CLASS__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.CLASS__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.CLASS__GENERAL :
-				return isSetGenerals();
-			case UMLPackage.CLASS__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.CLASS__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.CLASS__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.CLASS__IS_ABSTRACT :
-				return isSetIsAbstract();
-			case UMLPackage.CLASS__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.CLASS__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.CLASS__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.CLASS__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.CLASS__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.CLASS__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.CLASS__OWNED_ATTRIBUTE :
-				return isSetOwnedAttributes();
-			case UMLPackage.CLASS__OWNED_CONNECTOR :
-				return !getOwnedConnectors().isEmpty();
-			case UMLPackage.CLASS__PART :
-				return !getParts().isEmpty();
-			case UMLPackage.CLASS__ROLE :
-				return isSetRoles();
-			case UMLPackage.CLASS__OWNED_PORT :
-				return !getOwnedPorts().isEmpty();
-			case UMLPackage.CLASS__CLASSIFIER_BEHAVIOR :
-				return basicGetClassifierBehavior() != null;
-			case UMLPackage.CLASS__INTERFACE_REALIZATION :
-				return !getInterfaceRealizations().isEmpty();
-			case UMLPackage.CLASS__OWNED_BEHAVIOR :
-				return !getOwnedBehaviors().isEmpty();
-			case UMLPackage.CLASS__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
-			case UMLPackage.CLASS__EXTENSION :
-				return !getExtensions().isEmpty();
-			case UMLPackage.CLASS__IS_ACTIVE :
-				return isActive() != IS_ACTIVE_EDEFAULT;
-			case UMLPackage.CLASS__NESTED_CLASSIFIER :
-				return !getNestedClassifiers().isEmpty();
-			case UMLPackage.CLASS__OWNED_RECEPTION :
-				return !getOwnedReceptions().isEmpty();
-			case UMLPackage.CLASS__SUPER_CLASS :
-				return isSetSuperClasses();
+		case UMLPackage.CLASS__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CLASS__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CLASS__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CLASS__OWNER:
+			return isSetOwner();
+		case UMLPackage.CLASS__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CLASS__NAME:
+			return isSetName();
+		case UMLPackage.CLASS__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CLASS__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CLASS__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CLASS__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CLASS__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.CLASS__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.CLASS__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.CLASS__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.CLASS__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.CLASS__MEMBER:
+			return isSetMembers();
+		case UMLPackage.CLASS__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.CLASS__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.CLASS__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.CLASS__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.CLASS__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.CLASS__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.CLASS__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.CLASS__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.CLASS__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.CLASS__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.CLASS__GENERAL:
+			return isSetGenerals();
+		case UMLPackage.CLASS__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.CLASS__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.CLASS__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.CLASS__IS_ABSTRACT:
+			return isSetIsAbstract();
+		case UMLPackage.CLASS__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.CLASS__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.CLASS__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.CLASS__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.CLASS__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.CLASS__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.CLASS__OWNED_ATTRIBUTE:
+			return isSetOwnedAttributes();
+		case UMLPackage.CLASS__OWNED_CONNECTOR:
+			return !getOwnedConnectors().isEmpty();
+		case UMLPackage.CLASS__PART:
+			return !getParts().isEmpty();
+		case UMLPackage.CLASS__ROLE:
+			return isSetRoles();
+		case UMLPackage.CLASS__OWNED_PORT:
+			return !getOwnedPorts().isEmpty();
+		case UMLPackage.CLASS__CLASSIFIER_BEHAVIOR:
+			return basicGetClassifierBehavior() != null;
+		case UMLPackage.CLASS__INTERFACE_REALIZATION:
+			return !getInterfaceRealizations().isEmpty();
+		case UMLPackage.CLASS__OWNED_BEHAVIOR:
+			return !getOwnedBehaviors().isEmpty();
+		case UMLPackage.CLASS__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
+		case UMLPackage.CLASS__EXTENSION:
+			return !getExtensions().isEmpty();
+		case UMLPackage.CLASS__IS_ACTIVE:
+			return isActive() != IS_ACTIVE_EDEFAULT;
+		case UMLPackage.CLASS__NESTED_CLASSIFIER:
+			return !getNestedClassifiers().isEmpty();
+		case UMLPackage.CLASS__OWNED_RECEPTION:
+			return !getOwnedReceptions().isEmpty();
+		case UMLPackage.CLASS__SUPER_CLASS:
+			return isSetSuperClasses();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1669,14 +1480,14 @@
 			Class<?> baseClass) {
 		if (baseClass == BehavioredClassifier.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.CLASS__CLASSIFIER_BEHAVIOR :
-					return UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR;
-				case UMLPackage.CLASS__INTERFACE_REALIZATION :
-					return UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION;
-				case UMLPackage.CLASS__OWNED_BEHAVIOR :
-					return UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR;
-				default :
-					return -1;
+			case UMLPackage.CLASS__CLASSIFIER_BEHAVIOR:
+				return UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR;
+			case UMLPackage.CLASS__INTERFACE_REALIZATION:
+				return UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION;
+			case UMLPackage.CLASS__OWNED_BEHAVIOR:
+				return UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -1692,14 +1503,14 @@
 			Class<?> baseClass) {
 		if (baseClass == BehavioredClassifier.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR :
-					return UMLPackage.CLASS__CLASSIFIER_BEHAVIOR;
-				case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION :
-					return UMLPackage.CLASS__INTERFACE_REALIZATION;
-				case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR :
-					return UMLPackage.CLASS__OWNED_BEHAVIOR;
-				default :
-					return -1;
+			case UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR:
+				return UMLPackage.CLASS__CLASSIFIER_BEHAVIOR;
+			case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION:
+				return UMLPackage.CLASS__INTERFACE_REALIZATION;
+			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR:
+				return UMLPackage.CLASS__OWNED_BEHAVIOR;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1714,14 +1525,14 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == BehavioredClassifier.class) {
 			switch (baseOperationID) {
-				case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.CLASS___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES :
-					return UMLPackage.CLASS___GET_ALL_IMPLEMENTED_INTERFACES;
-				case UMLPackage.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES :
-					return UMLPackage.CLASS___GET_IMPLEMENTED_INTERFACES;
-				default :
-					return -1;
+			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.CLASS___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES:
+				return UMLPackage.CLASS___GET_ALL_IMPLEMENTED_INTERFACES;
+			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES:
+				return UMLPackage.CLASS___GET_IMPLEMENTED_INTERFACES;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -1737,302 +1548,241 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CLASS___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CLASS___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CLASS___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CLASS___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CLASS___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CLASS___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CLASS___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CLASS___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CLASS___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CLASS___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CLASS___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLASS___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CLASS___GET_MODEL :
-				return getModel();
-			case UMLPackage.CLASS___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CLASS___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CLASS___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CLASS___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CLASS___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CLASS___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CLASS___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CLASS___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CLASS___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CLASS___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CLASS___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CLASS___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLASS___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CLASS___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLASS___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CLASS___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CLASS___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CLASS___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CLASS___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CLASS___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CLASS___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CLASS___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CLASS___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CLASS___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CLASS___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CLASS___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CLASS___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CLASS___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CLASS___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CLASS___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CLASS___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CLASS___SEPARATOR :
-				return separator();
-			case UMLPackage.CLASS___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CLASS___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.CLASS___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.CLASS___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.CLASS___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.CLASS___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.CLASS___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.CLASS___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.CLASS___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.CLASS___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.CLASS___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.CLASS___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.CLASS___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.CLASS___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.CLASS___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.CLASS___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.CLASS___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.CLASS___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.CLASS___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.CLASS___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.CLASS___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.CLASS___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.CLASS___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.CLASS___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.CLASS___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.CLASS___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.CLASS___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.CLASS___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.CLASS___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.CLASS___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.CLASS___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.CLASS___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.CLASS___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.CLASS___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.CLASS___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.CLASS___PARENTS :
-				return parents();
-			case UMLPackage.CLASS___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.CLASS___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.CLASS___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.CLASS___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.CLASS___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.CLASS___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.CLASS___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.CLASS___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.CLASS___GET_PARTS :
-				return getParts();
-			case UMLPackage.CLASS___ALL_ROLES :
-				return allRoles();
-			case UMLPackage.CLASS___GET_OWNED_PORTS :
-				return getOwnedPorts();
-			case UMLPackage.CLASS___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateClassBehavior((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___GET_ALL_IMPLEMENTED_INTERFACES :
-				return getAllImplementedInterfaces();
-			case UMLPackage.CLASS___GET_IMPLEMENTED_INTERFACES :
-				return getImplementedInterfaces();
-			case UMLPackage.CLASS___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP :
-				return validatePassiveClass((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASS___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
-			case UMLPackage.CLASS___IS_METACLASS :
-				return isMetaclass();
-			case UMLPackage.CLASS___GET_EXTENSIONS :
-				return getExtensions();
-			case UMLPackage.CLASS___GET_SUPER_CLASSES :
-				return getSuperClasses();
+		case UMLPackage.CLASS___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CLASS___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CLASS___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CLASS___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CLASS___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CLASS___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CLASS___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CLASS___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CLASS___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CLASS___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CLASS___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLASS___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CLASS___GET_MODEL:
+			return getModel();
+		case UMLPackage.CLASS___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CLASS___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CLASS___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLASS___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CLASS___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CLASS___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CLASS___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLASS___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CLASS___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CLASS___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CLASS___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLASS___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLASS___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CLASS___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLASS___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CLASS___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CLASS___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CLASS___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CLASS___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CLASS___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CLASS___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CLASS___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CLASS___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CLASS___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CLASS___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CLASS___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CLASS___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CLASS___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CLASS___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CLASS___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CLASS___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CLASS___SEPARATOR:
+			return separator();
+		case UMLPackage.CLASS___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CLASS___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.CLASS___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.CLASS___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.CLASS___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.CLASS___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.CLASS___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.CLASS___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.CLASS___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.CLASS___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.CLASS___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.CLASS___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.CLASS___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.CLASS___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.CLASS___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.CLASS___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.CLASS___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.CLASS___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.CLASS___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.CLASS___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.CLASS___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.CLASS___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.CLASS___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.CLASS___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.CLASS___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.CLASS___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.CLASS___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.CLASS___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.CLASS___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.CLASS___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.CLASS___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.CLASS___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.CLASS___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.CLASS___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.CLASS___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.CLASS___PARENTS:
+			return parents();
+		case UMLPackage.CLASS___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.CLASS___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.CLASS___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.CLASS___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.CLASS___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.CLASS___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.CLASS___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.CLASS___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.CLASS___GET_PARTS:
+			return getParts();
+		case UMLPackage.CLASS___ALL_ROLES:
+			return allRoles();
+		case UMLPackage.CLASS___GET_OWNED_PORTS:
+			return getOwnedPorts();
+		case UMLPackage.CLASS___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateClassBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___GET_ALL_IMPLEMENTED_INTERFACES:
+			return getAllImplementedInterfaces();
+		case UMLPackage.CLASS___GET_IMPLEMENTED_INTERFACES:
+			return getImplementedInterfaces();
+		case UMLPackage.CLASS___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP:
+			return validatePassiveClass((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASS___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.CLASS___IS_METACLASS:
+			return isMetaclass();
+		case UMLPackage.CLASS___GET_EXTENSIONS:
+			return getExtensions();
+		case UMLPackage.CLASS___GET_SUPER_CLASSES:
+			return getSuperClasses();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -2044,11 +1794,12 @@
 	 */
 	@Override
 	public boolean isSetOwnedMembers() {
-		return super.isSetOwnedMembers() || isSetOwnedAttributes()
-			|| eIsSet(UMLPackage.CLASS__OWNED_BEHAVIOR)
-			|| eIsSet(UMLPackage.CLASS__OWNED_OPERATION)
-			|| eIsSet(UMLPackage.CLASS__NESTED_CLASSIFIER)
-			|| eIsSet(UMLPackage.CLASS__OWNED_RECEPTION);
+		return super.isSetOwnedMembers()
+				|| isSetOwnedAttributes()
+				|| eIsSet(UMLPackage.CLASS__OWNED_BEHAVIOR)
+				|| eIsSet(UMLPackage.CLASS__OWNED_OPERATION)
+				|| eIsSet(UMLPackage.CLASS__NESTED_CLASSIFIER)
+				|| eIsSet(UMLPackage.CLASS__OWNED_RECEPTION);
 	}
 
 	/**
@@ -2059,14 +1810,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.CLASS__OWNED_COMMENT, UMLPackage.CLASS__NAME_EXPRESSION,
-		UMLPackage.CLASS__ELEMENT_IMPORT, UMLPackage.CLASS__PACKAGE_IMPORT,
-		UMLPackage.CLASS__OWNED_MEMBER, UMLPackage.CLASS__TEMPLATE_BINDING,
-		UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE,
-		UMLPackage.CLASS__COLLABORATION_USE, UMLPackage.CLASS__GENERALIZATION,
-		UMLPackage.CLASS__SUBSTITUTION,
-		UMLPackage.CLASS__INTERFACE_REALIZATION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.CLASS__OWNED_COMMENT, UMLPackage.CLASS__NAME_EXPRESSION, UMLPackage.CLASS__ELEMENT_IMPORT, UMLPackage.CLASS__PACKAGE_IMPORT, UMLPackage.CLASS__OWNED_MEMBER,
+			UMLPackage.CLASS__TEMPLATE_BINDING, UMLPackage.CLASS__OWNED_TEMPLATE_SIGNATURE, UMLPackage.CLASS__COLLABORATION_USE, UMLPackage.CLASS__GENERALIZATION, UMLPackage.CLASS__SUBSTITUTION, UMLPackage.CLASS__INTERFACE_REALIZATION };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedMembers() <em>Owned Member</em>}' reference list.
@@ -2076,11 +1821,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.CLASS__OWNED_RULE, UMLPackage.CLASS__OWNED_USE_CASE,
-		UMLPackage.CLASS__OWNED_ATTRIBUTE, UMLPackage.CLASS__OWNED_CONNECTOR,
-		UMLPackage.CLASS__OWNED_BEHAVIOR, UMLPackage.CLASS__OWNED_OPERATION,
-		UMLPackage.CLASS__NESTED_CLASSIFIER, UMLPackage.CLASS__OWNED_RECEPTION};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.CLASS__OWNED_RULE, UMLPackage.CLASS__OWNED_USE_CASE, UMLPackage.CLASS__OWNED_ATTRIBUTE, UMLPackage.CLASS__OWNED_CONNECTOR, UMLPackage.CLASS__OWNED_BEHAVIOR,
+			UMLPackage.CLASS__OWNED_OPERATION, UMLPackage.CLASS__NESTED_CLASSIFIER, UMLPackage.CLASS__OWNED_RECEPTION };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedBehaviors() <em>Owned Behavior</em>}' containment reference list.
@@ -2090,8 +1832,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_BEHAVIOR_ESUBSETS = new int[]{
-		UMLPackage.CLASS__CLASSIFIER_BEHAVIOR};
+	protected static final int[] OWNED_BEHAVIOR_ESUBSETS = new int[] { UMLPackage.CLASS__CLASSIFIER_BEHAVIOR };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2122,18 +1863,14 @@
 	 */
 	public Behavior getOwnedBehavior(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		ownedBehaviorLoop : for (Behavior ownedBehavior : getOwnedBehaviors()) {
+		ownedBehaviorLoop: for (Behavior ownedBehavior : getOwnedBehaviors()) {
 			if (eClass != null && !eClass.isInstance(ownedBehavior))
 				continue ownedBehaviorLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedBehavior.getName())
-				: name.equals(ownedBehavior.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedBehavior.getName()) : name.equals(ownedBehavior.getName())))
 				continue ownedBehaviorLoop;
 			return ownedBehavior;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedBehavior(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedBehavior(name, eClass) : null;
 	}
 
 	/**
@@ -2143,8 +1880,7 @@
 	 */
 	public InterfaceRealization createInterfaceRealization(String name,
 			Interface contract) {
-		InterfaceRealization newInterfaceRealization = (InterfaceRealization) create(
-			UMLPackage.Literals.INTERFACE_REALIZATION);
+		InterfaceRealization newInterfaceRealization = (InterfaceRealization) create(UMLPackage.Literals.INTERFACE_REALIZATION);
 		getInterfaceRealizations().add(newInterfaceRealization);
 		if (name != null)
 			newInterfaceRealization.setName(name);
@@ -2170,19 +1906,14 @@
 	 */
 	public InterfaceRealization getInterfaceRealization(String name,
 			Interface contract, boolean ignoreCase, boolean createOnDemand) {
-		interfaceRealizationLoop : for (InterfaceRealization interfaceRealization : getInterfaceRealizations()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(interfaceRealization.getName())
-				: name.equals(interfaceRealization.getName())))
+		interfaceRealizationLoop: for (InterfaceRealization interfaceRealization : getInterfaceRealizations()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(interfaceRealization.getName()) : name.equals(interfaceRealization.getName())))
 				continue interfaceRealizationLoop;
-			if (contract != null
-				&& !contract.equals(interfaceRealization.getContract()))
+			if (contract != null && !contract.equals(interfaceRealization.getContract()))
 				continue interfaceRealizationLoop;
 			return interfaceRealization;
 		}
-		return createOnDemand
-			? createInterfaceRealization(name, contract)
-			: null;
+		return createOnDemand ? createInterfaceRealization(name, contract) : null;
 	}
 
 	/**
@@ -2193,7 +1924,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.CLASS__INTERFACE_REALIZATION);
+				|| eIsSet(UMLPackage.CLASS__INTERFACE_REALIZATION);
 	}
 
 	/**
@@ -2204,9 +1935,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] FEATURE_ESUBSETS = new int[]{
-		UMLPackage.CLASS__ATTRIBUTE, UMLPackage.CLASS__OWNED_CONNECTOR,
-		UMLPackage.CLASS__OWNED_OPERATION, UMLPackage.CLASS__OWNED_RECEPTION};
+	protected static final int[] FEATURE_ESUBSETS = new int[] { UMLPackage.CLASS__ATTRIBUTE, UMLPackage.CLASS__OWNED_CONNECTOR, UMLPackage.CLASS__OWNED_OPERATION, UMLPackage.CLASS__OWNED_RECEPTION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2216,8 +1945,8 @@
 	@Override
 	public boolean isSetFeatures() {
 		return super.isSetFeatures()
-			|| eIsSet(UMLPackage.CLASS__OWNED_OPERATION)
-			|| eIsSet(UMLPackage.CLASS__OWNED_RECEPTION);
+				|| eIsSet(UMLPackage.CLASS__OWNED_OPERATION)
+				|| eIsSet(UMLPackage.CLASS__OWNED_RECEPTION);
 	}
 
 	/**
@@ -2228,8 +1957,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] ATTRIBUTE_ESUBSETS = new int[]{
-		UMLPackage.CLASS__OWNED_ATTRIBUTE};
+	protected static final int[] ATTRIBUTE_ESUBSETS = new int[] { UMLPackage.CLASS__OWNED_ATTRIBUTE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2238,7 +1966,8 @@
 	 */
 	@Override
 	public boolean isSetAttributes() {
-		return super.isSetAttributes() || isSetOwnedAttributes();
+		return super.isSetAttributes()
+				|| isSetOwnedAttributes();
 	}
 
 	/**
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClassifierImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClassifierImpl.java
index 821f931..d4e6ffe 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClassifierImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClassifierImpl.java
@@ -1,39 +1,52 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 212765, 418466, 454400, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
+
 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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedEObjectEList;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectContainmentEList;
+
 import org.eclipse.uml2.uml.AggregationKind;
 import org.eclipse.uml2.uml.Association;
 import org.eclipse.uml2.uml.Classifier;
@@ -69,6 +82,7 @@
 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.ClassifierOperations;
 import org.eclipse.uml2.uml.internal.operations.PackageableElementOperations;
 import org.eclipse.uml2.uml.internal.operations.ParameterableElementOperations;
@@ -169,17 +183,9 @@
 		return UMLPackage.Literals.CLASSIFIER;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.CLASSIFIER__COLLABORATION_USE) {
 			return createCollaborationUsesList();
 		}
@@ -197,23 +203,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			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>(
-						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>(
-			RedefinableElement.class, this,
-			UMLPackage.CLASSIFIER__REDEFINED_ELEMENT,
-			REDEFINED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<RedefinableElement>(RedefinableElement.class, this, UMLPackage.CLASSIFIER__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -226,28 +223,21 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			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<Classifier>(
-						Classifier.class, this,
-						UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT, null));
+				cache.put(eResource, this, UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT, redefinitionContexts = new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT, null));
 			}
 			return redefinitionContexts;
 		}
-		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
-			UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT, null);
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT, null);
 	}
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getRedefinitionContexts() <em>Redefinition Context</em>}' reference list.
 	 * @see #getRedefinitionContexts()
 	 */
-	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[]{
-		UMLPackage.CLASSIFIER__NAMESPACE};
+	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[] {
+			UMLPackage.CLASSIFIER__NAMESPACE };
 
 	public EList<Classifier> getRedefinitionContexts() {
 		CacheAdapter cache = getCacheAdapter();
@@ -255,21 +245,21 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+					.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<Classifier>(
-						Classifier.class, this,
-						UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT,
-						REDEFINITION_CONTEXT_ESUBSETS));
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
+						redefinitionContexts = new DerivedEObjectEList<Classifier>(
+								Classifier.class, this,
+								UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT,
+								REDEFINITION_CONTEXT_ESUBSETS));
 			}
 			return redefinitionContexts;
 		}
 		return new DerivedEObjectEList<Classifier>(Classifier.class, this,
-			UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT,
-			REDEFINITION_CONTEXT_ESUBSETS);
+				UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT,
+				REDEFINITION_CONTEXT_ESUBSETS);
 	}
 
 	/**
@@ -288,12 +278,10 @@
 	 */
 	public Classifier getRedefinitionContext(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinitionContextLoop : for (Classifier redefinitionContext : getRedefinitionContexts()) {
+		redefinitionContextLoop: for (Classifier redefinitionContext : getRedefinitionContexts()) {
 			if (eClass != null && !eClass.isInstance(redefinitionContext))
 				continue redefinitionContextLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinitionContext.getName())
-				: name.equals(redefinitionContext.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinitionContext.getName()) : name.equals(redefinitionContext.getName())))
 				continue redefinitionContextLoop;
 			return redefinitionContext;
 		}
@@ -306,9 +294,7 @@
 	 * @generated
 	 */
 	public boolean isLeaf() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.CLASSIFIER__IS_LEAF - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.CLASSIFIER__IS_LEAF - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, true, true);
 	}
 
 	/**
@@ -317,8 +303,7 @@
 	 * @generated
 	 */
 	public void setIsLeaf(boolean newIsLeaf) {
-		eDynamicSet(UMLPackage.CLASSIFIER__IS_LEAF - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, newIsLeaf);
+		eDynamicSet(UMLPackage.CLASSIFIER__IS_LEAF - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, newIsLeaf);
 	}
 
 	/**
@@ -329,9 +314,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -340,10 +323,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true,
-			true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -352,10 +332,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -365,13 +342,10 @@
 	 */
 	public NotificationChain basicSetTemplateParameterGen(
 			TemplateParameter newTemplateParameter, NotificationChain msgs) {
-		if (newTemplateParameter != null
-			&& !(newTemplateParameter instanceof ClassifierTemplateParameter)) {
-			throw new IllegalArgumentException(
-				"newTemplateParameter must be an instance of ClassifierTemplateParameter"); //$NON-NLS-1$
+		if (newTemplateParameter != null && !(newTemplateParameter instanceof ClassifierTemplateParameter)) {
+			throw new IllegalArgumentException("newTemplateParameter must be an instance of ClassifierTemplateParameter"); //$NON-NLS-1$
 		}
-		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter,
-			UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter, UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER, msgs);
 		return msgs;
 	}
 
@@ -385,7 +359,7 @@
 			TemplateParameter owningTemplateParameter = basicGetOwningTemplateParameter();
 
 			if (owningTemplateParameter != null
-				&& owningTemplateParameter != newTemplateParameter) {
+					&& owningTemplateParameter != newTemplateParameter) {
 
 				setOwningTemplateParameter(null);
 			}
@@ -400,15 +374,10 @@
 	 * @generated
 	 */
 	public void setTemplateParameter(TemplateParameter newTemplateParameter) {
-		if (newTemplateParameter != null
-			&& !(newTemplateParameter instanceof ClassifierTemplateParameter)) {
-			throw new IllegalArgumentException(
-				"newTemplateParameter must be an instance of ClassifierTemplateParameter"); //$NON-NLS-1$
+		if (newTemplateParameter != null && !(newTemplateParameter instanceof ClassifierTemplateParameter)) {
+			throw new IllegalArgumentException("newTemplateParameter must be an instance of ClassifierTemplateParameter"); //$NON-NLS-1$
 		}
-		eDynamicSet(
-			UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			newTemplateParameter);
+		eDynamicSet(UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, newTemplateParameter);
 	}
 
 	/**
@@ -426,11 +395,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			true, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -439,11 +404,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -454,8 +415,7 @@
 	public NotificationChain basicSetOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter,
-			UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter, UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -474,11 +434,7 @@
 	 */
 	public void setOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter) {
-		eDynamicSet(
-			UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			newOwningTemplateParameter);
+		eDynamicSet(UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, newOwningTemplateParameter);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -496,9 +452,7 @@
 	 */
 	@Override
 	public VisibilityKind getVisibility() {
-		return (VisibilityKind) eDynamicGet(
-			UMLPackage.CLASSIFIER__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, true, true);
+		return (VisibilityKind) eDynamicGet(UMLPackage.CLASSIFIER__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, true, true);
 	}
 
 	/**
@@ -508,8 +462,7 @@
 	 */
 	@Override
 	public void setVisibility(VisibilityKind newVisibility) {
-		eDynamicSet(UMLPackage.CLASSIFIER__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, newVisibility);
+		eDynamicSet(UMLPackage.CLASSIFIER__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, newVisibility);
 	}
 
 	/**
@@ -519,8 +472,7 @@
 	 */
 	@Override
 	public void unsetVisibility() {
-		eDynamicUnset(UMLPackage.CLASSIFIER__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
+		eDynamicUnset(UMLPackage.CLASSIFIER__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
 	}
 
 	/**
@@ -530,9 +482,7 @@
 	 */
 	@Override
 	public boolean isSetVisibility() {
-		return eDynamicIsSet(
-			UMLPackage.CLASSIFIER__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
+		return eDynamicIsSet(UMLPackage.CLASSIFIER__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
 	}
 
 	/**
@@ -543,9 +493,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -569,10 +517,7 @@
 	 */
 	public org.eclipse.uml2.uml.Package getPackage() {
 		org.eclipse.uml2.uml.Package package_ = basicGetPackage();
-		return package_ != null && package_.eIsProxy()
-			? (org.eclipse.uml2.uml.Package) eResolveProxy(
-				(InternalEObject) package_)
-			: package_;
+		return package_ != null && package_.eIsProxy() ? (org.eclipse.uml2.uml.Package) eResolveProxy((InternalEObject) package_) : package_;
 	}
 
 	/**
@@ -583,8 +528,8 @@
 	public org.eclipse.uml2.uml.Package basicGetPackage() {
 		InternalEObject eInternalContainer = eInternalContainer();
 		return eInternalContainer instanceof org.eclipse.uml2.uml.Package
-			? (org.eclipse.uml2.uml.Package) eInternalContainer
-			: null;
+				? (org.eclipse.uml2.uml.Package) eInternalContainer
+				: null;
 	}
 
 	/**
@@ -596,22 +541,22 @@
 		if (newPackage != eInternalContainer()) {
 			if (EcoreUtil.isAncestor(this, newPackage))
 				throw new IllegalArgumentException(
-					"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
+						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
 			NotificationChain msgs = null;
 			if (eInternalContainer() != null)
 				msgs = eBasicRemoveFromContainer(msgs);
 			if (newPackage != null)
 				msgs = ((InternalEList<Type>) newPackage.getOwnedTypes())
-					.basicAdd(this, msgs);
+						.basicAdd(this, msgs);
 			msgs = eBasicSetContainer((InternalEObject) newPackage,
-				InternalEObject.EOPPOSITE_FEATURE_BASE
-					- UMLPackage.PACKAGE__PACKAGED_ELEMENT,
-				msgs);
+					InternalEObject.EOPPOSITE_FEATURE_BASE
+							- UMLPackage.PACKAGE__PACKAGED_ELEMENT,
+					msgs);
 			if (msgs != null)
 				msgs.dispatch();
 		} else if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET,
-				UMLPackage.CLASSIFIER__PACKAGE, newPackage, newPackage));
+					UMLPackage.CLASSIFIER__PACKAGE, newPackage, newPackage));
 	}
 
 	/**
@@ -625,20 +570,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.CLASSIFIER__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.CLASSIFIER__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.CLASSIFIER__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.CLASSIFIER__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -648,10 +586,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<TemplateBinding> getTemplateBindings() {
-		return (EList<TemplateBinding>) eDynamicGet(
-			UMLPackage.CLASSIFIER__TEMPLATE_BINDING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING, true,
-			true);
+		return (EList<TemplateBinding>) eDynamicGet(UMLPackage.CLASSIFIER__TEMPLATE_BINDING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING, true, true);
 	}
 
 	/**
@@ -660,8 +595,7 @@
 	 * @generated
 	 */
 	public TemplateBinding createTemplateBinding(TemplateSignature signature) {
-		TemplateBinding newTemplateBinding = (TemplateBinding) create(
-			UMLPackage.Literals.TEMPLATE_BINDING);
+		TemplateBinding newTemplateBinding = (TemplateBinding) create(UMLPackage.Literals.TEMPLATE_BINDING);
 		getTemplateBindings().add(newTemplateBinding);
 		if (signature != null)
 			newTemplateBinding.setSignature(signature);
@@ -684,15 +618,12 @@
 	 */
 	public TemplateBinding getTemplateBinding(TemplateSignature signature,
 			boolean createOnDemand) {
-		templateBindingLoop : for (TemplateBinding templateBinding : getTemplateBindings()) {
-			if (signature != null
-				&& !signature.equals(templateBinding.getSignature()))
+		templateBindingLoop: for (TemplateBinding templateBinding : getTemplateBindings()) {
+			if (signature != null && !signature.equals(templateBinding.getSignature()))
 				continue templateBindingLoop;
 			return templateBinding;
 		}
-		return createOnDemand
-			? createTemplateBinding(signature)
-			: null;
+		return createOnDemand ? createTemplateBinding(signature) : null;
 	}
 
 	/**
@@ -701,11 +632,7 @@
 	 * @generated
 	 */
 	public TemplateSignature getOwnedTemplateSignature() {
-		return (TemplateSignature) eDynamicGet(
-			UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-			true, true);
+		return (TemplateSignature) eDynamicGet(UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, true, true);
 	}
 
 	/**
@@ -714,11 +641,7 @@
 	 * @generated
 	 */
 	public TemplateSignature basicGetOwnedTemplateSignature() {
-		return (TemplateSignature) eDynamicGet(
-			UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-			false, true);
+		return (TemplateSignature) eDynamicGet(UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, false, true);
 	}
 
 	/**
@@ -729,13 +652,10 @@
 	public NotificationChain basicSetOwnedTemplateSignature(
 			TemplateSignature newOwnedTemplateSignature,
 			NotificationChain msgs) {
-		if (newOwnedTemplateSignature != null
-			&& !(newOwnedTemplateSignature instanceof RedefinableTemplateSignature)) {
-			throw new IllegalArgumentException(
-				"newOwnedTemplateSignature must be an instance of RedefinableTemplateSignature"); //$NON-NLS-1$
+		if (newOwnedTemplateSignature != null && !(newOwnedTemplateSignature instanceof RedefinableTemplateSignature)) {
+			throw new IllegalArgumentException("newOwnedTemplateSignature must be an instance of RedefinableTemplateSignature"); //$NON-NLS-1$
 		}
-		msgs = eDynamicInverseAdd((InternalEObject) newOwnedTemplateSignature,
-			UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newOwnedTemplateSignature, UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE, msgs);
 		return msgs;
 	}
 
@@ -746,16 +666,10 @@
 	 */
 	public void setOwnedTemplateSignature(
 			TemplateSignature newOwnedTemplateSignature) {
-		if (newOwnedTemplateSignature != null
-			&& !(newOwnedTemplateSignature instanceof RedefinableTemplateSignature)) {
-			throw new IllegalArgumentException(
-				"newOwnedTemplateSignature must be an instance of RedefinableTemplateSignature"); //$NON-NLS-1$
+		if (newOwnedTemplateSignature != null && !(newOwnedTemplateSignature instanceof RedefinableTemplateSignature)) {
+			throw new IllegalArgumentException("newOwnedTemplateSignature must be an instance of RedefinableTemplateSignature"); //$NON-NLS-1$
 		}
-		eDynamicSet(
-			UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-			newOwnedTemplateSignature);
+		eDynamicSet(UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, newOwnedTemplateSignature);
 	}
 
 	/**
@@ -764,8 +678,7 @@
 	 * @generated
 	 */
 	public TemplateSignature createOwnedTemplateSignature(EClass eClass) {
-		TemplateSignature newOwnedTemplateSignature = (TemplateSignature) create(
-			eClass);
+		TemplateSignature newOwnedTemplateSignature = (TemplateSignature) create(eClass);
 		setOwnedTemplateSignature(newOwnedTemplateSignature);
 		return newOwnedTemplateSignature;
 	}
@@ -777,7 +690,7 @@
 	 */
 	public TemplateSignature createOwnedTemplateSignature() {
 		TemplateSignature newOwnedTemplateSignature = UMLFactory.eINSTANCE
-			.createRedefinableTemplateSignature();
+				.createRedefinableTemplateSignature();
 		setOwnedTemplateSignature(newOwnedTemplateSignature);
 		return newOwnedTemplateSignature;
 	}
@@ -801,19 +714,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Feature> features = (EList<Feature>) cache.get(eResource,
-				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
+			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>(
-						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>(Feature.class, this,
-			UMLPackage.CLASSIFIER__FEATURE, FEATURE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this, UMLPackage.CLASSIFIER__FEATURE, FEATURE_ESUBSETS);
 	}
 
 	/**
@@ -827,19 +734,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> members = (EList<NamedElement>) cache
-				.get(eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER);
+			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>(
-						NamedElement.class, this, UMLPackage.CLASSIFIER__MEMBER,
-						MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER, members = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.CLASSIFIER__MEMBER, MEMBER_ESUBSETS));
 			}
 			return members;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.CLASSIFIER__MEMBER, MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.CLASSIFIER__MEMBER, MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -853,20 +754,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.CLASSIFIER__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.CLASSIFIER__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.CLASSIFIER__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.CLASSIFIER__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -879,19 +773,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Property> attributes = (EList<Property>) cache.get(eResource,
-				this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
+			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>(
-						Property.class, this, UMLPackage.CLASSIFIER__ATTRIBUTE,
-						null));
+				cache.put(eResource, this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE, attributes = new DerivedUnionEObjectEList<Property>(Property.class, this, UMLPackage.CLASSIFIER__ATTRIBUTE, null));
 			}
 			return attributes;
 		}
-		return new DerivedUnionEObjectEList<Property>(Property.class, this,
-			UMLPackage.CLASSIFIER__ATTRIBUTE, null);
+		return new DerivedUnionEObjectEList<Property>(Property.class, this, UMLPackage.CLASSIFIER__ATTRIBUTE, null);
 	}
 
 	/**
@@ -910,12 +798,10 @@
 	 */
 	public Property getAttribute(String name, Type type, boolean ignoreCase,
 			EClass eClass) {
-		attributeLoop : for (Property attribute : getAttributes()) {
+		attributeLoop: for (Property attribute : getAttributes()) {
 			if (eClass != null && !eClass.isInstance(attribute))
 				continue attributeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(attribute.getName())
-				: name.equals(attribute.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(attribute.getName()) : name.equals(attribute.getName())))
 				continue attributeLoop;
 			if (type != null && !type.equals(attribute.getType()))
 				continue attributeLoop;
@@ -931,16 +817,14 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<CollaborationUse> getCollaborationUses() {
-		return (EList<CollaborationUse>) eDynamicGet(
-			UMLPackage.CLASSIFIER__COLLABORATION_USE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__COLLABORATION_USE, true, true);
+		return (EList<CollaborationUse>) eDynamicGet(UMLPackage.CLASSIFIER__COLLABORATION_USE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__COLLABORATION_USE, true, true);
 	}
 
 	private EList<CollaborationUse> createCollaborationUsesList() {
 		return new SubsetSupersetEObjectContainmentEList.Resolving<CollaborationUse>(
-			CollaborationUse.class, this,
-			UMLPackage.CLASSIFIER__COLLABORATION_USE, null,
-			COLLABORATION_USE_ESUBSETS);
+				CollaborationUse.class, this,
+				UMLPackage.CLASSIFIER__COLLABORATION_USE, null,
+				COLLABORATION_USE_ESUBSETS);
 	}
 
 	/**
@@ -949,9 +833,7 @@
 	 * @generated
 	 */
 	public boolean isAbstract() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.CLASSIFIER__IS_ABSTRACT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__IS_ABSTRACT, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.CLASSIFIER__IS_ABSTRACT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__IS_ABSTRACT, true, true);
 	}
 
 	/**
@@ -960,8 +842,7 @@
 	 * @generated
 	 */
 	public void setIsAbstract(boolean newIsAbstract) {
-		eDynamicSet(UMLPackage.CLASSIFIER__IS_ABSTRACT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__IS_ABSTRACT, newIsAbstract);
+		eDynamicSet(UMLPackage.CLASSIFIER__IS_ABSTRACT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__IS_ABSTRACT, newIsAbstract);
 	}
 
 	/**
@@ -970,11 +851,7 @@
 	 * @generated
 	 */
 	public boolean isFinalSpecialization() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.CLASSIFIER__IS_FINAL_SPECIALIZATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__IS_FINAL_SPECIALIZATION, true,
-			true);
+		return (Boolean) eDynamicGet(UMLPackage.CLASSIFIER__IS_FINAL_SPECIALIZATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__IS_FINAL_SPECIALIZATION, true, true);
 	}
 
 	/**
@@ -983,11 +860,7 @@
 	 * @generated
 	 */
 	public void setIsFinalSpecialization(boolean newIsFinalSpecialization) {
-		eDynamicSet(
-			UMLPackage.CLASSIFIER__IS_FINAL_SPECIALIZATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__IS_FINAL_SPECIALIZATION,
-			newIsFinalSpecialization);
+		eDynamicSet(UMLPackage.CLASSIFIER__IS_FINAL_SPECIALIZATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__IS_FINAL_SPECIALIZATION, newIsFinalSpecialization);
 	}
 
 	/**
@@ -997,9 +870,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Generalization> getGeneralizations() {
-		return (EList<Generalization>) eDynamicGet(
-			UMLPackage.CLASSIFIER__GENERALIZATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__GENERALIZATION, true, true);
+		return (EList<Generalization>) eDynamicGet(UMLPackage.CLASSIFIER__GENERALIZATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__GENERALIZATION, true, true);
 	}
 
 	/**
@@ -1009,9 +880,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<GeneralizationSet> getPowertypeExtents() {
-		return (EList<GeneralizationSet>) eDynamicGet(
-			UMLPackage.CLASSIFIER__POWERTYPE_EXTENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__POWERTYPE_EXTENT, true, true);
+		return (EList<GeneralizationSet>) eDynamicGet(UMLPackage.CLASSIFIER__POWERTYPE_EXTENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__POWERTYPE_EXTENT, true, true);
 	}
 
 	/**
@@ -1030,10 +899,8 @@
 	 */
 	public GeneralizationSet getPowertypeExtent(String name,
 			boolean ignoreCase) {
-		powertypeExtentLoop : for (GeneralizationSet powertypeExtent : getPowertypeExtents()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(powertypeExtent.getName())
-				: name.equals(powertypeExtent.getName())))
+		powertypeExtentLoop: for (GeneralizationSet powertypeExtent : getPowertypeExtents()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(powertypeExtent.getName()) : name.equals(powertypeExtent.getName())))
 				continue powertypeExtentLoop;
 			return powertypeExtent;
 		}
@@ -1049,12 +916,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> result = (EList<NamedElement>) cache.get(this,
-				UMLPackage.Literals.CLASSIFIER__INHERITED_MEMBER);
+			EList<NamedElement> result = (EList<NamedElement>) cache.get(this, UMLPackage.Literals.CLASSIFIER__INHERITED_MEMBER);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CLASSIFIER__INHERITED_MEMBER,
-					result = ClassifierOperations.getInheritedMembers(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER__INHERITED_MEMBER, result = ClassifierOperations.getInheritedMembers(this));
 			}
 			return result;
 		}
@@ -1077,12 +941,10 @@
 	 */
 	public NamedElement getInheritedMember(String name, boolean ignoreCase,
 			EClass eClass) {
-		inheritedMemberLoop : for (NamedElement inheritedMember : getInheritedMembers()) {
+		inheritedMemberLoop: for (NamedElement inheritedMember : getInheritedMembers()) {
 			if (eClass != null && !eClass.isInstance(inheritedMember))
 				continue inheritedMemberLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(inheritedMember.getName())
-				: name.equals(inheritedMember.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(inheritedMember.getName()) : name.equals(inheritedMember.getName())))
 				continue inheritedMemberLoop;
 			return inheritedMember;
 		}
@@ -1096,9 +958,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Classifier> getRedefinedClassifiers() {
-		return (EList<Classifier>) eDynamicGet(
-			UMLPackage.CLASSIFIER__REDEFINED_CLASSIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__REDEFINED_CLASSIFIER, true, true);
+		return (EList<Classifier>) eDynamicGet(UMLPackage.CLASSIFIER__REDEFINED_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__REDEFINED_CLASSIFIER, true, true);
 	}
 
 	/**
@@ -1117,12 +977,10 @@
 	 */
 	public Classifier getRedefinedClassifier(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinedClassifierLoop : for (Classifier redefinedClassifier : getRedefinedClassifiers()) {
+		redefinedClassifierLoop: for (Classifier redefinedClassifier : getRedefinedClassifiers()) {
 			if (eClass != null && !eClass.isInstance(redefinedClassifier))
 				continue redefinedClassifierLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinedClassifier.getName())
-				: name.equals(redefinedClassifier.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinedClassifier.getName()) : name.equals(redefinedClassifier.getName())))
 				continue redefinedClassifierLoop;
 			return redefinedClassifier;
 		}
@@ -1138,11 +996,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Classifier> result = (EList<Classifier>) cache.get(this,
-				UMLPackage.Literals.CLASSIFIER__GENERAL);
+			EList<Classifier> result = (EList<Classifier>) cache.get(this, UMLPackage.Literals.CLASSIFIER__GENERAL);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.CLASSIFIER__GENERAL,
-					result = ClassifierOperations.getGenerals(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER__GENERAL, result = ClassifierOperations.getGenerals(this));
 			}
 			return result;
 		}
@@ -1165,12 +1021,10 @@
 	 */
 	public Classifier getGeneral(String name, boolean ignoreCase,
 			EClass eClass) {
-		generalLoop : for (Classifier general : getGenerals()) {
+		generalLoop: for (Classifier general : getGenerals()) {
 			if (eClass != null && !eClass.isInstance(general))
 				continue generalLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(general.getName())
-				: name.equals(general.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(general.getName()) : name.equals(general.getName())))
 				continue generalLoop;
 			return general;
 		}
@@ -1184,9 +1038,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<UseCase> getOwnedUseCases() {
-		return (EList<UseCase>) eDynamicGet(
-			UMLPackage.CLASSIFIER__OWNED_USE_CASE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__OWNED_USE_CASE, true, true);
+		return (EList<UseCase>) eDynamicGet(UMLPackage.CLASSIFIER__OWNED_USE_CASE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__OWNED_USE_CASE, true, true);
 	}
 
 	/**
@@ -1195,8 +1047,7 @@
 	 * @generated
 	 */
 	public UseCase createOwnedUseCase(String name) {
-		UseCase newOwnedUseCase = (UseCase) create(
-			UMLPackage.Literals.USE_CASE);
+		UseCase newOwnedUseCase = (UseCase) create(UMLPackage.Literals.USE_CASE);
 		getOwnedUseCases().add(newOwnedUseCase);
 		if (name != null)
 			newOwnedUseCase.setName(name);
@@ -1219,16 +1070,12 @@
 	 */
 	public UseCase getOwnedUseCase(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedUseCaseLoop : for (UseCase ownedUseCase : getOwnedUseCases()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedUseCase.getName())
-				: name.equals(ownedUseCase.getName())))
+		ownedUseCaseLoop: for (UseCase ownedUseCase : getOwnedUseCases()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedUseCase.getName()) : name.equals(ownedUseCase.getName())))
 				continue ownedUseCaseLoop;
 			return ownedUseCase;
 		}
-		return createOnDemand
-			? createOwnedUseCase(name)
-			: null;
+		return createOnDemand ? createOwnedUseCase(name) : null;
 	}
 
 	/**
@@ -1238,9 +1085,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<UseCase> getUseCases() {
-		return (EList<UseCase>) eDynamicGet(
-			UMLPackage.CLASSIFIER__USE_CASE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__USE_CASE, true, true);
+		return (EList<UseCase>) eDynamicGet(UMLPackage.CLASSIFIER__USE_CASE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__USE_CASE, true, true);
 	}
 
 	/**
@@ -1258,10 +1103,8 @@
 	 * @generated
 	 */
 	public UseCase getUseCase(String name, boolean ignoreCase) {
-		useCaseLoop : for (UseCase useCase : getUseCases()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(useCase.getName())
-				: name.equals(useCase.getName())))
+		useCaseLoop: for (UseCase useCase : getUseCases()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(useCase.getName()) : name.equals(useCase.getName())))
 				continue useCaseLoop;
 			return useCase;
 		}
@@ -1275,9 +1118,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Substitution> getSubstitutions() {
-		return (EList<Substitution>) eDynamicGet(
-			UMLPackage.CLASSIFIER__SUBSTITUTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__SUBSTITUTION, true, true);
+		return (EList<Substitution>) eDynamicGet(UMLPackage.CLASSIFIER__SUBSTITUTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__SUBSTITUTION, true, true);
 	}
 
 	/**
@@ -1286,9 +1127,7 @@
 	 * @generated
 	 */
 	public CollaborationUse getRepresentation() {
-		return (CollaborationUse) eDynamicGet(
-			UMLPackage.CLASSIFIER__REPRESENTATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__REPRESENTATION, true, true);
+		return (CollaborationUse) eDynamicGet(UMLPackage.CLASSIFIER__REPRESENTATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__REPRESENTATION, true, true);
 	}
 
 	/**
@@ -1297,9 +1136,7 @@
 	 * @generated
 	 */
 	public CollaborationUse basicGetRepresentation() {
-		return (CollaborationUse) eDynamicGet(
-			UMLPackage.CLASSIFIER__REPRESENTATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__REPRESENTATION, false, true);
+		return (CollaborationUse) eDynamicGet(UMLPackage.CLASSIFIER__REPRESENTATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__REPRESENTATION, false, true);
 	}
 
 	/**
@@ -1308,9 +1145,7 @@
 	 * @generated
 	 */
 	public void setRepresentation(CollaborationUse newRepresentation) {
-		eDynamicSet(
-			UMLPackage.CLASSIFIER__REPRESENTATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__REPRESENTATION, newRepresentation);
+		eDynamicSet(UMLPackage.CLASSIFIER__REPRESENTATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__REPRESENTATION, newRepresentation);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newRepresentation != null) {
@@ -1328,8 +1163,7 @@
 	 * @generated
 	 */
 	public CollaborationUse createRepresentation(String name) {
-		CollaborationUse newRepresentation = (CollaborationUse) create(
-			UMLPackage.Literals.COLLABORATION_USE);
+		CollaborationUse newRepresentation = (CollaborationUse) create(UMLPackage.Literals.COLLABORATION_USE);
 		setRepresentation(newRepresentation);
 		if (name != null)
 			newRepresentation.setName(name);
@@ -1343,8 +1177,7 @@
 	 */
 	public boolean validateRedefinitionContextValid(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations
-			.validateRedefinitionContextValid(this, diagnostics, context);
+		return RedefinableElementOperations.validateRedefinitionContextValid(this, diagnostics, context);
 	}
 
 	/**
@@ -1354,8 +1187,7 @@
 	 */
 	public boolean validateRedefinitionConsistent(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations.validateRedefinitionConsistent(this,
-			diagnostics, context);
+		return RedefinableElementOperations.validateRedefinitionConsistent(this, diagnostics, context);
 	}
 
 	/**
@@ -1365,8 +1197,7 @@
 	 */
 	public boolean validateNonLeafRedefinition(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations.validateNonLeafRedefinition(this,
-			diagnostics, context);
+		return RedefinableElementOperations.validateNonLeafRedefinition(this, diagnostics, context);
 	}
 
 	/**
@@ -1376,8 +1207,7 @@
 	 */
 	public boolean isRedefinitionContextValid(
 			RedefinableElement redefinedElement) {
-		return RedefinableElementOperations.isRedefinitionContextValid(this,
-			redefinedElement);
+		return RedefinableElementOperations.isRedefinitionContextValid(this, redefinedElement);
 	}
 
 	/**
@@ -1386,8 +1216,7 @@
 	 * @generated
 	 */
 	public boolean isConsistentWith(RedefinableElement redefiningElement) {
-		return RedefinableElementOperations.isConsistentWith(this,
-			redefiningElement);
+		return RedefinableElementOperations.isConsistentWith(this, redefiningElement);
 	}
 
 	/**
@@ -1415,8 +1244,7 @@
 	 */
 	public boolean validateNamespaceNeedsVisibility(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PackageableElementOperations
-			.validateNamespaceNeedsVisibility(this, diagnostics, context);
+		return PackageableElementOperations.validateNamespaceNeedsVisibility(this, diagnostics, context);
 	}
 
 	/**
@@ -1429,9 +1257,7 @@
 			int end1Upper, Type end1Type, boolean end2IsNavigable,
 			AggregationKind end2Aggregation, String end2Name, int end2Lower,
 			int end2Upper) {
-		return TypeOperations.createAssociation(this, end1IsNavigable,
-			end1Aggregation, end1Name, end1Lower, end1Upper, end1Type,
-			end2IsNavigable, end2Aggregation, end2Name, end2Lower, end2Upper);
+		return TypeOperations.createAssociation(this, end1IsNavigable, end1Aggregation, end1Name, end1Lower, end1Upper, end1Type, end2IsNavigable, end2Aggregation, end2Name, end2Lower, end2Upper);
 	}
 
 	/**
@@ -1443,11 +1269,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Association> result = (EList<Association>) cache.get(this,
-				UMLPackage.Literals.TYPE___GET_ASSOCIATIONS);
+			EList<Association> result = (EList<Association>) cache.get(this, UMLPackage.Literals.TYPE___GET_ASSOCIATIONS);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.TYPE___GET_ASSOCIATIONS,
-					result = TypeOperations.getAssociations(this));
+				cache.put(this, UMLPackage.Literals.TYPE___GET_ASSOCIATIONS, result = TypeOperations.getAssociations(this));
 			}
 			return result;
 		}
@@ -1463,14 +1287,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<ParameterableElement> result = (EList<ParameterableElement>) cache
-				.get(this,
-					UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS);
+			EList<ParameterableElement> result = (EList<ParameterableElement>) cache.get(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS,
-					result = TemplateableElementOperations
-						.parameterableElements(this));
+				cache.put(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS, result = TemplateableElementOperations.parameterableElements(this));
 			}
 			return result;
 		}
@@ -1493,8 +1312,7 @@
 	 */
 	public boolean validateNoCyclesInGeneralization(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ClassifierOperations.validateNoCyclesInGeneralization(this,
-			diagnostics, context);
+		return ClassifierOperations.validateNoCyclesInGeneralization(this, diagnostics, context);
 	}
 
 	/**
@@ -1504,8 +1322,7 @@
 	 */
 	public boolean validateSpecializeType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ClassifierOperations.validateSpecializeType(this, diagnostics,
-			context);
+		return ClassifierOperations.validateSpecializeType(this, diagnostics, context);
 	}
 
 	/**
@@ -1515,8 +1332,7 @@
 	 */
 	public boolean validateMapsToGeneralizationSet(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ClassifierOperations.validateMapsToGeneralizationSet(this,
-			diagnostics, context);
+		return ClassifierOperations.validateMapsToGeneralizationSet(this, diagnostics, context);
 	}
 
 	/**
@@ -1526,8 +1342,7 @@
 	 */
 	public boolean validateNonFinalParents(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ClassifierOperations.validateNonFinalParents(this, diagnostics,
-			context);
+		return ClassifierOperations.validateNonFinalParents(this, diagnostics, context);
 	}
 
 	/**
@@ -1536,8 +1351,7 @@
 	 * @generated
 	 */
 	public Generalization createGeneralization(Classifier general) {
-		Generalization newGeneralization = (Generalization) create(
-			UMLPackage.Literals.GENERALIZATION);
+		Generalization newGeneralization = (Generalization) create(UMLPackage.Literals.GENERALIZATION);
 		getGeneralizations().add(newGeneralization);
 		if (general != null)
 			newGeneralization.setGeneral(general);
@@ -1560,14 +1374,12 @@
 	 */
 	public Generalization getGeneralization(Classifier general,
 			boolean createOnDemand) {
-		generalizationLoop : for (Generalization generalization : getGeneralizations()) {
+		generalizationLoop: for (Generalization generalization : getGeneralizations()) {
 			if (general != null && !general.equals(generalization.getGeneral()))
 				continue generalizationLoop;
 			return generalization;
 		}
-		return createOnDemand
-			? createGeneralization(general)
-			: null;
+		return createOnDemand ? createGeneralization(general) : null;
 	}
 
 	/**
@@ -1579,12 +1391,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Property> result = (EList<Property>) cache.get(this,
-				UMLPackage.Literals.CLASSIFIER___GET_ALL_ATTRIBUTES);
+			EList<Property> result = (EList<Property>) cache.get(this, UMLPackage.Literals.CLASSIFIER___GET_ALL_ATTRIBUTES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CLASSIFIER___GET_ALL_ATTRIBUTES,
-					result = ClassifierOperations.getAllAttributes(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER___GET_ALL_ATTRIBUTES, result = ClassifierOperations.getAllAttributes(this));
 			}
 			return result;
 		}
@@ -1600,11 +1409,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Operation> result = (EList<Operation>) cache.get(this,
-				UMLPackage.Literals.CLASSIFIER___GET_OPERATIONS);
+			EList<Operation> result = (EList<Operation>) cache.get(this, UMLPackage.Literals.CLASSIFIER___GET_OPERATIONS);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.CLASSIFIER___GET_OPERATIONS,
-					result = ClassifierOperations.getOperations(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER___GET_OPERATIONS, result = ClassifierOperations.getOperations(this));
 			}
 			return result;
 		}
@@ -1620,12 +1427,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Operation> result = (EList<Operation>) cache.get(this,
-				UMLPackage.Literals.CLASSIFIER___GET_ALL_OPERATIONS);
+			EList<Operation> result = (EList<Operation>) cache.get(this, UMLPackage.Literals.CLASSIFIER___GET_ALL_OPERATIONS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CLASSIFIER___GET_ALL_OPERATIONS,
-					result = ClassifierOperations.getAllOperations(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER___GET_ALL_OPERATIONS, result = ClassifierOperations.getAllOperations(this));
 			}
 			return result;
 		}
@@ -1639,8 +1443,7 @@
 	 */
 	public Operation getOperation(String name, EList<String> parameterNames,
 			EList<Type> parameterTypes) {
-		return ClassifierOperations.getOperation(this, name, parameterNames,
-			parameterTypes);
+		return ClassifierOperations.getOperation(this, name, parameterNames, parameterTypes);
 	}
 
 	/**
@@ -1650,8 +1453,7 @@
 	 */
 	public Operation getOperation(String name, EList<String> parameterNames,
 			EList<Type> parameterTypes, boolean ignoreCase) {
-		return ClassifierOperations.getOperation(this, name, parameterNames,
-			parameterTypes, ignoreCase);
+		return ClassifierOperations.getOperation(this, name, parameterNames, parameterTypes, ignoreCase);
 	}
 
 	/**
@@ -1663,12 +1465,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.CLASSIFIER___GET_USED_INTERFACES);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.CLASSIFIER___GET_USED_INTERFACES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CLASSIFIER___GET_USED_INTERFACES,
-					result = ClassifierOperations.getUsedInterfaces(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER___GET_USED_INTERFACES, result = ClassifierOperations.getUsedInterfaces(this));
 			}
 			return result;
 		}
@@ -1684,12 +1483,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.CLASSIFIER___GET_ALL_USED_INTERFACES);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.CLASSIFIER___GET_ALL_USED_INTERFACES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CLASSIFIER___GET_ALL_USED_INTERFACES,
-					result = ClassifierOperations.getAllUsedInterfaces(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER___GET_ALL_USED_INTERFACES, result = ClassifierOperations.getAllUsedInterfaces(this));
 			}
 			return result;
 		}
@@ -1714,11 +1510,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Feature> result = (EList<Feature>) cache.get(this,
-				UMLPackage.Literals.CLASSIFIER___ALL_FEATURES);
+			EList<Feature> result = (EList<Feature>) cache.get(this, UMLPackage.Literals.CLASSIFIER___ALL_FEATURES);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.CLASSIFIER___ALL_FEATURES,
-					result = ClassifierOperations.allFeatures(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER___ALL_FEATURES, result = ClassifierOperations.allFeatures(this));
 			}
 			return result;
 		}
@@ -1734,11 +1528,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Classifier> result = (EList<Classifier>) cache.get(this,
-				UMLPackage.Literals.CLASSIFIER___PARENTS);
+			EList<Classifier> result = (EList<Classifier>) cache.get(this, UMLPackage.Literals.CLASSIFIER___PARENTS);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.CLASSIFIER___PARENTS,
-					result = ClassifierOperations.parents(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER___PARENTS, result = ClassifierOperations.parents(this));
 			}
 			return result;
 		}
@@ -1754,13 +1546,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.CLASSIFIER___DIRECTLY_REALIZED_INTERFACES);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.CLASSIFIER___DIRECTLY_REALIZED_INTERFACES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CLASSIFIER___DIRECTLY_REALIZED_INTERFACES,
-					result = ClassifierOperations
-						.directlyRealizedInterfaces(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER___DIRECTLY_REALIZED_INTERFACES, result = ClassifierOperations.directlyRealizedInterfaces(this));
 			}
 			return result;
 		}
@@ -1776,12 +1564,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.CLASSIFIER___DIRECTLY_USED_INTERFACES);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.CLASSIFIER___DIRECTLY_USED_INTERFACES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CLASSIFIER___DIRECTLY_USED_INTERFACES,
-					result = ClassifierOperations.directlyUsedInterfaces(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER___DIRECTLY_USED_INTERFACES, result = ClassifierOperations.directlyUsedInterfaces(this));
 			}
 			return result;
 		}
@@ -1797,12 +1582,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.CLASSIFIER___ALL_REALIZED_INTERFACES);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.CLASSIFIER___ALL_REALIZED_INTERFACES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CLASSIFIER___ALL_REALIZED_INTERFACES,
-					result = ClassifierOperations.allRealizedInterfaces(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER___ALL_REALIZED_INTERFACES, result = ClassifierOperations.allRealizedInterfaces(this));
 			}
 			return result;
 		}
@@ -1818,12 +1600,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.CLASSIFIER___ALL_USED_INTERFACES);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.CLASSIFIER___ALL_USED_INTERFACES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CLASSIFIER___ALL_USED_INTERFACES,
-					result = ClassifierOperations.allUsedInterfaces(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER___ALL_USED_INTERFACES, result = ClassifierOperations.allUsedInterfaces(this));
 			}
 			return result;
 		}
@@ -1848,11 +1627,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Property> result = (EList<Property>) cache.get(this,
-				UMLPackage.Literals.CLASSIFIER___ALL_ATTRIBUTES);
+			EList<Property> result = (EList<Property>) cache.get(this, UMLPackage.Literals.CLASSIFIER___ALL_ATTRIBUTES);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.CLASSIFIER___ALL_ATTRIBUTES,
-					result = ClassifierOperations.allAttributes(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER___ALL_ATTRIBUTES, result = ClassifierOperations.allAttributes(this));
 			}
 			return result;
 		}
@@ -1868,13 +1645,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<StructuralFeature> result = (EList<StructuralFeature>) cache
-				.get(this,
-					UMLPackage.Literals.CLASSIFIER___ALL_SLOTTABLE_FEATURES);
+			EList<StructuralFeature> result = (EList<StructuralFeature>) cache.get(this, UMLPackage.Literals.CLASSIFIER___ALL_SLOTTABLE_FEATURES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CLASSIFIER___ALL_SLOTTABLE_FEATURES,
-					result = ClassifierOperations.allSlottableFeatures(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER___ALL_SLOTTABLE_FEATURES, result = ClassifierOperations.allSlottableFeatures(this));
 			}
 			return result;
 		}
@@ -1917,11 +1690,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Classifier> result = (EList<Classifier>) cache.get(this,
-				UMLPackage.Literals.CLASSIFIER___ALL_PARENTS);
+			EList<Classifier> result = (EList<Classifier>) cache.get(this, UMLPackage.Literals.CLASSIFIER___ALL_PARENTS);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.CLASSIFIER___ALL_PARENTS,
-					result = ClassifierOperations.allParents(this));
+				cache.put(this, UMLPackage.Literals.CLASSIFIER___ALL_PARENTS, result = ClassifierOperations.allParents(this));
 			}
 			return result;
 		}
@@ -1938,56 +1709,38 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CLASSIFIER__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.CLASSIFIER__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -2001,50 +1754,38 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CLASSIFIER__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.CLASSIFIER__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.CLASSIFIER__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CLASSIFIER__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.CLASSIFIER__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.CLASSIFIER__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -2058,10 +1799,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
+		case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -2074,98 +1813,98 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CLASSIFIER__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CLASSIFIER__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CLASSIFIER__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CLASSIFIER__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CLASSIFIER__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CLASSIFIER__NAME :
-				return getName();
-			case UMLPackage.CLASSIFIER__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CLASSIFIER__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CLASSIFIER__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CLASSIFIER__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CLASSIFIER__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.CLASSIFIER__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.CLASSIFIER__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.CLASSIFIER__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.CLASSIFIER__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.CLASSIFIER__MEMBER :
-				return getMembers();
-			case UMLPackage.CLASSIFIER__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.CLASSIFIER__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.CLASSIFIER__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.CLASSIFIER__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.CLASSIFIER__FEATURE :
-				return getFeatures();
-			case UMLPackage.CLASSIFIER__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.CLASSIFIER__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.CLASSIFIER__GENERAL :
-				return getGenerals();
-			case UMLPackage.CLASSIFIER__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.CLASSIFIER__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.CLASSIFIER__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.CLASSIFIER__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.CLASSIFIER__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.CLASSIFIER__USE_CASE :
-				return getUseCases();
-			case UMLPackage.CLASSIFIER__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.CLASSIFIER__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.CLASSIFIER__SUBSTITUTION :
-				return getSubstitutions();
+		case UMLPackage.CLASSIFIER__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CLASSIFIER__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CLASSIFIER__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CLASSIFIER__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CLASSIFIER__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CLASSIFIER__NAME:
+			return getName();
+		case UMLPackage.CLASSIFIER__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CLASSIFIER__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CLASSIFIER__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CLASSIFIER__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CLASSIFIER__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.CLASSIFIER__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.CLASSIFIER__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.CLASSIFIER__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.CLASSIFIER__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.CLASSIFIER__MEMBER:
+			return getMembers();
+		case UMLPackage.CLASSIFIER__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.CLASSIFIER__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.CLASSIFIER__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.CLASSIFIER__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.CLASSIFIER__FEATURE:
+			return getFeatures();
+		case UMLPackage.CLASSIFIER__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.CLASSIFIER__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.CLASSIFIER__GENERAL:
+			return getGenerals();
+		case UMLPackage.CLASSIFIER__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.CLASSIFIER__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.CLASSIFIER__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.CLASSIFIER__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.CLASSIFIER__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.CLASSIFIER__USE_CASE:
+			return getUseCases();
+		case UMLPackage.CLASSIFIER__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.CLASSIFIER__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.CLASSIFIER__SUBSTITUTION:
+			return getSubstitutions();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -2179,108 +1918,95 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CLASSIFIER__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.CLASSIFIER__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
+		case UMLPackage.CLASSIFIER__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.CLASSIFIER__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -2293,81 +2019,81 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CLASSIFIER__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CLASSIFIER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CLASSIFIER__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CLASSIFIER__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CLASSIFIER__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CLASSIFIER__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.CLASSIFIER__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.CLASSIFIER__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.CLASSIFIER__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.CLASSIFIER__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.CLASSIFIER__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.CLASSIFIER__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.CLASSIFIER__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.CLASSIFIER__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.CLASSIFIER__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.CLASSIFIER__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.CLASSIFIER__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.CLASSIFIER__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.CLASSIFIER__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.CLASSIFIER__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.CLASSIFIER__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
+		case UMLPackage.CLASSIFIER__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CLASSIFIER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CLASSIFIER__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CLASSIFIER__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CLASSIFIER__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CLASSIFIER__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.CLASSIFIER__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.CLASSIFIER__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.CLASSIFIER__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.CLASSIFIER__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.CLASSIFIER__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.CLASSIFIER__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.CLASSIFIER__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.CLASSIFIER__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.CLASSIFIER__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.CLASSIFIER__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.CLASSIFIER__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.CLASSIFIER__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.CLASSIFIER__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.CLASSIFIER__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.CLASSIFIER__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -2380,84 +2106,82 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CLASSIFIER__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CLASSIFIER__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CLASSIFIER__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CLASSIFIER__OWNER :
-				return isSetOwner();
-			case UMLPackage.CLASSIFIER__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CLASSIFIER__NAME :
-				return isSetName();
-			case UMLPackage.CLASSIFIER__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CLASSIFIER__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CLASSIFIER__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CLASSIFIER__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CLASSIFIER__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.CLASSIFIER__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.CLASSIFIER__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.CLASSIFIER__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.CLASSIFIER__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.CLASSIFIER__MEMBER :
-				return isSetMembers();
-			case UMLPackage.CLASSIFIER__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.CLASSIFIER__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.CLASSIFIER__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.CLASSIFIER__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.CLASSIFIER__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.CLASSIFIER__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.CLASSIFIER__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.CLASSIFIER__GENERAL :
-				return !getGenerals().isEmpty();
-			case UMLPackage.CLASSIFIER__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.CLASSIFIER__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.CLASSIFIER__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.CLASSIFIER__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.CLASSIFIER__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.CLASSIFIER__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.CLASSIFIER__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.CLASSIFIER__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.CLASSIFIER__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
+		case UMLPackage.CLASSIFIER__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CLASSIFIER__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CLASSIFIER__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CLASSIFIER__OWNER:
+			return isSetOwner();
+		case UMLPackage.CLASSIFIER__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CLASSIFIER__NAME:
+			return isSetName();
+		case UMLPackage.CLASSIFIER__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CLASSIFIER__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CLASSIFIER__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CLASSIFIER__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CLASSIFIER__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.CLASSIFIER__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.CLASSIFIER__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.CLASSIFIER__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.CLASSIFIER__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.CLASSIFIER__MEMBER:
+			return isSetMembers();
+		case UMLPackage.CLASSIFIER__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.CLASSIFIER__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.CLASSIFIER__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.CLASSIFIER__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.CLASSIFIER__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.CLASSIFIER__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.CLASSIFIER__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.CLASSIFIER__GENERAL:
+			return !getGenerals().isEmpty();
+		case UMLPackage.CLASSIFIER__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.CLASSIFIER__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.CLASSIFIER__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.CLASSIFIER__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.CLASSIFIER__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.CLASSIFIER__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.CLASSIFIER__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.CLASSIFIER__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.CLASSIFIER__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -2472,48 +2196,48 @@
 			Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.CLASSIFIER__IS_LEAF :
-					return UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF;
-				case UMLPackage.CLASSIFIER__REDEFINED_ELEMENT :
-					return UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT;
-				case UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT :
-					return UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT;
-				default :
-					return -1;
+			case UMLPackage.CLASSIFIER__IS_LEAF:
+				return UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF;
+			case UMLPackage.CLASSIFIER__REDEFINED_ELEMENT:
+				return UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT;
+			case UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT:
+				return UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == ParameterableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-					return UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
-				case UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER :
-					return UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+				return UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
+			case UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER:
+				return UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == PackageableElement.class) {
 			switch (derivedFeatureID) {
-				default :
-					return -1;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == Type.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.CLASSIFIER__PACKAGE :
-					return UMLPackage.TYPE__PACKAGE;
-				default :
-					return -1;
+			case UMLPackage.CLASSIFIER__PACKAGE:
+				return UMLPackage.TYPE__PACKAGE;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == TemplateableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.CLASSIFIER__TEMPLATE_BINDING :
-					return UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING;
-				case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-					return UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE;
-				default :
-					return -1;
+			case UMLPackage.CLASSIFIER__TEMPLATE_BINDING:
+				return UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING;
+			case UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+				return UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -2529,48 +2253,48 @@
 			Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF :
-					return UMLPackage.CLASSIFIER__IS_LEAF;
-				case UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT :
-					return UMLPackage.CLASSIFIER__REDEFINED_ELEMENT;
-				case UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT :
-					return UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT;
-				default :
-					return -1;
+			case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF:
+				return UMLPackage.CLASSIFIER__IS_LEAF;
+			case UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT:
+				return UMLPackage.CLASSIFIER__REDEFINED_ELEMENT;
+			case UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT:
+				return UMLPackage.CLASSIFIER__REDEFINITION_CONTEXT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == ParameterableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-					return UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER;
-				case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER :
-					return UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+				return UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER;
+			case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER:
+				return UMLPackage.CLASSIFIER__TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == PackageableElement.class) {
 			switch (baseFeatureID) {
-				default :
-					return -1;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == Type.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.TYPE__PACKAGE :
-					return UMLPackage.CLASSIFIER__PACKAGE;
-				default :
-					return -1;
+			case UMLPackage.TYPE__PACKAGE:
+				return UMLPackage.CLASSIFIER__PACKAGE;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == TemplateableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING :
-					return UMLPackage.CLASSIFIER__TEMPLATE_BINDING;
-				case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE :
-					return UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE;
-				default :
-					return -1;
+			case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING:
+				return UMLPackage.CLASSIFIER__TEMPLATE_BINDING;
+			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE:
+				return UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -2585,58 +2309,58 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.CLASSIFIER___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.CLASSIFIER___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.CLASSIFIER___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.REDEFINABLE_ELEMENT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-					return UMLPackage.CLASSIFIER___IS_CONSISTENT_WITH__REDEFINABLEELEMENT;
-				case UMLPackage.REDEFINABLE_ELEMENT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-					return UMLPackage.CLASSIFIER___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT;
-				default :
-					return -1;
+			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.CLASSIFIER___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.CLASSIFIER___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.CLASSIFIER___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.REDEFINABLE_ELEMENT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+				return UMLPackage.CLASSIFIER___IS_CONSISTENT_WITH__REDEFINABLEELEMENT;
+			case UMLPackage.REDEFINABLE_ELEMENT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+				return UMLPackage.CLASSIFIER___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == ParameterableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-					return UMLPackage.CLASSIFIER___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT;
-				case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER :
-					return UMLPackage.CLASSIFIER___IS_TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+				return UMLPackage.CLASSIFIER___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT;
+			case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER:
+				return UMLPackage.CLASSIFIER___IS_TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == PackageableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.CLASSIFIER___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP;
-				default :
-					return -1;
+			case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.CLASSIFIER___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == Type.class) {
 			switch (baseOperationID) {
-				case UMLPackage.TYPE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-					return UMLPackage.CLASSIFIER___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT;
-				case UMLPackage.TYPE___GET_ASSOCIATIONS :
-					return UMLPackage.CLASSIFIER___GET_ASSOCIATIONS;
-				case UMLPackage.TYPE___CONFORMS_TO__TYPE :
-					return UMLPackage.CLASSIFIER___CONFORMS_TO__TYPE;
-				default :
-					return -1;
+			case UMLPackage.TYPE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+				return UMLPackage.CLASSIFIER___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT;
+			case UMLPackage.TYPE___GET_ASSOCIATIONS:
+				return UMLPackage.CLASSIFIER___GET_ASSOCIATIONS;
+			case UMLPackage.TYPE___CONFORMS_TO__TYPE:
+				return UMLPackage.CLASSIFIER___CONFORMS_TO__TYPE;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == TemplateableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.TEMPLATEABLE_ELEMENT___IS_TEMPLATE :
-					return UMLPackage.CLASSIFIER___IS_TEMPLATE;
-				case UMLPackage.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS :
-					return UMLPackage.CLASSIFIER___PARAMETERABLE_ELEMENTS;
-				default :
-					return -1;
+			case UMLPackage.TEMPLATEABLE_ELEMENT___IS_TEMPLATE:
+				return UMLPackage.CLASSIFIER___IS_TEMPLATE;
+			case UMLPackage.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS:
+				return UMLPackage.CLASSIFIER___PARAMETERABLE_ELEMENTS;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -2652,272 +2376,217 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CLASSIFIER___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CLASSIFIER___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CLASSIFIER___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CLASSIFIER___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CLASSIFIER___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CLASSIFIER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLASSIFIER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CLASSIFIER___GET_MODEL :
-				return getModel();
-			case UMLPackage.CLASSIFIER___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CLASSIFIER___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CLASSIFIER___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CLASSIFIER___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CLASSIFIER___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CLASSIFIER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CLASSIFIER___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CLASSIFIER___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CLASSIFIER___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CLASSIFIER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CLASSIFIER___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLASSIFIER___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLASSIFIER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CLASSIFIER___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CLASSIFIER___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CLASSIFIER___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CLASSIFIER___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CLASSIFIER___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CLASSIFIER___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CLASSIFIER___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CLASSIFIER___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CLASSIFIER___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CLASSIFIER___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CLASSIFIER___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CLASSIFIER___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CLASSIFIER___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CLASSIFIER___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CLASSIFIER___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CLASSIFIER___SEPARATOR :
-				return separator();
-			case UMLPackage.CLASSIFIER___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CLASSIFIER___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.CLASSIFIER___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.CLASSIFIER___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.CLASSIFIER___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.CLASSIFIER___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.CLASSIFIER___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.CLASSIFIER___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.CLASSIFIER___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.CLASSIFIER___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.CLASSIFIER___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.CLASSIFIER___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.CLASSIFIER___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.CLASSIFIER___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.CLASSIFIER___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.CLASSIFIER___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.CLASSIFIER___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.CLASSIFIER___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.CLASSIFIER___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.CLASSIFIER___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.CLASSIFIER___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.CLASSIFIER___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.CLASSIFIER___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.CLASSIFIER___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.CLASSIFIER___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.CLASSIFIER___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.CLASSIFIER___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.CLASSIFIER___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.CLASSIFIER___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.CLASSIFIER___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.CLASSIFIER___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.CLASSIFIER___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.CLASSIFIER___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.CLASSIFIER___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.CLASSIFIER___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.CLASSIFIER___PARENTS :
-				return parents();
-			case UMLPackage.CLASSIFIER___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.CLASSIFIER___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.CLASSIFIER___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.CLASSIFIER___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.CLASSIFIER___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.CLASSIFIER___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.CLASSIFIER___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
+		case UMLPackage.CLASSIFIER___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CLASSIFIER___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CLASSIFIER___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CLASSIFIER___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CLASSIFIER___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CLASSIFIER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLASSIFIER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CLASSIFIER___GET_MODEL:
+			return getModel();
+		case UMLPackage.CLASSIFIER___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CLASSIFIER___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CLASSIFIER___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLASSIFIER___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CLASSIFIER___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CLASSIFIER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLASSIFIER___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CLASSIFIER___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CLASSIFIER___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CLASSIFIER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLASSIFIER___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLASSIFIER___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLASSIFIER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CLASSIFIER___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CLASSIFIER___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CLASSIFIER___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CLASSIFIER___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CLASSIFIER___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CLASSIFIER___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CLASSIFIER___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CLASSIFIER___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CLASSIFIER___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CLASSIFIER___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CLASSIFIER___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CLASSIFIER___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CLASSIFIER___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CLASSIFIER___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CLASSIFIER___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CLASSIFIER___SEPARATOR:
+			return separator();
+		case UMLPackage.CLASSIFIER___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CLASSIFIER___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.CLASSIFIER___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.CLASSIFIER___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.CLASSIFIER___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.CLASSIFIER___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.CLASSIFIER___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.CLASSIFIER___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.CLASSIFIER___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.CLASSIFIER___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.CLASSIFIER___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.CLASSIFIER___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.CLASSIFIER___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.CLASSIFIER___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.CLASSIFIER___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.CLASSIFIER___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.CLASSIFIER___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.CLASSIFIER___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.CLASSIFIER___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.CLASSIFIER___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.CLASSIFIER___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.CLASSIFIER___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.CLASSIFIER___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.CLASSIFIER___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.CLASSIFIER___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.CLASSIFIER___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.CLASSIFIER___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.CLASSIFIER___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.CLASSIFIER___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.CLASSIFIER___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.CLASSIFIER___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.CLASSIFIER___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.CLASSIFIER___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.CLASSIFIER___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.CLASSIFIER___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.CLASSIFIER___PARENTS:
+			return parents();
+		case UMLPackage.CLASSIFIER___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.CLASSIFIER___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.CLASSIFIER___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.CLASSIFIER___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.CLASSIFIER___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.CLASSIFIER___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.CLASSIFIER___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -2930,8 +2599,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.CLASSIFIER__REDEFINED_CLASSIFIER};
+	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[] { UMLPackage.CLASSIFIER__REDEFINED_CLASSIFIER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2949,12 +2617,10 @@
 	 */
 	public RedefinableElement getRedefinedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		redefinedElementLoop : for (RedefinableElement redefinedElement : getRedefinedElements()) {
+		redefinedElementLoop: for (RedefinableElement redefinedElement : getRedefinedElements()) {
 			if (eClass != null && !eClass.isInstance(redefinedElement))
 				continue redefinedElementLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinedElement.getName())
-				: name.equals(redefinedElement.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinedElement.getName()) : name.equals(redefinedElement.getName())))
 				continue redefinedElementLoop;
 			return redefinedElement;
 		}
@@ -3005,7 +2671,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER);
+				|| eIsSet(UMLPackage.CLASSIFIER__OWNING_TEMPLATE_PARAMETER);
 	}
 
 	/**
@@ -3015,7 +2681,8 @@
 	 */
 	@Override
 	public boolean isSetNamespace() {
-		return super.isSetNamespace() || eIsSet(UMLPackage.CLASSIFIER__PACKAGE);
+		return super.isSetNamespace()
+				|| eIsSet(UMLPackage.CLASSIFIER__PACKAGE);
 	}
 
 	/**
@@ -3026,17 +2693,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.CLASSIFIER__OWNED_COMMENT,
-		UMLPackage.CLASSIFIER__NAME_EXPRESSION,
-		UMLPackage.CLASSIFIER__ELEMENT_IMPORT,
-		UMLPackage.CLASSIFIER__PACKAGE_IMPORT,
-		UMLPackage.CLASSIFIER__OWNED_MEMBER,
-		UMLPackage.CLASSIFIER__TEMPLATE_BINDING,
-		UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE,
-		UMLPackage.CLASSIFIER__COLLABORATION_USE,
-		UMLPackage.CLASSIFIER__GENERALIZATION,
-		UMLPackage.CLASSIFIER__SUBSTITUTION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.CLASSIFIER__OWNED_COMMENT, UMLPackage.CLASSIFIER__NAME_EXPRESSION, UMLPackage.CLASSIFIER__ELEMENT_IMPORT, UMLPackage.CLASSIFIER__PACKAGE_IMPORT,
+			UMLPackage.CLASSIFIER__OWNED_MEMBER, UMLPackage.CLASSIFIER__TEMPLATE_BINDING, UMLPackage.CLASSIFIER__OWNED_TEMPLATE_SIGNATURE, UMLPackage.CLASSIFIER__COLLABORATION_USE, UMLPackage.CLASSIFIER__GENERALIZATION, UMLPackage.CLASSIFIER__SUBSTITUTION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -3046,11 +2704,11 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.CLASSIFIER__TEMPLATE_BINDING)
-			|| isSetOwnedTemplateSignature()
-			|| eIsSet(UMLPackage.CLASSIFIER__COLLABORATION_USE)
-			|| eIsSet(UMLPackage.CLASSIFIER__GENERALIZATION)
-			|| eIsSet(UMLPackage.CLASSIFIER__SUBSTITUTION);
+				|| eIsSet(UMLPackage.CLASSIFIER__TEMPLATE_BINDING)
+				|| isSetOwnedTemplateSignature()
+				|| eIsSet(UMLPackage.CLASSIFIER__COLLABORATION_USE)
+				|| eIsSet(UMLPackage.CLASSIFIER__GENERALIZATION)
+				|| eIsSet(UMLPackage.CLASSIFIER__SUBSTITUTION);
 	}
 
 	/**
@@ -3061,8 +2719,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] FEATURE_ESUBSETS = new int[]{
-		UMLPackage.CLASSIFIER__ATTRIBUTE};
+	protected static final int[] FEATURE_ESUBSETS = new int[] { UMLPackage.CLASSIFIER__ATTRIBUTE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -3079,12 +2736,10 @@
 	 * @generated
 	 */
 	public Feature getFeature(String name, boolean ignoreCase, EClass eClass) {
-		featureLoop : for (Feature feature : getFeatures()) {
+		featureLoop: for (Feature feature : getFeatures()) {
 			if (eClass != null && !eClass.isInstance(feature))
 				continue featureLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(feature.getName())
-				: name.equals(feature.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(feature.getName()) : name.equals(feature.getName())))
 				continue featureLoop;
 			return feature;
 		}
@@ -3099,10 +2754,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] MEMBER_ESUBSETS = new int[]{
-		UMLPackage.CLASSIFIER__OWNED_MEMBER,
-		UMLPackage.CLASSIFIER__IMPORTED_MEMBER, UMLPackage.CLASSIFIER__FEATURE,
-		UMLPackage.CLASSIFIER__INHERITED_MEMBER};
+	protected static final int[] MEMBER_ESUBSETS = new int[] { UMLPackage.CLASSIFIER__OWNED_MEMBER, UMLPackage.CLASSIFIER__IMPORTED_MEMBER, UMLPackage.CLASSIFIER__FEATURE, UMLPackage.CLASSIFIER__INHERITED_MEMBER };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedMembers() <em>Owned Member</em>}' reference list.
@@ -3112,9 +2764,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.CLASSIFIER__OWNED_RULE,
-		UMLPackage.CLASSIFIER__OWNED_USE_CASE};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.CLASSIFIER__OWNED_RULE, UMLPackage.CLASSIFIER__OWNED_USE_CASE };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getCollaborationUses() <em>Collaboration Use</em>}' containment reference list.
@@ -3124,8 +2774,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] COLLABORATION_USE_ESUBSETS = new int[]{
-		UMLPackage.CLASSIFIER__REPRESENTATION};
+	protected static final int[] COLLABORATION_USE_ESUBSETS = new int[] { UMLPackage.CLASSIFIER__REPRESENTATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -3133,8 +2782,7 @@
 	 * @generated
 	 */
 	public CollaborationUse createCollaborationUse(String name) {
-		CollaborationUse newCollaborationUse = (CollaborationUse) create(
-			UMLPackage.Literals.COLLABORATION_USE);
+		CollaborationUse newCollaborationUse = (CollaborationUse) create(UMLPackage.Literals.COLLABORATION_USE);
 		getCollaborationUses().add(newCollaborationUse);
 		if (name != null)
 			newCollaborationUse.setName(name);
@@ -3157,16 +2805,12 @@
 	 */
 	public CollaborationUse getCollaborationUse(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		collaborationUseLoop : for (CollaborationUse collaborationUse : getCollaborationUses()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(collaborationUse.getName())
-				: name.equals(collaborationUse.getName())))
+		collaborationUseLoop: for (CollaborationUse collaborationUse : getCollaborationUses()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(collaborationUse.getName()) : name.equals(collaborationUse.getName())))
 				continue collaborationUseLoop;
 			return collaborationUse;
 		}
-		return createOnDemand
-			? createCollaborationUse(name)
-			: null;
+		return createOnDemand ? createCollaborationUse(name) : null;
 	}
 
 	/**
@@ -3175,8 +2819,7 @@
 	 * @generated
 	 */
 	public Substitution createSubstitution(String name, Classifier contract) {
-		Substitution newSubstitution = (Substitution) create(
-			UMLPackage.Literals.SUBSTITUTION);
+		Substitution newSubstitution = (Substitution) create(UMLPackage.Literals.SUBSTITUTION);
 		getSubstitutions().add(newSubstitution);
 		if (name != null)
 			newSubstitution.setName(name);
@@ -3201,19 +2844,14 @@
 	 */
 	public Substitution getSubstitution(String name, Classifier contract,
 			boolean ignoreCase, boolean createOnDemand) {
-		substitutionLoop : for (Substitution substitution : getSubstitutions()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(substitution.getName())
-				: name.equals(substitution.getName())))
+		substitutionLoop: for (Substitution substitution : getSubstitutions()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(substitution.getName()) : name.equals(substitution.getName())))
 				continue substitutionLoop;
-			if (contract != null
-				&& !contract.equals(substitution.getContract()))
+			if (contract != null && !contract.equals(substitution.getContract()))
 				continue substitutionLoop;
 			return substitution;
 		}
-		return createOnDemand
-			? createSubstitution(name, contract)
-			: null;
+		return createOnDemand ? createSubstitution(name, contract) : null;
 	}
 
 	/**
@@ -3232,8 +2870,9 @@
 	 */
 	@Override
 	public boolean isSetMembers() {
-		return super.isSetMembers() || isSetFeatures()
-			|| eIsSet(UMLPackage.CLASSIFIER__INHERITED_MEMBER);
+		return super.isSetMembers()
+				|| isSetFeatures()
+				|| eIsSet(UMLPackage.CLASSIFIER__INHERITED_MEMBER);
 	}
 
 	/**
@@ -3244,7 +2883,7 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.CLASSIFIER__OWNED_USE_CASE);
+				|| eIsSet(UMLPackage.CLASSIFIER__OWNED_USE_CASE);
 	}
 
 	/**
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClassifierTemplateParameterImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClassifierTemplateParameterImpl.java
index d8ccb1f..a6c613f 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClassifierTemplateParameterImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClassifierTemplateParameterImpl.java
@@ -1,32 +1,39 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 212765, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 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;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.uml2.uml.Classifier;
@@ -93,11 +100,7 @@
 	 * @generated
 	 */
 	public boolean isAllowSubstitutable() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE,
-			true, true);
+		return (Boolean) eDynamicGet(UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE, true, true);
 	}
 
 	/**
@@ -106,11 +109,7 @@
 	 * @generated
 	 */
 	public void setAllowSubstitutable(boolean newAllowSubstitutable) {
-		eDynamicSet(
-			UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE,
-			newAllowSubstitutable);
+		eDynamicSet(UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE, newAllowSubstitutable);
 	}
 
 	/**
@@ -120,11 +119,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Classifier> getConstrainingClassifiers() {
-		return (EList<Classifier>) eDynamicGet(
-			UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__CONSTRAINING_CLASSIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER_TEMPLATE_PARAMETER__CONSTRAINING_CLASSIFIER,
-			true, true);
+		return (EList<Classifier>) eDynamicGet(UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__CONSTRAINING_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER_TEMPLATE_PARAMETER__CONSTRAINING_CLASSIFIER, true, true);
 	}
 
 	/**
@@ -143,12 +138,10 @@
 	 */
 	public Classifier getConstrainingClassifier(String name, boolean ignoreCase,
 			EClass eClass) {
-		constrainingClassifierLoop : for (Classifier constrainingClassifier : getConstrainingClassifiers()) {
+		constrainingClassifierLoop: for (Classifier constrainingClassifier : getConstrainingClassifiers()) {
 			if (eClass != null && !eClass.isInstance(constrainingClassifier))
 				continue constrainingClassifierLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(constrainingClassifier.getName())
-				: name.equals(constrainingClassifier.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(constrainingClassifier.getName()) : name.equals(constrainingClassifier.getName())))
 				continue constrainingClassifierLoop;
 			return constrainingClassifier;
 		}
@@ -162,11 +155,7 @@
 	 */
 	@Override
 	public ParameterableElement getParameteredElement() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, true,
-			true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, true, true);
 	}
 
 	/**
@@ -176,11 +165,7 @@
 	 */
 	@Override
 	public ParameterableElement basicGetParameteredElement() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, false,
-			true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, false, true);
 	}
 
 	/**
@@ -191,14 +176,10 @@
 	public NotificationChain basicSetParameteredElementGen(
 			ParameterableElement newParameteredElement,
 			NotificationChain msgs) {
-		if (newParameteredElement != null
-			&& !(newParameteredElement instanceof Classifier)) {
-			throw new IllegalArgumentException(
-				"newParameteredElement must be an instance of Classifier"); //$NON-NLS-1$
+		if (newParameteredElement != null && !(newParameteredElement instanceof Classifier)) {
+			throw new IllegalArgumentException("newParameteredElement must be an instance of Classifier"); //$NON-NLS-1$
 		}
-		msgs = eDynamicInverseAdd((InternalEObject) newParameteredElement,
-			UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-			msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newParameteredElement, UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, msgs);
 		return msgs;
 	}
 
@@ -214,7 +195,7 @@
 
 			ParameterableElement ownedParameteredElement = basicGetOwnedParameteredElement();
 			if (ownedParameteredElement != null
-				&& ownedParameteredElement != newParameteredElement) {
+					&& ownedParameteredElement != newParameteredElement) {
 
 				setOwnedParameteredElement(null);
 			}
@@ -231,16 +212,10 @@
 	@Override
 	public void setParameteredElement(
 			ParameterableElement newParameteredElement) {
-		if (newParameteredElement != null
-			&& !(newParameteredElement instanceof Classifier)) {
-			throw new IllegalArgumentException(
-				"newParameteredElement must be an instance of Classifier"); //$NON-NLS-1$
+		if (newParameteredElement != null && !(newParameteredElement instanceof Classifier)) {
+			throw new IllegalArgumentException("newParameteredElement must be an instance of Classifier"); //$NON-NLS-1$
 		}
-		eDynamicSet(
-			UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-			newParameteredElement);
+		eDynamicSet(UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, newParameteredElement);
 	}
 
 	/**
@@ -259,8 +234,7 @@
 	 */
 	public boolean validateHasConstrainingClassifier(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return ClassifierTemplateParameterOperations
-			.validateHasConstrainingClassifier(this, diagnostics, context);
+		return ClassifierTemplateParameterOperations.validateHasConstrainingClassifier(this, diagnostics, context);
 	}
 
 	/**
@@ -270,8 +244,7 @@
 	 */
 	public boolean validateParameteredElementNoFeatures(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return ClassifierTemplateParameterOperations
-			.validateParameteredElementNoFeatures(this, diagnostics, context);
+		return ClassifierTemplateParameterOperations.validateParameteredElementNoFeatures(this, diagnostics, context);
 	}
 
 	/**
@@ -281,8 +254,7 @@
 	 */
 	public boolean validateMatchingAbstract(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ClassifierTemplateParameterOperations
-			.validateMatchingAbstract(this, diagnostics, context);
+		return ClassifierTemplateParameterOperations.validateMatchingAbstract(this, diagnostics, context);
 	}
 
 	/**
@@ -292,8 +264,7 @@
 	 */
 	public boolean validateActualIsClassifier(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ClassifierTemplateParameterOperations
-			.validateActualIsClassifier(this, diagnostics, context);
+		return ClassifierTemplateParameterOperations.validateActualIsClassifier(this, diagnostics, context);
 	}
 
 	/**
@@ -303,9 +274,7 @@
 	 */
 	public boolean validateConstrainingClassifiersConstrainArgs(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return ClassifierTemplateParameterOperations
-			.validateConstrainingClassifiersConstrainArgs(this, diagnostics,
-				context);
+		return ClassifierTemplateParameterOperations.validateConstrainingClassifiersConstrainArgs(this, diagnostics, context);
 	}
 
 	/**
@@ -315,9 +284,7 @@
 	 */
 	public boolean validateConstrainingClassifiersConstrainParameteredElement(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return ClassifierTemplateParameterOperations
-			.validateConstrainingClassifiersConstrainParameteredElement(this,
-				diagnostics, context);
+		return ClassifierTemplateParameterOperations.validateConstrainingClassifiersConstrainParameteredElement(this, diagnostics, context);
 	}
 
 	/**
@@ -330,31 +297,22 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				ParameterableElement parameteredElement = basicGetParameteredElement();
-				if (parameteredElement != null)
-					msgs = ((InternalEObject) parameteredElement)
-						.eInverseRemove(this,
-							UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-							ParameterableElement.class, msgs);
-				return basicSetParameteredElement(
-					(ParameterableElement) otherEnd, msgs);
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__SIGNATURE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetSignature((TemplateSignature) otherEnd, msgs);
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				ParameterableElement ownedParameteredElement = basicGetOwnedParameteredElement();
-				if (ownedParameteredElement != null)
-					msgs = ((InternalEObject) ownedParameteredElement)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-							null, msgs);
-				return basicSetOwnedParameteredElement(
-					(ParameterableElement) otherEnd, msgs);
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			ParameterableElement parameteredElement = basicGetParameteredElement();
+			if (parameteredElement != null)
+				msgs = ((InternalEObject) parameteredElement).eInverseRemove(this, UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, ParameterableElement.class, msgs);
+			return basicSetParameteredElement((ParameterableElement) otherEnd, msgs);
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__SIGNATURE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			ParameterableElement ownedParameteredElement = basicGetOwnedParameteredElement();
+			if (ownedParameteredElement != null)
+				msgs = ((InternalEObject) ownedParameteredElement).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, null, msgs);
+			return basicSetOwnedParameteredElement((ParameterableElement) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -368,20 +326,18 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				return basicSetOwnedDefault(null, msgs);
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				return basicSetParameteredElement(null, msgs);
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__SIGNATURE :
-				return basicSetSignature(null, msgs);
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				return basicSetOwnedParameteredElement(null, msgs);
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			return basicSetOwnedDefault(null, msgs);
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			return basicSetParameteredElement(null, msgs);
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__SIGNATURE:
+			return basicSetSignature(null, msgs);
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			return basicSetOwnedParameteredElement(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -394,40 +350,40 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__DEFAULT :
-				if (resolve)
-					return getDefault();
-				return basicGetDefault();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				if (resolve)
-					return getOwnedDefault();
-				return basicGetOwnedDefault();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				if (resolve)
-					return getParameteredElement();
-				return basicGetParameteredElement();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__SIGNATURE :
-				if (resolve)
-					return getSignature();
-				return basicGetSignature();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				if (resolve)
-					return getOwnedParameteredElement();
-				return basicGetOwnedParameteredElement();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE :
-				return isAllowSubstitutable();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__CONSTRAINING_CLASSIFIER :
-				return getConstrainingClassifiers();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__DEFAULT:
+			if (resolve)
+				return getDefault();
+			return basicGetDefault();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			if (resolve)
+				return getOwnedDefault();
+			return basicGetOwnedDefault();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			if (resolve)
+				return getParameteredElement();
+			return basicGetParameteredElement();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__SIGNATURE:
+			if (resolve)
+				return getSignature();
+			return basicGetSignature();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			if (resolve)
+				return getOwnedParameteredElement();
+			return basicGetOwnedParameteredElement();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE:
+			return isAllowSubstitutable();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__CONSTRAINING_CLASSIFIER:
+			return getConstrainingClassifiers();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -441,39 +397,36 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__DEFAULT :
-				setDefault((ParameterableElement) newValue);
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				setOwnedDefault((ParameterableElement) newValue);
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				setParameteredElement((ParameterableElement) newValue);
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__SIGNATURE :
-				setSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				setOwnedParameteredElement((ParameterableElement) newValue);
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE :
-				setAllowSubstitutable((Boolean) newValue);
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__CONSTRAINING_CLASSIFIER :
-				getConstrainingClassifiers().clear();
-				getConstrainingClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__DEFAULT:
+			setDefault((ParameterableElement) newValue);
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			setOwnedDefault((ParameterableElement) newValue);
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			setParameteredElement((ParameterableElement) newValue);
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__SIGNATURE:
+			setSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			setOwnedParameteredElement((ParameterableElement) newValue);
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE:
+			setAllowSubstitutable((Boolean) newValue);
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__CONSTRAINING_CLASSIFIER:
+			getConstrainingClassifiers().clear();
+			getConstrainingClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -486,33 +439,33 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__DEFAULT :
-				setDefault((ParameterableElement) null);
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				setOwnedDefault((ParameterableElement) null);
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				setParameteredElement((ParameterableElement) null);
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__SIGNATURE :
-				setSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				setOwnedParameteredElement((ParameterableElement) null);
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE :
-				setAllowSubstitutable(ALLOW_SUBSTITUTABLE_EDEFAULT);
-				return;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__CONSTRAINING_CLASSIFIER :
-				getConstrainingClassifiers().clear();
-				return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__DEFAULT:
+			setDefault((ParameterableElement) null);
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			setOwnedDefault((ParameterableElement) null);
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			setParameteredElement((ParameterableElement) null);
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__SIGNATURE:
+			setSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			setOwnedParameteredElement((ParameterableElement) null);
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE:
+			setAllowSubstitutable(ALLOW_SUBSTITUTABLE_EDEFAULT);
+			return;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__CONSTRAINING_CLASSIFIER:
+			getConstrainingClassifiers().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -525,28 +478,28 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNER :
-				return isSetOwner();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__DEFAULT :
-				return basicGetDefault() != null;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				return basicGetOwnedDefault() != null;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				return isSetParameteredElement();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__SIGNATURE :
-				return basicGetSignature() != null;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				return basicGetOwnedParameteredElement() != null;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE :
-				return isAllowSubstitutable() != ALLOW_SUBSTITUTABLE_EDEFAULT;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__CONSTRAINING_CLASSIFIER :
-				return !getConstrainingClassifiers().isEmpty();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNER:
+			return isSetOwner();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__DEFAULT:
+			return basicGetDefault() != null;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			return basicGetOwnedDefault() != null;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			return isSetParameteredElement();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__SIGNATURE:
+			return basicGetSignature() != null;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			return basicGetOwnedParameteredElement() != null;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__ALLOW_SUBSTITUTABLE:
+			return isAllowSubstitutable() != ALLOW_SUBSTITUTABLE_EDEFAULT;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER__CONSTRAINING_CLASSIFIER:
+			return !getConstrainingClassifiers().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -561,118 +514,96 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_MODEL :
-				return getModel();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_MUST_BE_COMPATIBLE__DIAGNOSTICCHAIN_MAP :
-				return validateMustBeCompatible(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_HAS_CONSTRAINING_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateHasConstrainingClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_PARAMETERED_ELEMENT_NO_FEATURES__DIAGNOSTICCHAIN_MAP :
-				return validateParameteredElementNoFeatures(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_MATCHING_ABSTRACT__DIAGNOSTICCHAIN_MAP :
-				return validateMatchingAbstract(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_ACTUAL_IS_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateActualIsClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_CONSTRAINING_CLASSIFIERS_CONSTRAIN_ARGS__DIAGNOSTICCHAIN_MAP :
-				return validateConstrainingClassifiersConstrainArgs(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_CONSTRAINING_CLASSIFIERS_CONSTRAIN_PARAMETERED_ELEMENT__DIAGNOSTICCHAIN_MAP :
-				return validateConstrainingClassifiersConstrainParameteredElement(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_MODEL:
+			return getModel();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_MUST_BE_COMPATIBLE__DIAGNOSTICCHAIN_MAP:
+			return validateMustBeCompatible((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_HAS_CONSTRAINING_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateHasConstrainingClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_PARAMETERED_ELEMENT_NO_FEATURES__DIAGNOSTICCHAIN_MAP:
+			return validateParameteredElementNoFeatures((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_MATCHING_ABSTRACT__DIAGNOSTICCHAIN_MAP:
+			return validateMatchingAbstract((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_ACTUAL_IS_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateActualIsClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_CONSTRAINING_CLASSIFIERS_CONSTRAIN_ARGS__DIAGNOSTICCHAIN_MAP:
+			return validateConstrainingClassifiersConstrainArgs((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER___VALIDATE_CONSTRAINING_CLASSIFIERS_CONSTRAIN_PARAMETERED_ELEMENT__DIAGNOSTICCHAIN_MAP:
+			return validateConstrainingClassifiersConstrainParameteredElement((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClauseImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClauseImpl.java
index 3056973..2e39f7e 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClauseImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClauseImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,10 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Clause;
@@ -87,9 +92,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ExecutableNode> getTests() {
-		return (EList<ExecutableNode>) eDynamicGet(
-			UMLPackage.CLAUSE__TEST - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLAUSE__TEST, true, true);
+		return (EList<ExecutableNode>) eDynamicGet(UMLPackage.CLAUSE__TEST - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLAUSE__TEST, true, true);
 	}
 
 	/**
@@ -108,12 +111,10 @@
 	 */
 	public ExecutableNode getTest(String name, boolean ignoreCase,
 			EClass eClass) {
-		testLoop : for (ExecutableNode test : getTests()) {
+		testLoop: for (ExecutableNode test : getTests()) {
 			if (eClass != null && !eClass.isInstance(test))
 				continue testLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(test.getName())
-				: name.equals(test.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(test.getName()) : name.equals(test.getName())))
 				continue testLoop;
 			return test;
 		}
@@ -127,9 +128,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ExecutableNode> getBodies() {
-		return (EList<ExecutableNode>) eDynamicGet(
-			UMLPackage.CLAUSE__BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLAUSE__BODY, true, true);
+		return (EList<ExecutableNode>) eDynamicGet(UMLPackage.CLAUSE__BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLAUSE__BODY, true, true);
 	}
 
 	/**
@@ -148,12 +147,10 @@
 	 */
 	public ExecutableNode getBody(String name, boolean ignoreCase,
 			EClass eClass) {
-		bodyLoop : for (ExecutableNode body : getBodies()) {
+		bodyLoop: for (ExecutableNode body : getBodies()) {
 			if (eClass != null && !eClass.isInstance(body))
 				continue bodyLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(body.getName())
-				: name.equals(body.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(body.getName()) : name.equals(body.getName())))
 				continue bodyLoop;
 			return body;
 		}
@@ -167,9 +164,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Clause> getPredecessorClauses() {
-		return (EList<Clause>) eDynamicGet(
-			UMLPackage.CLAUSE__PREDECESSOR_CLAUSE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLAUSE__PREDECESSOR_CLAUSE, true, true);
+		return (EList<Clause>) eDynamicGet(UMLPackage.CLAUSE__PREDECESSOR_CLAUSE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLAUSE__PREDECESSOR_CLAUSE, true, true);
 	}
 
 	/**
@@ -179,9 +174,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Clause> getSuccessorClauses() {
-		return (EList<Clause>) eDynamicGet(
-			UMLPackage.CLAUSE__SUCCESSOR_CLAUSE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLAUSE__SUCCESSOR_CLAUSE, true, true);
+		return (EList<Clause>) eDynamicGet(UMLPackage.CLAUSE__SUCCESSOR_CLAUSE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLAUSE__SUCCESSOR_CLAUSE, true, true);
 	}
 
 	/**
@@ -190,9 +183,7 @@
 	 * @generated
 	 */
 	public OutputPin getDecider() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.CLAUSE__DECIDER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLAUSE__DECIDER, true, true);
+		return (OutputPin) eDynamicGet(UMLPackage.CLAUSE__DECIDER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLAUSE__DECIDER, true, true);
 	}
 
 	/**
@@ -201,9 +192,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetDecider() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.CLAUSE__DECIDER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLAUSE__DECIDER, false, true);
+		return (OutputPin) eDynamicGet(UMLPackage.CLAUSE__DECIDER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLAUSE__DECIDER, false, true);
 	}
 
 	/**
@@ -212,8 +201,7 @@
 	 * @generated
 	 */
 	public void setDecider(OutputPin newDecider) {
-		eDynamicSet(UMLPackage.CLAUSE__DECIDER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLAUSE__DECIDER, newDecider);
+		eDynamicSet(UMLPackage.CLAUSE__DECIDER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLAUSE__DECIDER, newDecider);
 	}
 
 	/**
@@ -223,9 +211,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<OutputPin> getBodyOutputs() {
-		return (EList<OutputPin>) eDynamicGet(
-			UMLPackage.CLAUSE__BODY_OUTPUT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLAUSE__BODY_OUTPUT, true, true);
+		return (EList<OutputPin>) eDynamicGet(UMLPackage.CLAUSE__BODY_OUTPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLAUSE__BODY_OUTPUT, true, true);
 	}
 
 	/**
@@ -243,10 +229,8 @@
 	 * @generated
 	 */
 	public OutputPin getBodyOutput(String name, Type type, boolean ignoreCase) {
-		bodyOutputLoop : for (OutputPin bodyOutput : getBodyOutputs()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(bodyOutput.getName())
-				: name.equals(bodyOutput.getName())))
+		bodyOutputLoop: for (OutputPin bodyOutput : getBodyOutputs()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(bodyOutput.getName()) : name.equals(bodyOutput.getName())))
 				continue bodyOutputLoop;
 			if (type != null && !type.equals(bodyOutput.getType()))
 				continue bodyOutputLoop;
@@ -262,8 +246,7 @@
 	 */
 	public boolean validateDeciderOutput(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ClauseOperations.validateDeciderOutput(this, diagnostics,
-			context);
+		return ClauseOperations.validateDeciderOutput(this, diagnostics, context);
 	}
 
 	/**
@@ -283,8 +266,7 @@
 	 */
 	public boolean validateBodyOutputPins(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ClauseOperations.validateBodyOutputPins(this, diagnostics,
-			context);
+		return ClauseOperations.validateBodyOutputPins(this, diagnostics, context);
 	}
 
 	/**
@@ -297,15 +279,12 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CLAUSE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLAUSE__PREDECESSOR_CLAUSE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPredecessorClauses())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CLAUSE__SUCCESSOR_CLAUSE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSuccessorClauses())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.CLAUSE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLAUSE__PREDECESSOR_CLAUSE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPredecessorClauses()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CLAUSE__SUCCESSOR_CLAUSE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSuccessorClauses()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -319,18 +298,14 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CLAUSE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLAUSE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLAUSE__PREDECESSOR_CLAUSE :
-				return ((InternalEList<?>) getPredecessorClauses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLAUSE__SUCCESSOR_CLAUSE :
-				return ((InternalEList<?>) getSuccessorClauses())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.CLAUSE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLAUSE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLAUSE__PREDECESSOR_CLAUSE:
+			return ((InternalEList<?>) getPredecessorClauses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLAUSE__SUCCESSOR_CLAUSE:
+			return ((InternalEList<?>) getSuccessorClauses()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -343,30 +318,30 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CLAUSE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CLAUSE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CLAUSE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CLAUSE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CLAUSE__BODY :
-				return getBodies();
-			case UMLPackage.CLAUSE__BODY_OUTPUT :
-				return getBodyOutputs();
-			case UMLPackage.CLAUSE__DECIDER :
-				if (resolve)
-					return getDecider();
-				return basicGetDecider();
-			case UMLPackage.CLAUSE__PREDECESSOR_CLAUSE :
-				return getPredecessorClauses();
-			case UMLPackage.CLAUSE__SUCCESSOR_CLAUSE :
-				return getSuccessorClauses();
-			case UMLPackage.CLAUSE__TEST :
-				return getTests();
+		case UMLPackage.CLAUSE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CLAUSE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CLAUSE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CLAUSE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CLAUSE__BODY:
+			return getBodies();
+		case UMLPackage.CLAUSE__BODY_OUTPUT:
+			return getBodyOutputs();
+		case UMLPackage.CLAUSE__DECIDER:
+			if (resolve)
+				return getDecider();
+			return basicGetDecider();
+		case UMLPackage.CLAUSE__PREDECESSOR_CLAUSE:
+			return getPredecessorClauses();
+		case UMLPackage.CLAUSE__SUCCESSOR_CLAUSE:
+			return getSuccessorClauses();
+		case UMLPackage.CLAUSE__TEST:
+			return getTests();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -380,44 +355,37 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CLAUSE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CLAUSE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CLAUSE__BODY :
-				getBodies().clear();
-				getBodies()
-					.addAll((Collection<? extends ExecutableNode>) newValue);
-				return;
-			case UMLPackage.CLAUSE__BODY_OUTPUT :
-				getBodyOutputs().clear();
-				getBodyOutputs()
-					.addAll((Collection<? extends OutputPin>) newValue);
-				return;
-			case UMLPackage.CLAUSE__DECIDER :
-				setDecider((OutputPin) newValue);
-				return;
-			case UMLPackage.CLAUSE__PREDECESSOR_CLAUSE :
-				getPredecessorClauses().clear();
-				getPredecessorClauses()
-					.addAll((Collection<? extends Clause>) newValue);
-				return;
-			case UMLPackage.CLAUSE__SUCCESSOR_CLAUSE :
-				getSuccessorClauses().clear();
-				getSuccessorClauses()
-					.addAll((Collection<? extends Clause>) newValue);
-				return;
-			case UMLPackage.CLAUSE__TEST :
-				getTests().clear();
-				getTests()
-					.addAll((Collection<? extends ExecutableNode>) newValue);
-				return;
+		case UMLPackage.CLAUSE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CLAUSE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CLAUSE__BODY:
+			getBodies().clear();
+			getBodies().addAll((Collection<? extends ExecutableNode>) newValue);
+			return;
+		case UMLPackage.CLAUSE__BODY_OUTPUT:
+			getBodyOutputs().clear();
+			getBodyOutputs().addAll((Collection<? extends OutputPin>) newValue);
+			return;
+		case UMLPackage.CLAUSE__DECIDER:
+			setDecider((OutputPin) newValue);
+			return;
+		case UMLPackage.CLAUSE__PREDECESSOR_CLAUSE:
+			getPredecessorClauses().clear();
+			getPredecessorClauses().addAll((Collection<? extends Clause>) newValue);
+			return;
+		case UMLPackage.CLAUSE__SUCCESSOR_CLAUSE:
+			getSuccessorClauses().clear();
+			getSuccessorClauses().addAll((Collection<? extends Clause>) newValue);
+			return;
+		case UMLPackage.CLAUSE__TEST:
+			getTests().clear();
+			getTests().addAll((Collection<? extends ExecutableNode>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -430,30 +398,30 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CLAUSE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CLAUSE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CLAUSE__BODY :
-				getBodies().clear();
-				return;
-			case UMLPackage.CLAUSE__BODY_OUTPUT :
-				getBodyOutputs().clear();
-				return;
-			case UMLPackage.CLAUSE__DECIDER :
-				setDecider((OutputPin) null);
-				return;
-			case UMLPackage.CLAUSE__PREDECESSOR_CLAUSE :
-				getPredecessorClauses().clear();
-				return;
-			case UMLPackage.CLAUSE__SUCCESSOR_CLAUSE :
-				getSuccessorClauses().clear();
-				return;
-			case UMLPackage.CLAUSE__TEST :
-				getTests().clear();
-				return;
+		case UMLPackage.CLAUSE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CLAUSE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CLAUSE__BODY:
+			getBodies().clear();
+			return;
+		case UMLPackage.CLAUSE__BODY_OUTPUT:
+			getBodyOutputs().clear();
+			return;
+		case UMLPackage.CLAUSE__DECIDER:
+			setDecider((OutputPin) null);
+			return;
+		case UMLPackage.CLAUSE__PREDECESSOR_CLAUSE:
+			getPredecessorClauses().clear();
+			return;
+		case UMLPackage.CLAUSE__SUCCESSOR_CLAUSE:
+			getSuccessorClauses().clear();
+			return;
+		case UMLPackage.CLAUSE__TEST:
+			getTests().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -466,26 +434,26 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CLAUSE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CLAUSE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CLAUSE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CLAUSE__OWNER :
-				return isSetOwner();
-			case UMLPackage.CLAUSE__BODY :
-				return !getBodies().isEmpty();
-			case UMLPackage.CLAUSE__BODY_OUTPUT :
-				return !getBodyOutputs().isEmpty();
-			case UMLPackage.CLAUSE__DECIDER :
-				return basicGetDecider() != null;
-			case UMLPackage.CLAUSE__PREDECESSOR_CLAUSE :
-				return !getPredecessorClauses().isEmpty();
-			case UMLPackage.CLAUSE__SUCCESSOR_CLAUSE :
-				return !getSuccessorClauses().isEmpty();
-			case UMLPackage.CLAUSE__TEST :
-				return !getTests().isEmpty();
+		case UMLPackage.CLAUSE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CLAUSE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CLAUSE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CLAUSE__OWNER:
+			return isSetOwner();
+		case UMLPackage.CLAUSE__BODY:
+			return !getBodies().isEmpty();
+		case UMLPackage.CLAUSE__BODY_OUTPUT:
+			return !getBodyOutputs().isEmpty();
+		case UMLPackage.CLAUSE__DECIDER:
+			return basicGetDecider() != null;
+		case UMLPackage.CLAUSE__PREDECESSOR_CLAUSE:
+			return !getPredecessorClauses().isEmpty();
+		case UMLPackage.CLAUSE__SUCCESSOR_CLAUSE:
+			return !getSuccessorClauses().isEmpty();
+		case UMLPackage.CLAUSE__TEST:
+			return !getTests().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -500,100 +468,88 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CLAUSE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CLAUSE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLAUSE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLAUSE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CLAUSE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CLAUSE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CLAUSE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CLAUSE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CLAUSE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CLAUSE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CLAUSE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CLAUSE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CLAUSE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLAUSE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CLAUSE___GET_MODEL :
-				return getModel();
-			case UMLPackage.CLAUSE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CLAUSE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CLAUSE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CLAUSE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CLAUSE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CLAUSE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CLAUSE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CLAUSE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CLAUSE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CLAUSE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CLAUSE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CLAUSE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLAUSE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CLAUSE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLAUSE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CLAUSE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CLAUSE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CLAUSE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CLAUSE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CLAUSE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CLAUSE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CLAUSE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CLAUSE___VALIDATE_BODY_OUTPUT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateBodyOutputPins(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLAUSE___VALIDATE_DECIDER_OUTPUT__DIAGNOSTICCHAIN_MAP :
-				return validateDeciderOutput((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLAUSE___VALIDATE_TEST_AND_BODY__DIAGNOSTICCHAIN_MAP :
-				return validateTestAndBody((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLAUSE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CLAUSE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLAUSE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLAUSE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CLAUSE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CLAUSE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CLAUSE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CLAUSE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CLAUSE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CLAUSE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CLAUSE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CLAUSE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CLAUSE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLAUSE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CLAUSE___GET_MODEL:
+			return getModel();
+		case UMLPackage.CLAUSE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CLAUSE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CLAUSE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLAUSE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CLAUSE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CLAUSE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CLAUSE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLAUSE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CLAUSE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CLAUSE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CLAUSE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLAUSE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLAUSE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CLAUSE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLAUSE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CLAUSE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CLAUSE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CLAUSE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CLAUSE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CLAUSE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CLAUSE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CLAUSE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CLAUSE___VALIDATE_BODY_OUTPUT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateBodyOutputPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLAUSE___VALIDATE_DECIDER_OUTPUT__DIAGNOSTICCHAIN_MAP:
+			return validateDeciderOutput((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLAUSE___VALIDATE_TEST_AND_BODY__DIAGNOSTICCHAIN_MAP:
+			return validateTestAndBody((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClearAssociationActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClearAssociationActionImpl.java
index 46589f8..3754e0c 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClearAssociationActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClearAssociationActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -106,19 +109,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.CLEAR_ASSOCIATION_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.CLEAR_ASSOCIATION_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.CLEAR_ASSOCIATION_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.CLEAR_ASSOCIATION_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -127,9 +124,7 @@
 	 * @generated
 	 */
 	public InputPin getObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLEAR_ASSOCIATION_ACTION__OBJECT, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLEAR_ASSOCIATION_ACTION__OBJECT, true, true);
 	}
 
 	/**
@@ -138,9 +133,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLEAR_ASSOCIATION_ACTION__OBJECT, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLEAR_ASSOCIATION_ACTION__OBJECT, false, true);
 	}
 
 	/**
@@ -150,8 +143,7 @@
 	 */
 	public NotificationChain basicSetObject(InputPin newObject,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newObject,
-			UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newObject, UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT, msgs);
 		return msgs;
 	}
 
@@ -161,9 +153,7 @@
 	 * @generated
 	 */
 	public void setObject(InputPin newObject) {
-		eDynamicSet(
-			UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLEAR_ASSOCIATION_ACTION__OBJECT, newObject);
+		eDynamicSet(UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLEAR_ASSOCIATION_ACTION__OBJECT, newObject);
 	}
 
 	/**
@@ -196,11 +186,7 @@
 	 * @generated
 	 */
 	public Association getAssociation() {
-		return (Association) eDynamicGet(
-			UMLPackage.CLEAR_ASSOCIATION_ACTION__ASSOCIATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLEAR_ASSOCIATION_ACTION__ASSOCIATION, true,
-			true);
+		return (Association) eDynamicGet(UMLPackage.CLEAR_ASSOCIATION_ACTION__ASSOCIATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLEAR_ASSOCIATION_ACTION__ASSOCIATION, true, true);
 	}
 
 	/**
@@ -209,11 +195,7 @@
 	 * @generated
 	 */
 	public Association basicGetAssociation() {
-		return (Association) eDynamicGet(
-			UMLPackage.CLEAR_ASSOCIATION_ACTION__ASSOCIATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLEAR_ASSOCIATION_ACTION__ASSOCIATION, false,
-			true);
+		return (Association) eDynamicGet(UMLPackage.CLEAR_ASSOCIATION_ACTION__ASSOCIATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLEAR_ASSOCIATION_ACTION__ASSOCIATION, false, true);
 	}
 
 	/**
@@ -222,11 +204,7 @@
 	 * @generated
 	 */
 	public void setAssociation(Association newAssociation) {
-		eDynamicSet(
-			UMLPackage.CLEAR_ASSOCIATION_ACTION__ASSOCIATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLEAR_ASSOCIATION_ACTION__ASSOCIATION,
-			newAssociation);
+		eDynamicSet(UMLPackage.CLEAR_ASSOCIATION_ACTION__ASSOCIATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLEAR_ASSOCIATION_ACTION__ASSOCIATION, newAssociation);
 	}
 
 	/**
@@ -236,8 +214,7 @@
 	 */
 	public boolean validateSameType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ClearAssociationActionOperations.validateSameType(this,
-			diagnostics, context);
+		return ClearAssociationActionOperations.validateSameType(this, diagnostics, context);
 	}
 
 	/**
@@ -247,8 +224,7 @@
 	 */
 	public boolean validateMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ClearAssociationActionOperations.validateMultiplicity(this,
-			diagnostics, context);
+		return ClearAssociationActionOperations.validateMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -260,39 +236,30 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT :
-				return basicSetObject(null, msgs);
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT:
+			return basicSetObject(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -305,82 +272,82 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME :
-				return getName();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__ASSOCIATION :
-				if (resolve)
-					return getAssociation();
-				return basicGetAssociation();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT :
-				if (resolve)
-					return getObject();
-				return basicGetObject();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME:
+			return getName();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__ASSOCIATION:
+			if (resolve)
+				return getAssociation();
+			return basicGetAssociation();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT:
+			if (resolve)
+				return getObject();
+			return basicGetObject();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -394,83 +361,73 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__ASSOCIATION :
-				setAssociation((Association) newValue);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT :
-				setObject((InputPin) newValue);
-				return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__ASSOCIATION:
+			setAssociation((Association) newValue);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT:
+			setObject((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -483,63 +440,63 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__ASSOCIATION :
-				setAssociation((Association) null);
-				return;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT :
-				setObject((InputPin) null);
-				return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__ASSOCIATION:
+			setAssociation((Association) null);
+			return;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT:
+			setObject((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -552,68 +509,66 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__ASSOCIATION :
-				return basicGetAssociation() != null;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT :
-				return basicGetObject() != null;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__ASSOCIATION:
+			return basicGetAssociation() != null;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT:
+			return basicGetObject() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -628,158 +583,134 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_SAME_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSameType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION___VALIDATE_SAME_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSameType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -792,8 +723,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -803,7 +733,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT);
+				|| eIsSet(UMLPackage.CLEAR_ASSOCIATION_ACTION__OBJECT);
 	}
 
 } //ClearAssociationActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClearStructuralFeatureActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClearStructuralFeatureActionImpl.java
index 88f2c7e..e601314 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClearStructuralFeatureActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClearStructuralFeatureActionImpl.java
@@ -1,13 +1,13 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -16,6 +16,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EList;
@@ -23,6 +24,7 @@
 import org.eclipse.emf.ecore.EClass;
 
 import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -98,20 +100,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this,
-						UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTPUT,
-			OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -122,8 +117,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -131,11 +125,7 @@
 	 * @generated
 	 */
 	public OutputPin getResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT, true,
-			true);
+		return (OutputPin) eDynamicGet(UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -144,11 +134,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT, false,
-			true);
+		return (OutputPin) eDynamicGet(UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT, false, true);
 	}
 
 	/**
@@ -158,8 +144,7 @@
 	 */
 	public NotificationChain basicSetResult(OutputPin newResult,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newResult,
-			UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newResult, UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT, msgs);
 		return msgs;
 	}
 
@@ -169,11 +154,7 @@
 	 * @generated
 	 */
 	public void setResult(OutputPin newResult) {
-		eDynamicSet(
-			UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT,
-			newResult);
+		eDynamicSet(UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT, newResult);
 	}
 
 	/**
@@ -182,8 +163,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setResult(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -199,8 +179,7 @@
 	 */
 	public boolean validateTypeOfResult(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ClearStructuralFeatureActionOperations.validateTypeOfResult(this,
-			diagnostics, context);
+		return ClearStructuralFeatureActionOperations.validateTypeOfResult(this, diagnostics, context);
 	}
 
 	/**
@@ -210,8 +189,7 @@
 	 */
 	public boolean validateMultiplicityOfResult(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ClearStructuralFeatureActionOperations
-			.validateMultiplicityOfResult(this, diagnostics, context);
+		return ClearStructuralFeatureActionOperations.validateMultiplicityOfResult(this, diagnostics, context);
 	}
 
 	/**
@@ -223,41 +201,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OBJECT :
-				return basicSetObject(null, msgs);
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT :
-				return basicSetResult(null, msgs);
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OBJECT:
+			return basicSetObject(null, msgs);
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT:
+			return basicSetResult(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -270,86 +239,86 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME :
-				return getName();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OBJECT :
-				if (resolve)
-					return getObject();
-				return basicGetObject();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				if (resolve)
-					return getStructuralFeature();
-				return basicGetStructuralFeature();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME:
+			return getName();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OBJECT:
+			if (resolve)
+				return getObject();
+			return basicGetObject();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			if (resolve)
+				return getStructuralFeature();
+			return basicGetStructuralFeature();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -363,86 +332,76 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OBJECT :
-				setObject((InputPin) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				setStructuralFeature((StructuralFeature) newValue);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OBJECT:
+			setObject((InputPin) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			setStructuralFeature((StructuralFeature) newValue);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -455,66 +414,66 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OBJECT :
-				setObject((InputPin) null);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				setStructuralFeature((StructuralFeature) null);
-				return;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OBJECT:
+			setObject((InputPin) null);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			setStructuralFeature((StructuralFeature) null);
+			return;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -527,70 +486,68 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OBJECT :
-				return basicGetObject() != null;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				return basicGetStructuralFeature() != null;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT :
-				return basicGetResult() != null;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__OBJECT:
+			return basicGetObject() != null;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			return basicGetStructuralFeature() != null;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT:
+			return basicGetResult() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -605,175 +562,144 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_OBJECT_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateObjectType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateVisibility((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP :
-				return validateNotStatic((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_ONE_FEATURING_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateOneFeaturingClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_TYPE_OF_RESULT__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfResult((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_MULTIPLICITY_OF_RESULT__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfResult(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_OBJECT_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateObjectType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP:
+			return validateNotStatic((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_ONE_FEATURING_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateOneFeaturingClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_TYPE_OF_RESULT__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfResult((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION___VALIDATE_MULTIPLICITY_OF_RESULT__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfResult((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -786,7 +712,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT);
+				|| eIsSet(UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION__RESULT);
 	}
 
 } //ClearStructuralFeatureActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClearVariableActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClearVariableActionImpl.java
index 173d037..d22da6a 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClearVariableActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ClearVariableActionImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CollaborationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CollaborationImpl.java
index bff70aa..189c2cb 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CollaborationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CollaborationImpl.java
@@ -1,34 +1,47 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
+
 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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectContainmentEList;
+
 import org.eclipse.uml2.uml.AggregationKind;
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.BehavioredClassifier;
@@ -62,6 +75,7 @@
 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;
 
 /**
@@ -106,17 +120,9 @@
 		return UMLPackage.Literals.COLLABORATION;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR) {
 			return createOwnedBehaviorsList();
 		}
@@ -135,20 +141,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.COLLABORATION__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.COLLABORATION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.COLLABORATION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.COLLABORATION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -159,18 +158,9 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.COLLABORATION__OWNED_COMMENT,
-		UMLPackage.COLLABORATION__NAME_EXPRESSION,
-		UMLPackage.COLLABORATION__ELEMENT_IMPORT,
-		UMLPackage.COLLABORATION__PACKAGE_IMPORT,
-		UMLPackage.COLLABORATION__OWNED_MEMBER,
-		UMLPackage.COLLABORATION__TEMPLATE_BINDING,
-		UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE,
-		UMLPackage.COLLABORATION__COLLABORATION_USE,
-		UMLPackage.COLLABORATION__GENERALIZATION,
-		UMLPackage.COLLABORATION__SUBSTITUTION,
-		UMLPackage.COLLABORATION__INTERFACE_REALIZATION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.COLLABORATION__OWNED_COMMENT, UMLPackage.COLLABORATION__NAME_EXPRESSION, UMLPackage.COLLABORATION__ELEMENT_IMPORT, UMLPackage.COLLABORATION__PACKAGE_IMPORT,
+			UMLPackage.COLLABORATION__OWNED_MEMBER, UMLPackage.COLLABORATION__TEMPLATE_BINDING, UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE, UMLPackage.COLLABORATION__COLLABORATION_USE, UMLPackage.COLLABORATION__GENERALIZATION,
+			UMLPackage.COLLABORATION__SUBSTITUTION, UMLPackage.COLLABORATION__INTERFACE_REALIZATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -183,21 +173,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<ConnectableElement> roles = (EList<ConnectableElement>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.STRUCTURED_CLASSIFIER__ROLE);
+			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<ConnectableElement>(
-						ConnectableElement.class, this,
-						UMLPackage.COLLABORATION__ROLE, ROLE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.STRUCTURED_CLASSIFIER__ROLE, roles = new DerivedUnionEObjectEList<ConnectableElement>(ConnectableElement.class, this, UMLPackage.COLLABORATION__ROLE, ROLE_ESUBSETS));
 			}
 			return roles;
 		}
-		return new DerivedUnionEObjectEList<ConnectableElement>(
-			ConnectableElement.class, this, UMLPackage.COLLABORATION__ROLE,
-			ROLE_ESUBSETS);
+		return new DerivedUnionEObjectEList<ConnectableElement>(ConnectableElement.class, this, UMLPackage.COLLABORATION__ROLE, ROLE_ESUBSETS);
 	}
 
 	/**
@@ -211,54 +193,45 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.COLLABORATION__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.COLLABORATION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.COLLABORATION__OWNED_MEMBER,
-			OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.COLLABORATION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
 	 * The array of superset feature identifiers for the '{@link #getParts() <em>Part</em>}' reference list.
 	 * @see #getParts()
 	 */
-	protected static final int[] PART_ESUPERSETS = new int[]{
-		UMLPackage.COLLABORATION__OWNED_ATTRIBUTE};
+	protected static final int[] PART_ESUPERSETS = new int[] {
+			UMLPackage.COLLABORATION__OWNED_ATTRIBUTE };
 
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
-	@Override
 	public EList<Property> getParts() {
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<Property> parts = (EList<Property>) cache.get(eResource, this,
-				UMLPackage.Literals.STRUCTURED_CLASSIFIER__PART);
+					UMLPackage.Literals.STRUCTURED_CLASSIFIER__PART);
 			if (parts == null) {
 				cache.put(eResource, this,
-					UMLPackage.Literals.STRUCTURED_CLASSIFIER__PART,
-					parts = new StructuredClassifierImpl.PartEList(
-						Property.class, this, UMLPackage.COLLABORATION__PART,
-						PART_ESUPERSETS));
+						UMLPackage.Literals.STRUCTURED_CLASSIFIER__PART,
+						parts = new StructuredClassifierImpl.PartEList(
+								Property.class, this, UMLPackage.COLLABORATION__PART,
+								PART_ESUPERSETS));
 			}
 			return parts;
 		}
 		return new StructuredClassifierImpl.PartEList(Property.class, this,
-			UMLPackage.COLLABORATION__PART, PART_ESUPERSETS);
+				UMLPackage.COLLABORATION__PART, PART_ESUPERSETS);
 	}
 
 	/**
@@ -268,10 +241,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ConnectableElement> getCollaborationRoles() {
-		return (EList<ConnectableElement>) eDynamicGet(
-			UMLPackage.COLLABORATION__COLLABORATION_ROLE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COLLABORATION__COLLABORATION_ROLE, true, true);
+		return (EList<ConnectableElement>) eDynamicGet(UMLPackage.COLLABORATION__COLLABORATION_ROLE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COLLABORATION__COLLABORATION_ROLE, true, true);
 	}
 
 	/**
@@ -290,12 +260,10 @@
 	 */
 	public ConnectableElement getCollaborationRole(String name, Type type,
 			boolean ignoreCase, EClass eClass) {
-		collaborationRoleLoop : for (ConnectableElement collaborationRole : getCollaborationRoles()) {
+		collaborationRoleLoop: for (ConnectableElement collaborationRole : getCollaborationRoles()) {
 			if (eClass != null && !eClass.isInstance(collaborationRole))
 				continue collaborationRoleLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(collaborationRole.getName())
-				: name.equals(collaborationRole.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(collaborationRole.getName()) : name.equals(collaborationRole.getName())))
 				continue collaborationRoleLoop;
 			if (type != null && !type.equals(collaborationRole.getType()))
 				continue collaborationRoleLoop;
@@ -311,8 +279,7 @@
 	 */
 	public boolean validateClassBehavior(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return BehavioredClassifierOperations.validateClassBehavior(this,
-			diagnostics, context);
+		return BehavioredClassifierOperations.validateClassBehavior(this, diagnostics, context);
 	}
 
 	/**
@@ -324,13 +291,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES,
-					result = BehavioredClassifierOperations
-						.getAllImplementedInterfaces(this));
+				cache.put(this, UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES, result = BehavioredClassifierOperations.getAllImplementedInterfaces(this));
 			}
 			return result;
 		}
@@ -346,13 +309,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES,
-					result = BehavioredClassifierOperations
-						.getImplementedInterfaces(this));
+				cache.put(this, UMLPackage.Literals.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES, result = BehavioredClassifierOperations.getImplementedInterfaces(this));
 			}
 			return result;
 		}
@@ -369,59 +328,40 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.COLLABORATION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.COLLABORATION__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.COLLABORATION__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.COLLABORATION__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__INTERFACE_REALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.COLLABORATION__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.COLLABORATION__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.COLLABORATION__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__INTERFACE_REALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -435,62 +375,46 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.COLLABORATION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.COLLABORATION__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.COLLABORATION__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.COLLABORATION__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__OWNED_CONNECTOR :
-				return ((InternalEList<?>) getOwnedConnectors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__INTERFACE_REALIZATION :
-				return ((InternalEList<?>) getInterfaceRealizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COLLABORATION__OWNED_BEHAVIOR :
-				return ((InternalEList<?>) getOwnedBehaviors())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.COLLABORATION__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.COLLABORATION__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__OWNED_CONNECTOR:
+			return ((InternalEList<?>) getOwnedConnectors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__INTERFACE_REALIZATION:
+			return ((InternalEList<?>) getInterfaceRealizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION__OWNED_BEHAVIOR:
+			return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -503,116 +427,116 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.COLLABORATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.COLLABORATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.COLLABORATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.COLLABORATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.COLLABORATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.COLLABORATION__NAME :
-				return getName();
-			case UMLPackage.COLLABORATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.COLLABORATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.COLLABORATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.COLLABORATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.COLLABORATION__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.COLLABORATION__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.COLLABORATION__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.COLLABORATION__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.COLLABORATION__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.COLLABORATION__MEMBER :
-				return getMembers();
-			case UMLPackage.COLLABORATION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.COLLABORATION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.COLLABORATION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.COLLABORATION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.COLLABORATION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.COLLABORATION__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.COLLABORATION__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.COLLABORATION__FEATURE :
-				return getFeatures();
-			case UMLPackage.COLLABORATION__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.COLLABORATION__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.COLLABORATION__GENERAL :
-				return getGenerals();
-			case UMLPackage.COLLABORATION__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.COLLABORATION__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.COLLABORATION__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.COLLABORATION__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.COLLABORATION__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.COLLABORATION__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.COLLABORATION__USE_CASE :
-				return getUseCases();
-			case UMLPackage.COLLABORATION__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.COLLABORATION__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.COLLABORATION__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.COLLABORATION__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.COLLABORATION__OWNED_CONNECTOR :
-				return getOwnedConnectors();
-			case UMLPackage.COLLABORATION__PART :
-				return getParts();
-			case UMLPackage.COLLABORATION__ROLE :
-				return getRoles();
-			case UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR :
-				if (resolve)
-					return getClassifierBehavior();
-				return basicGetClassifierBehavior();
-			case UMLPackage.COLLABORATION__INTERFACE_REALIZATION :
-				return getInterfaceRealizations();
-			case UMLPackage.COLLABORATION__OWNED_BEHAVIOR :
-				return getOwnedBehaviors();
-			case UMLPackage.COLLABORATION__COLLABORATION_ROLE :
-				return getCollaborationRoles();
+		case UMLPackage.COLLABORATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.COLLABORATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.COLLABORATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.COLLABORATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.COLLABORATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.COLLABORATION__NAME:
+			return getName();
+		case UMLPackage.COLLABORATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.COLLABORATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.COLLABORATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.COLLABORATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.COLLABORATION__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.COLLABORATION__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.COLLABORATION__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.COLLABORATION__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.COLLABORATION__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.COLLABORATION__MEMBER:
+			return getMembers();
+		case UMLPackage.COLLABORATION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.COLLABORATION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.COLLABORATION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.COLLABORATION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.COLLABORATION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.COLLABORATION__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.COLLABORATION__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.COLLABORATION__FEATURE:
+			return getFeatures();
+		case UMLPackage.COLLABORATION__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.COLLABORATION__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.COLLABORATION__GENERAL:
+			return getGenerals();
+		case UMLPackage.COLLABORATION__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.COLLABORATION__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.COLLABORATION__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.COLLABORATION__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.COLLABORATION__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.COLLABORATION__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.COLLABORATION__USE_CASE:
+			return getUseCases();
+		case UMLPackage.COLLABORATION__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.COLLABORATION__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.COLLABORATION__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.COLLABORATION__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.COLLABORATION__OWNED_CONNECTOR:
+			return getOwnedConnectors();
+		case UMLPackage.COLLABORATION__PART:
+			return getParts();
+		case UMLPackage.COLLABORATION__ROLE:
+			return getRoles();
+		case UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR:
+			if (resolve)
+				return getClassifierBehavior();
+			return basicGetClassifierBehavior();
+		case UMLPackage.COLLABORATION__INTERFACE_REALIZATION:
+			return getInterfaceRealizations();
+		case UMLPackage.COLLABORATION__OWNED_BEHAVIOR:
+			return getOwnedBehaviors();
+		case UMLPackage.COLLABORATION__COLLABORATION_ROLE:
+			return getCollaborationRoles();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -626,136 +550,118 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.COLLABORATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.COLLABORATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.COLLABORATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.COLLABORATION__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.COLLABORATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.COLLABORATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.COLLABORATION__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.COLLABORATION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.COLLABORATION__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.COLLABORATION__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.COLLABORATION__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.COLLABORATION__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				getOwnedConnectors()
-					.addAll((Collection<? extends Connector>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) newValue);
-				return;
-			case UMLPackage.COLLABORATION__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll(
-					(Collection<? extends InterfaceRealization>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				getOwnedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.COLLABORATION__COLLABORATION_ROLE :
-				getCollaborationRoles().clear();
-				getCollaborationRoles().addAll(
-					(Collection<? extends ConnectableElement>) newValue);
-				return;
+		case UMLPackage.COLLABORATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.COLLABORATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.COLLABORATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.COLLABORATION__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.COLLABORATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.COLLABORATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.COLLABORATION__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.COLLABORATION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.COLLABORATION__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.COLLABORATION__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.COLLABORATION__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.COLLABORATION__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			getOwnedConnectors().addAll((Collection<? extends Connector>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) newValue);
+			return;
+		case UMLPackage.COLLABORATION__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			getInterfaceRealizations().addAll((Collection<? extends InterfaceRealization>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			getOwnedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.COLLABORATION__COLLABORATION_ROLE:
+			getCollaborationRoles().clear();
+			getCollaborationRoles().addAll((Collection<? extends ConnectableElement>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -768,99 +674,99 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.COLLABORATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.COLLABORATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.COLLABORATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.COLLABORATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.COLLABORATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.COLLABORATION__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.COLLABORATION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.COLLABORATION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.COLLABORATION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.COLLABORATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.COLLABORATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.COLLABORATION__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.COLLABORATION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.COLLABORATION__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.COLLABORATION__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.COLLABORATION__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.COLLABORATION__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.COLLABORATION__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.COLLABORATION__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.COLLABORATION__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.COLLABORATION__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.COLLABORATION__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.COLLABORATION__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.COLLABORATION__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.COLLABORATION__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.COLLABORATION__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				return;
-			case UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) null);
-				return;
-			case UMLPackage.COLLABORATION__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				return;
-			case UMLPackage.COLLABORATION__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				return;
-			case UMLPackage.COLLABORATION__COLLABORATION_ROLE :
-				getCollaborationRoles().clear();
-				return;
+		case UMLPackage.COLLABORATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.COLLABORATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.COLLABORATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.COLLABORATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.COLLABORATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.COLLABORATION__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.COLLABORATION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.COLLABORATION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.COLLABORATION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.COLLABORATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.COLLABORATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.COLLABORATION__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.COLLABORATION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.COLLABORATION__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.COLLABORATION__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.COLLABORATION__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.COLLABORATION__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.COLLABORATION__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.COLLABORATION__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.COLLABORATION__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.COLLABORATION__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.COLLABORATION__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.COLLABORATION__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.COLLABORATION__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.COLLABORATION__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.COLLABORATION__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			return;
+		case UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) null);
+			return;
+		case UMLPackage.COLLABORATION__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			return;
+		case UMLPackage.COLLABORATION__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			return;
+		case UMLPackage.COLLABORATION__COLLABORATION_ROLE:
+			getCollaborationRoles().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -873,100 +779,98 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.COLLABORATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.COLLABORATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.COLLABORATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.COLLABORATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.COLLABORATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.COLLABORATION__NAME :
-				return isSetName();
-			case UMLPackage.COLLABORATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.COLLABORATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.COLLABORATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.COLLABORATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.COLLABORATION__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.COLLABORATION__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.COLLABORATION__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.COLLABORATION__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.COLLABORATION__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.COLLABORATION__MEMBER :
-				return isSetMembers();
-			case UMLPackage.COLLABORATION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.COLLABORATION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.COLLABORATION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.COLLABORATION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.COLLABORATION__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.COLLABORATION__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.COLLABORATION__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.COLLABORATION__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.COLLABORATION__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.COLLABORATION__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.COLLABORATION__GENERAL :
-				return !getGenerals().isEmpty();
-			case UMLPackage.COLLABORATION__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.COLLABORATION__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.COLLABORATION__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.COLLABORATION__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.COLLABORATION__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.COLLABORATION__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.COLLABORATION__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.COLLABORATION__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.COLLABORATION__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.COLLABORATION__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.COLLABORATION__OWNED_ATTRIBUTE :
-				return !getOwnedAttributes().isEmpty();
-			case UMLPackage.COLLABORATION__OWNED_CONNECTOR :
-				return !getOwnedConnectors().isEmpty();
-			case UMLPackage.COLLABORATION__PART :
-				return !getParts().isEmpty();
-			case UMLPackage.COLLABORATION__ROLE :
-				return isSetRoles();
-			case UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR :
-				return basicGetClassifierBehavior() != null;
-			case UMLPackage.COLLABORATION__INTERFACE_REALIZATION :
-				return !getInterfaceRealizations().isEmpty();
-			case UMLPackage.COLLABORATION__OWNED_BEHAVIOR :
-				return !getOwnedBehaviors().isEmpty();
-			case UMLPackage.COLLABORATION__COLLABORATION_ROLE :
-				return !getCollaborationRoles().isEmpty();
+		case UMLPackage.COLLABORATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.COLLABORATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.COLLABORATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.COLLABORATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.COLLABORATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.COLLABORATION__NAME:
+			return isSetName();
+		case UMLPackage.COLLABORATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.COLLABORATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.COLLABORATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.COLLABORATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.COLLABORATION__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.COLLABORATION__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.COLLABORATION__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.COLLABORATION__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.COLLABORATION__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.COLLABORATION__MEMBER:
+			return isSetMembers();
+		case UMLPackage.COLLABORATION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.COLLABORATION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.COLLABORATION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.COLLABORATION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.COLLABORATION__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.COLLABORATION__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.COLLABORATION__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.COLLABORATION__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.COLLABORATION__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.COLLABORATION__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.COLLABORATION__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.COLLABORATION__GENERAL:
+			return !getGenerals().isEmpty();
+		case UMLPackage.COLLABORATION__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.COLLABORATION__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.COLLABORATION__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.COLLABORATION__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.COLLABORATION__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.COLLABORATION__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.COLLABORATION__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.COLLABORATION__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.COLLABORATION__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.COLLABORATION__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.COLLABORATION__OWNED_ATTRIBUTE:
+			return !getOwnedAttributes().isEmpty();
+		case UMLPackage.COLLABORATION__OWNED_CONNECTOR:
+			return !getOwnedConnectors().isEmpty();
+		case UMLPackage.COLLABORATION__PART:
+			return !getParts().isEmpty();
+		case UMLPackage.COLLABORATION__ROLE:
+			return isSetRoles();
+		case UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR:
+			return basicGetClassifierBehavior() != null;
+		case UMLPackage.COLLABORATION__INTERFACE_REALIZATION:
+			return !getInterfaceRealizations().isEmpty();
+		case UMLPackage.COLLABORATION__OWNED_BEHAVIOR:
+			return !getOwnedBehaviors().isEmpty();
+		case UMLPackage.COLLABORATION__COLLABORATION_ROLE:
+			return !getCollaborationRoles().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -981,14 +885,14 @@
 			Class<?> baseClass) {
 		if (baseClass == BehavioredClassifier.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR :
-					return UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR;
-				case UMLPackage.COLLABORATION__INTERFACE_REALIZATION :
-					return UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION;
-				case UMLPackage.COLLABORATION__OWNED_BEHAVIOR :
-					return UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR;
-				default :
-					return -1;
+			case UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR:
+				return UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR;
+			case UMLPackage.COLLABORATION__INTERFACE_REALIZATION:
+				return UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION;
+			case UMLPackage.COLLABORATION__OWNED_BEHAVIOR:
+				return UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -1004,14 +908,14 @@
 			Class<?> baseClass) {
 		if (baseClass == BehavioredClassifier.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR :
-					return UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR;
-				case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION :
-					return UMLPackage.COLLABORATION__INTERFACE_REALIZATION;
-				case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR :
-					return UMLPackage.COLLABORATION__OWNED_BEHAVIOR;
-				default :
-					return -1;
+			case UMLPackage.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR:
+				return UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR;
+			case UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION:
+				return UMLPackage.COLLABORATION__INTERFACE_REALIZATION;
+			case UMLPackage.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR:
+				return UMLPackage.COLLABORATION__OWNED_BEHAVIOR;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1026,14 +930,14 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == BehavioredClassifier.class) {
 			switch (baseOperationID) {
-				case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.COLLABORATION___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES :
-					return UMLPackage.COLLABORATION___GET_ALL_IMPLEMENTED_INTERFACES;
-				case UMLPackage.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES :
-					return UMLPackage.COLLABORATION___GET_IMPLEMENTED_INTERFACES;
-				default :
-					return -1;
+			case UMLPackage.BEHAVIORED_CLASSIFIER___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.COLLABORATION___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_ALL_IMPLEMENTED_INTERFACES:
+				return UMLPackage.COLLABORATION___GET_ALL_IMPLEMENTED_INTERFACES;
+			case UMLPackage.BEHAVIORED_CLASSIFIER___GET_IMPLEMENTED_INTERFACES:
+				return UMLPackage.COLLABORATION___GET_IMPLEMENTED_INTERFACES;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -1049,287 +953,229 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.COLLABORATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.COLLABORATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.COLLABORATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.COLLABORATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.COLLABORATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.COLLABORATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.COLLABORATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.COLLABORATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.COLLABORATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.COLLABORATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.COLLABORATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.COLLABORATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.COLLABORATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.COLLABORATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.COLLABORATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.COLLABORATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.COLLABORATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.COLLABORATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.COLLABORATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.COLLABORATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.COLLABORATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.COLLABORATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.COLLABORATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.COLLABORATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.COLLABORATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.COLLABORATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.COLLABORATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.COLLABORATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.COLLABORATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.COLLABORATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.COLLABORATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.COLLABORATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.COLLABORATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.COLLABORATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.COLLABORATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.COLLABORATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.COLLABORATION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.COLLABORATION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.COLLABORATION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.COLLABORATION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.COLLABORATION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.COLLABORATION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.COLLABORATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.COLLABORATION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.COLLABORATION___SEPARATOR :
-				return separator();
-			case UMLPackage.COLLABORATION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.COLLABORATION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.COLLABORATION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.COLLABORATION___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.COLLABORATION___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.COLLABORATION___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.COLLABORATION___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.COLLABORATION___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.COLLABORATION___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.COLLABORATION___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.COLLABORATION___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.COLLABORATION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.COLLABORATION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.COLLABORATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.COLLABORATION___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.COLLABORATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.COLLABORATION___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.COLLABORATION___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.COLLABORATION___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.COLLABORATION___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.COLLABORATION___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.COLLABORATION___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.COLLABORATION___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.COLLABORATION___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.COLLABORATION___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.COLLABORATION___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.COLLABORATION___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.COLLABORATION___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.COLLABORATION___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.COLLABORATION___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.COLLABORATION___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.COLLABORATION___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.COLLABORATION___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.COLLABORATION___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.COLLABORATION___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.COLLABORATION___PARENTS :
-				return parents();
-			case UMLPackage.COLLABORATION___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.COLLABORATION___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.COLLABORATION___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.COLLABORATION___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.COLLABORATION___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.COLLABORATION___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.COLLABORATION___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.COLLABORATION___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.COLLABORATION___GET_PARTS :
-				return getParts();
-			case UMLPackage.COLLABORATION___ALL_ROLES :
-				return allRoles();
-			case UMLPackage.COLLABORATION___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateClassBehavior((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION___GET_ALL_IMPLEMENTED_INTERFACES :
-				return getAllImplementedInterfaces();
-			case UMLPackage.COLLABORATION___GET_IMPLEMENTED_INTERFACES :
-				return getImplementedInterfaces();
+		case UMLPackage.COLLABORATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.COLLABORATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.COLLABORATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.COLLABORATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.COLLABORATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.COLLABORATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.COLLABORATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.COLLABORATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.COLLABORATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.COLLABORATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.COLLABORATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.COLLABORATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.COLLABORATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.COLLABORATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.COLLABORATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.COLLABORATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.COLLABORATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.COLLABORATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.COLLABORATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.COLLABORATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.COLLABORATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.COLLABORATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.COLLABORATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.COLLABORATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.COLLABORATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.COLLABORATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.COLLABORATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.COLLABORATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.COLLABORATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.COLLABORATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.COLLABORATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.COLLABORATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.COLLABORATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.COLLABORATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.COLLABORATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.COLLABORATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.COLLABORATION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.COLLABORATION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.COLLABORATION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.COLLABORATION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.COLLABORATION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.COLLABORATION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.COLLABORATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.COLLABORATION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.COLLABORATION___SEPARATOR:
+			return separator();
+		case UMLPackage.COLLABORATION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.COLLABORATION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.COLLABORATION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.COLLABORATION___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.COLLABORATION___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.COLLABORATION___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.COLLABORATION___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.COLLABORATION___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.COLLABORATION___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.COLLABORATION___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.COLLABORATION___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.COLLABORATION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.COLLABORATION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.COLLABORATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.COLLABORATION___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.COLLABORATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.COLLABORATION___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.COLLABORATION___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.COLLABORATION___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.COLLABORATION___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.COLLABORATION___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.COLLABORATION___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.COLLABORATION___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.COLLABORATION___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.COLLABORATION___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.COLLABORATION___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.COLLABORATION___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.COLLABORATION___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.COLLABORATION___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.COLLABORATION___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.COLLABORATION___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.COLLABORATION___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.COLLABORATION___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.COLLABORATION___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.COLLABORATION___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.COLLABORATION___PARENTS:
+			return parents();
+		case UMLPackage.COLLABORATION___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.COLLABORATION___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.COLLABORATION___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.COLLABORATION___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.COLLABORATION___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.COLLABORATION___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.COLLABORATION___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.COLLABORATION___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.COLLABORATION___GET_PARTS:
+			return getParts();
+		case UMLPackage.COLLABORATION___ALL_ROLES:
+			return allRoles();
+		case UMLPackage.COLLABORATION___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateClassBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION___GET_ALL_IMPLEMENTED_INTERFACES:
+			return getAllImplementedInterfaces();
+		case UMLPackage.COLLABORATION___GET_IMPLEMENTED_INTERFACES:
+			return getImplementedInterfaces();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1342,7 +1188,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.COLLABORATION__INTERFACE_REALIZATION);
+				|| eIsSet(UMLPackage.COLLABORATION__INTERFACE_REALIZATION);
 	}
 
 	/**
@@ -1353,12 +1199,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.COLLABORATION__OWNED_RULE,
-		UMLPackage.COLLABORATION__OWNED_USE_CASE,
-		UMLPackage.COLLABORATION__OWNED_ATTRIBUTE,
-		UMLPackage.COLLABORATION__OWNED_CONNECTOR,
-		UMLPackage.COLLABORATION__OWNED_BEHAVIOR};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.COLLABORATION__OWNED_RULE, UMLPackage.COLLABORATION__OWNED_USE_CASE, UMLPackage.COLLABORATION__OWNED_ATTRIBUTE, UMLPackage.COLLABORATION__OWNED_CONNECTOR,
+			UMLPackage.COLLABORATION__OWNED_BEHAVIOR };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1367,16 +1209,13 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Behavior> getOwnedBehaviors() {
-		return (EList<Behavior>) eDynamicGet(
-			UMLPackage.COLLABORATION__OWNED_BEHAVIOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR, true,
-			true);
+		return (EList<Behavior>) eDynamicGet(UMLPackage.COLLABORATION__OWNED_BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORED_CLASSIFIER__OWNED_BEHAVIOR, true, true);
 	}
 
 	private EList<Behavior> createOwnedBehaviorsList() {
 		return new SubsetSupersetEObjectContainmentEList.Resolving<Behavior>(
-			Behavior.class, this, UMLPackage.COLLABORATION__OWNED_BEHAVIOR,
-			null, OWNED_BEHAVIOR_ESUBSETS);
+				Behavior.class, this, UMLPackage.COLLABORATION__OWNED_BEHAVIOR,
+				null, OWNED_BEHAVIOR_ESUBSETS);
 	}
 
 	/**
@@ -1387,8 +1226,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_BEHAVIOR_ESUBSETS = new int[]{
-		UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR};
+	protected static final int[] OWNED_BEHAVIOR_ESUBSETS = new int[] { UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1419,18 +1257,14 @@
 	 */
 	public Behavior getOwnedBehavior(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		ownedBehaviorLoop : for (Behavior ownedBehavior : getOwnedBehaviors()) {
+		ownedBehaviorLoop: for (Behavior ownedBehavior : getOwnedBehaviors()) {
 			if (eClass != null && !eClass.isInstance(ownedBehavior))
 				continue ownedBehaviorLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedBehavior.getName())
-				: name.equals(ownedBehavior.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedBehavior.getName()) : name.equals(ownedBehavior.getName())))
 				continue ownedBehaviorLoop;
 			return ownedBehavior;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedBehavior(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedBehavior(name, eClass) : null;
 	}
 
 	/**
@@ -1439,11 +1273,7 @@
 	 * @generated
 	 */
 	public Behavior getClassifierBehavior() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR,
-			true, true);
+		return (Behavior) eDynamicGet(UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR, true, true);
 	}
 
 	/**
@@ -1452,11 +1282,7 @@
 	 * @generated
 	 */
 	public Behavior basicGetClassifierBehavior() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR,
-			false, true);
+		return (Behavior) eDynamicGet(UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR, false, true);
 	}
 
 	/**
@@ -1465,11 +1291,7 @@
 	 * @generated
 	 */
 	public void setClassifierBehavior(Behavior newClassifierBehavior) {
-		eDynamicSet(
-			UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR,
-			newClassifierBehavior);
+		eDynamicSet(UMLPackage.COLLABORATION__CLASSIFIER_BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORED_CLASSIFIER__CLASSIFIER_BEHAVIOR, newClassifierBehavior);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newClassifierBehavior != null) {
@@ -1501,11 +1323,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<InterfaceRealization> getInterfaceRealizations() {
-		return (EList<InterfaceRealization>) eDynamicGet(
-			UMLPackage.COLLABORATION__INTERFACE_REALIZATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION,
-			true, true);
+		return (EList<InterfaceRealization>) eDynamicGet(UMLPackage.COLLABORATION__INTERFACE_REALIZATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION, true, true);
 	}
 
 	/**
@@ -1515,8 +1333,7 @@
 	 */
 	public InterfaceRealization createInterfaceRealization(String name,
 			Interface contract) {
-		InterfaceRealization newInterfaceRealization = (InterfaceRealization) create(
-			UMLPackage.Literals.INTERFACE_REALIZATION);
+		InterfaceRealization newInterfaceRealization = (InterfaceRealization) create(UMLPackage.Literals.INTERFACE_REALIZATION);
 		getInterfaceRealizations().add(newInterfaceRealization);
 		if (name != null)
 			newInterfaceRealization.setName(name);
@@ -1542,19 +1359,14 @@
 	 */
 	public InterfaceRealization getInterfaceRealization(String name,
 			Interface contract, boolean ignoreCase, boolean createOnDemand) {
-		interfaceRealizationLoop : for (InterfaceRealization interfaceRealization : getInterfaceRealizations()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(interfaceRealization.getName())
-				: name.equals(interfaceRealization.getName())))
+		interfaceRealizationLoop: for (InterfaceRealization interfaceRealization : getInterfaceRealizations()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(interfaceRealization.getName()) : name.equals(interfaceRealization.getName())))
 				continue interfaceRealizationLoop;
-			if (contract != null
-				&& !contract.equals(interfaceRealization.getContract()))
+			if (contract != null && !contract.equals(interfaceRealization.getContract()))
 				continue interfaceRealizationLoop;
 			return interfaceRealization;
 		}
-		return createOnDemand
-			? createInterfaceRealization(name, contract)
-			: null;
+		return createOnDemand ? createInterfaceRealization(name, contract) : null;
 	}
 
 	/**
@@ -1565,9 +1377,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] ROLE_ESUBSETS = new int[]{
-		UMLPackage.COLLABORATION__OWNED_ATTRIBUTE,
-		UMLPackage.COLLABORATION__COLLABORATION_ROLE};
+	protected static final int[] ROLE_ESUBSETS = new int[] { UMLPackage.COLLABORATION__OWNED_ATTRIBUTE, UMLPackage.COLLABORATION__COLLABORATION_ROLE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1577,7 +1387,7 @@
 	@Override
 	public boolean isSetRoles() {
 		return super.isSetRoles()
-			|| eIsSet(UMLPackage.COLLABORATION__COLLABORATION_ROLE);
+				|| eIsSet(UMLPackage.COLLABORATION__COLLABORATION_ROLE);
 	}
 
 	/**
@@ -1588,7 +1398,7 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.COLLABORATION__OWNED_BEHAVIOR);
+				|| eIsSet(UMLPackage.COLLABORATION__OWNED_BEHAVIOR);
 	}
 
 } //CollaborationImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CollaborationUseImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CollaborationUseImpl.java
index 5b224d5..728aacd 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CollaborationUseImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CollaborationUseImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,8 +28,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -97,21 +101,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.COLLABORATION_USE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.COLLABORATION_USE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.COLLABORATION_USE__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.COLLABORATION_USE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -120,9 +116,7 @@
 	 * @generated
 	 */
 	public Collaboration getType() {
-		return (Collaboration) eDynamicGet(
-			UMLPackage.COLLABORATION_USE__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COLLABORATION_USE__TYPE, true, true);
+		return (Collaboration) eDynamicGet(UMLPackage.COLLABORATION_USE__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COLLABORATION_USE__TYPE, true, true);
 	}
 
 	/**
@@ -131,9 +125,7 @@
 	 * @generated
 	 */
 	public Collaboration basicGetType() {
-		return (Collaboration) eDynamicGet(
-			UMLPackage.COLLABORATION_USE__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COLLABORATION_USE__TYPE, false, true);
+		return (Collaboration) eDynamicGet(UMLPackage.COLLABORATION_USE__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COLLABORATION_USE__TYPE, false, true);
 	}
 
 	/**
@@ -142,8 +134,7 @@
 	 * @generated
 	 */
 	public void setType(Collaboration newType) {
-		eDynamicSet(UMLPackage.COLLABORATION_USE__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COLLABORATION_USE__TYPE, newType);
+		eDynamicSet(UMLPackage.COLLABORATION_USE__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COLLABORATION_USE__TYPE, newType);
 	}
 
 	/**
@@ -153,9 +144,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Dependency> getRoleBindings() {
-		return (EList<Dependency>) eDynamicGet(
-			UMLPackage.COLLABORATION_USE__ROLE_BINDING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COLLABORATION_USE__ROLE_BINDING, true, true);
+		return (EList<Dependency>) eDynamicGet(UMLPackage.COLLABORATION_USE__ROLE_BINDING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COLLABORATION_USE__ROLE_BINDING, true, true);
 	}
 
 	/**
@@ -196,18 +185,14 @@
 	 */
 	public Dependency getRoleBinding(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		roleBindingLoop : for (Dependency roleBinding : getRoleBindings()) {
+		roleBindingLoop: for (Dependency roleBinding : getRoleBindings()) {
 			if (eClass != null && !eClass.isInstance(roleBinding))
 				continue roleBindingLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(roleBinding.getName())
-				: name.equals(roleBinding.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(roleBinding.getName()) : name.equals(roleBinding.getName())))
 				continue roleBindingLoop;
 			return roleBinding;
 		}
-		return createOnDemand && eClass != null
-			? createRoleBinding(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createRoleBinding(name, eClass) : null;
 	}
 
 	/**
@@ -217,8 +202,7 @@
 	 */
 	public boolean validateClientElements(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CollaborationUseOperations.validateClientElements(this,
-			diagnostics, context);
+		return CollaborationUseOperations.validateClientElements(this, diagnostics, context);
 	}
 
 	/**
@@ -228,8 +212,7 @@
 	 */
 	public boolean validateEveryRole(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CollaborationUseOperations.validateEveryRole(this, diagnostics,
-			context);
+		return CollaborationUseOperations.validateEveryRole(this, diagnostics, context);
 	}
 
 	/**
@@ -239,8 +222,7 @@
 	 */
 	public boolean validateConnectors(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CollaborationUseOperations.validateConnectors(this, diagnostics,
-			context);
+		return CollaborationUseOperations.validateConnectors(this, diagnostics, context);
 	}
 
 	/**
@@ -252,17 +234,14 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.COLLABORATION_USE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COLLABORATION_USE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COLLABORATION_USE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.COLLABORATION_USE__ROLE_BINDING :
-				return ((InternalEList<?>) getRoleBindings())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION_USE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION_USE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COLLABORATION_USE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.COLLABORATION_USE__ROLE_BINDING:
+			return ((InternalEList<?>) getRoleBindings()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -275,38 +254,38 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.COLLABORATION_USE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.COLLABORATION_USE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.COLLABORATION_USE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.COLLABORATION_USE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.COLLABORATION_USE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.COLLABORATION_USE__NAME :
-				return getName();
-			case UMLPackage.COLLABORATION_USE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.COLLABORATION_USE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.COLLABORATION_USE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.COLLABORATION_USE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.COLLABORATION_USE__ROLE_BINDING :
-				return getRoleBindings();
-			case UMLPackage.COLLABORATION_USE__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
+		case UMLPackage.COLLABORATION_USE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.COLLABORATION_USE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.COLLABORATION_USE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.COLLABORATION_USE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.COLLABORATION_USE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.COLLABORATION_USE__NAME:
+			return getName();
+		case UMLPackage.COLLABORATION_USE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.COLLABORATION_USE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.COLLABORATION_USE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.COLLABORATION_USE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.COLLABORATION_USE__ROLE_BINDING:
+			return getRoleBindings();
+		case UMLPackage.COLLABORATION_USE__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -320,33 +299,30 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.COLLABORATION_USE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.COLLABORATION_USE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.COLLABORATION_USE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.COLLABORATION_USE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.COLLABORATION_USE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.COLLABORATION_USE__ROLE_BINDING :
-				getRoleBindings().clear();
-				getRoleBindings()
-					.addAll((Collection<? extends Dependency>) newValue);
-				return;
-			case UMLPackage.COLLABORATION_USE__TYPE :
-				setType((Collaboration) newValue);
-				return;
+		case UMLPackage.COLLABORATION_USE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.COLLABORATION_USE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.COLLABORATION_USE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.COLLABORATION_USE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.COLLABORATION_USE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.COLLABORATION_USE__ROLE_BINDING:
+			getRoleBindings().clear();
+			getRoleBindings().addAll((Collection<? extends Dependency>) newValue);
+			return;
+		case UMLPackage.COLLABORATION_USE__TYPE:
+			setType((Collaboration) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -359,27 +335,27 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.COLLABORATION_USE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.COLLABORATION_USE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.COLLABORATION_USE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.COLLABORATION_USE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.COLLABORATION_USE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.COLLABORATION_USE__ROLE_BINDING :
-				getRoleBindings().clear();
-				return;
-			case UMLPackage.COLLABORATION_USE__TYPE :
-				setType((Collaboration) null);
-				return;
+		case UMLPackage.COLLABORATION_USE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.COLLABORATION_USE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.COLLABORATION_USE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.COLLABORATION_USE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.COLLABORATION_USE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.COLLABORATION_USE__ROLE_BINDING:
+			getRoleBindings().clear();
+			return;
+		case UMLPackage.COLLABORATION_USE__TYPE:
+			setType((Collaboration) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -392,32 +368,30 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.COLLABORATION_USE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.COLLABORATION_USE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.COLLABORATION_USE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.COLLABORATION_USE__OWNER :
-				return isSetOwner();
-			case UMLPackage.COLLABORATION_USE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.COLLABORATION_USE__NAME :
-				return isSetName();
-			case UMLPackage.COLLABORATION_USE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.COLLABORATION_USE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.COLLABORATION_USE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.COLLABORATION_USE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.COLLABORATION_USE__ROLE_BINDING :
-				return !getRoleBindings().isEmpty();
-			case UMLPackage.COLLABORATION_USE__TYPE :
-				return basicGetType() != null;
+		case UMLPackage.COLLABORATION_USE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.COLLABORATION_USE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.COLLABORATION_USE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.COLLABORATION_USE__OWNER:
+			return isSetOwner();
+		case UMLPackage.COLLABORATION_USE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.COLLABORATION_USE__NAME:
+			return isSetName();
+		case UMLPackage.COLLABORATION_USE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.COLLABORATION_USE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.COLLABORATION_USE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.COLLABORATION_USE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.COLLABORATION_USE__ROLE_BINDING:
+			return !getRoleBindings().isEmpty();
+		case UMLPackage.COLLABORATION_USE__TYPE:
+			return basicGetType() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -432,135 +406,116 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.COLLABORATION_USE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION_USE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION_USE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.COLLABORATION_USE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.COLLABORATION_USE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.COLLABORATION_USE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.COLLABORATION_USE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.COLLABORATION_USE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___GET_MODEL :
-				return getModel();
-			case UMLPackage.COLLABORATION_USE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.COLLABORATION_USE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.COLLABORATION_USE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.COLLABORATION_USE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.COLLABORATION_USE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.COLLABORATION_USE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.COLLABORATION_USE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.COLLABORATION_USE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.COLLABORATION_USE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.COLLABORATION_USE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.COLLABORATION_USE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.COLLABORATION_USE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION_USE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION_USE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION_USE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.COLLABORATION_USE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.COLLABORATION_USE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.COLLABORATION_USE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.COLLABORATION_USE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.COLLABORATION_USE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.COLLABORATION_USE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.COLLABORATION_USE___SEPARATOR :
-				return separator();
-			case UMLPackage.COLLABORATION_USE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.COLLABORATION_USE___VALIDATE_CLIENT_ELEMENTS__DIAGNOSTICCHAIN_MAP :
-				return validateClientElements(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION_USE___VALIDATE_EVERY_ROLE__DIAGNOSTICCHAIN_MAP :
-				return validateEveryRole((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COLLABORATION_USE___VALIDATE_CONNECTORS__DIAGNOSTICCHAIN_MAP :
-				return validateConnectors((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION_USE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION_USE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION_USE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.COLLABORATION_USE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.COLLABORATION_USE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.COLLABORATION_USE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.COLLABORATION_USE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.COLLABORATION_USE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___GET_MODEL:
+			return getModel();
+		case UMLPackage.COLLABORATION_USE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.COLLABORATION_USE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.COLLABORATION_USE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.COLLABORATION_USE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.COLLABORATION_USE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.COLLABORATION_USE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.COLLABORATION_USE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.COLLABORATION_USE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.COLLABORATION_USE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.COLLABORATION_USE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.COLLABORATION_USE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.COLLABORATION_USE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION_USE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION_USE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION_USE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.COLLABORATION_USE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.COLLABORATION_USE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.COLLABORATION_USE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.COLLABORATION_USE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.COLLABORATION_USE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.COLLABORATION_USE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.COLLABORATION_USE___SEPARATOR:
+			return separator();
+		case UMLPackage.COLLABORATION_USE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.COLLABORATION_USE___VALIDATE_CLIENT_ELEMENTS__DIAGNOSTICCHAIN_MAP:
+			return validateClientElements((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION_USE___VALIDATE_EVERY_ROLE__DIAGNOSTICCHAIN_MAP:
+			return validateEveryRole((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COLLABORATION_USE___VALIDATE_CONNECTORS__DIAGNOSTICCHAIN_MAP:
+			return validateConnectors((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -573,10 +528,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.COLLABORATION_USE__OWNED_COMMENT,
-		UMLPackage.COLLABORATION_USE__NAME_EXPRESSION,
-		UMLPackage.COLLABORATION_USE__ROLE_BINDING};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.COLLABORATION_USE__OWNED_COMMENT, UMLPackage.COLLABORATION_USE__NAME_EXPRESSION, UMLPackage.COLLABORATION_USE__ROLE_BINDING };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -586,7 +538,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.COLLABORATION_USE__ROLE_BINDING);
+				|| eIsSet(UMLPackage.COLLABORATION_USE__ROLE_BINDING);
 	}
 
 } //CollaborationUseImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CombinedFragmentImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CombinedFragmentImpl.java
index 38ab27f..575332d 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CombinedFragmentImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CombinedFragmentImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,8 +29,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -113,21 +117,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.COMBINED_FRAGMENT__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.COMBINED_FRAGMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.COMBINED_FRAGMENT__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.COMBINED_FRAGMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -136,11 +132,7 @@
 	 * @generated
 	 */
 	public InteractionOperatorKind getInteractionOperator() {
-		return (InteractionOperatorKind) eDynamicGet(
-			UMLPackage.COMBINED_FRAGMENT__INTERACTION_OPERATOR
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMBINED_FRAGMENT__INTERACTION_OPERATOR, true,
-			true);
+		return (InteractionOperatorKind) eDynamicGet(UMLPackage.COMBINED_FRAGMENT__INTERACTION_OPERATOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMBINED_FRAGMENT__INTERACTION_OPERATOR, true, true);
 	}
 
 	/**
@@ -150,11 +142,7 @@
 	 */
 	public void setInteractionOperator(
 			InteractionOperatorKind newInteractionOperator) {
-		eDynamicSet(
-			UMLPackage.COMBINED_FRAGMENT__INTERACTION_OPERATOR
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMBINED_FRAGMENT__INTERACTION_OPERATOR,
-			newInteractionOperator);
+		eDynamicSet(UMLPackage.COMBINED_FRAGMENT__INTERACTION_OPERATOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMBINED_FRAGMENT__INTERACTION_OPERATOR, newInteractionOperator);
 	}
 
 	/**
@@ -164,9 +152,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<InteractionOperand> getOperands() {
-		return (EList<InteractionOperand>) eDynamicGet(
-			UMLPackage.COMBINED_FRAGMENT__OPERAND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMBINED_FRAGMENT__OPERAND, true, true);
+		return (EList<InteractionOperand>) eDynamicGet(UMLPackage.COMBINED_FRAGMENT__OPERAND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMBINED_FRAGMENT__OPERAND, true, true);
 	}
 
 	/**
@@ -175,8 +161,7 @@
 	 * @generated
 	 */
 	public InteractionOperand createOperand(String name) {
-		InteractionOperand newOperand = (InteractionOperand) create(
-			UMLPackage.Literals.INTERACTION_OPERAND);
+		InteractionOperand newOperand = (InteractionOperand) create(UMLPackage.Literals.INTERACTION_OPERAND);
 		getOperands().add(newOperand);
 		if (name != null)
 			newOperand.setName(name);
@@ -199,16 +184,12 @@
 	 */
 	public InteractionOperand getOperand(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		operandLoop : for (InteractionOperand operand : getOperands()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(operand.getName())
-				: name.equals(operand.getName())))
+		operandLoop: for (InteractionOperand operand : getOperands()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(operand.getName()) : name.equals(operand.getName())))
 				continue operandLoop;
 			return operand;
 		}
-		return createOnDemand
-			? createOperand(name)
-			: null;
+		return createOnDemand ? createOperand(name) : null;
 	}
 
 	/**
@@ -218,10 +199,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Gate> getCfragmentGates() {
-		return (EList<Gate>) eDynamicGet(
-			UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMBINED_FRAGMENT__CFRAGMENT_GATE, true, true);
+		return (EList<Gate>) eDynamicGet(UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMBINED_FRAGMENT__CFRAGMENT_GATE, true, true);
 	}
 
 	/**
@@ -253,16 +231,12 @@
 	 */
 	public Gate getCfragmentGate(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		cfragmentGateLoop : for (Gate cfragmentGate : getCfragmentGates()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(cfragmentGate.getName())
-				: name.equals(cfragmentGate.getName())))
+		cfragmentGateLoop: for (Gate cfragmentGate : getCfragmentGates()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(cfragmentGate.getName()) : name.equals(cfragmentGate.getName())))
 				continue cfragmentGateLoop;
 			return cfragmentGate;
 		}
-		return createOnDemand
-			? createCfragmentGate(name)
-			: null;
+		return createOnDemand ? createCfragmentGate(name) : null;
 	}
 
 	/**
@@ -272,8 +246,7 @@
 	 */
 	public boolean validateOptLoopBreakNeg(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CombinedFragmentOperations.validateOptLoopBreakNeg(this,
-			diagnostics, context);
+		return CombinedFragmentOperations.validateOptLoopBreakNeg(this, diagnostics, context);
 	}
 
 	/**
@@ -283,8 +256,7 @@
 	 */
 	public boolean validateBreak(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CombinedFragmentOperations.validateBreak(this, diagnostics,
-			context);
+		return CombinedFragmentOperations.validateBreak(this, diagnostics, context);
 	}
 
 	/**
@@ -294,8 +266,7 @@
 	 */
 	public boolean validateConsiderAndIgnore(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CombinedFragmentOperations.validateConsiderAndIgnore(this,
-			diagnostics, context);
+		return CombinedFragmentOperations.validateConsiderAndIgnore(this, diagnostics, context);
 	}
 
 	/**
@@ -307,30 +278,24 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.COMBINED_FRAGMENT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMBINED_FRAGMENT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMBINED_FRAGMENT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.COMBINED_FRAGMENT__COVERED :
-				return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_OPERAND :
-				return basicSetEnclosingOperand(null, msgs);
-			case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_INTERACTION :
-				return basicSetEnclosingInteraction(null, msgs);
-			case UMLPackage.COMBINED_FRAGMENT__GENERAL_ORDERING :
-				return ((InternalEList<?>) getGeneralOrderings())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE :
-				return ((InternalEList<?>) getCfragmentGates())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMBINED_FRAGMENT__OPERAND :
-				return ((InternalEList<?>) getOperands()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.COMBINED_FRAGMENT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMBINED_FRAGMENT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMBINED_FRAGMENT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.COMBINED_FRAGMENT__COVERED:
+			return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_OPERAND:
+			return basicSetEnclosingOperand(null, msgs);
+		case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_INTERACTION:
+			return basicSetEnclosingInteraction(null, msgs);
+		case UMLPackage.COMBINED_FRAGMENT__GENERAL_ORDERING:
+			return ((InternalEList<?>) getGeneralOrderings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE:
+			return ((InternalEList<?>) getCfragmentGates()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMBINED_FRAGMENT__OPERAND:
+			return ((InternalEList<?>) getOperands()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -343,50 +308,50 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.COMBINED_FRAGMENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.COMBINED_FRAGMENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.COMBINED_FRAGMENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.COMBINED_FRAGMENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.COMBINED_FRAGMENT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.COMBINED_FRAGMENT__NAME :
-				return getName();
-			case UMLPackage.COMBINED_FRAGMENT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.COMBINED_FRAGMENT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.COMBINED_FRAGMENT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.COMBINED_FRAGMENT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.COMBINED_FRAGMENT__COVERED :
-				return getCovereds();
-			case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_OPERAND :
-				if (resolve)
-					return getEnclosingOperand();
-				return basicGetEnclosingOperand();
-			case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_INTERACTION :
-				if (resolve)
-					return getEnclosingInteraction();
-				return basicGetEnclosingInteraction();
-			case UMLPackage.COMBINED_FRAGMENT__GENERAL_ORDERING :
-				return getGeneralOrderings();
-			case UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE :
-				return getCfragmentGates();
-			case UMLPackage.COMBINED_FRAGMENT__INTERACTION_OPERATOR :
-				return getInteractionOperator();
-			case UMLPackage.COMBINED_FRAGMENT__OPERAND :
-				return getOperands();
+		case UMLPackage.COMBINED_FRAGMENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.COMBINED_FRAGMENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.COMBINED_FRAGMENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.COMBINED_FRAGMENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.COMBINED_FRAGMENT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.COMBINED_FRAGMENT__NAME:
+			return getName();
+		case UMLPackage.COMBINED_FRAGMENT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.COMBINED_FRAGMENT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.COMBINED_FRAGMENT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.COMBINED_FRAGMENT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.COMBINED_FRAGMENT__COVERED:
+			return getCovereds();
+		case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_OPERAND:
+			if (resolve)
+				return getEnclosingOperand();
+			return basicGetEnclosingOperand();
+		case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_INTERACTION:
+			if (resolve)
+				return getEnclosingInteraction();
+			return basicGetEnclosingInteraction();
+		case UMLPackage.COMBINED_FRAGMENT__GENERAL_ORDERING:
+			return getGeneralOrderings();
+		case UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE:
+			return getCfragmentGates();
+		case UMLPackage.COMBINED_FRAGMENT__INTERACTION_OPERATOR:
+			return getInteractionOperator();
+		case UMLPackage.COMBINED_FRAGMENT__OPERAND:
+			return getOperands();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -400,53 +365,48 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.COMBINED_FRAGMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__COVERED :
-				getCovereds().clear();
-				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) newValue);
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				getGeneralOrderings()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE :
-				getCfragmentGates().clear();
-				getCfragmentGates()
-					.addAll((Collection<? extends Gate>) newValue);
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__INTERACTION_OPERATOR :
-				setInteractionOperator((InteractionOperatorKind) newValue);
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__OPERAND :
-				getOperands().clear();
-				getOperands().addAll(
-					(Collection<? extends InteractionOperand>) newValue);
-				return;
+		case UMLPackage.COMBINED_FRAGMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__COVERED:
+			getCovereds().clear();
+			getCovereds().addAll((Collection<? extends Lifeline>) newValue);
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) newValue);
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			getGeneralOrderings().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE:
+			getCfragmentGates().clear();
+			getCfragmentGates().addAll((Collection<? extends Gate>) newValue);
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__INTERACTION_OPERATOR:
+			setInteractionOperator((InteractionOperatorKind) newValue);
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__OPERAND:
+			getOperands().clear();
+			getOperands().addAll((Collection<? extends InteractionOperand>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -459,42 +419,42 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.COMBINED_FRAGMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__COVERED :
-				getCovereds().clear();
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) null);
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) null);
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE :
-				getCfragmentGates().clear();
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__INTERACTION_OPERATOR :
-				setInteractionOperator(INTERACTION_OPERATOR_EDEFAULT);
-				return;
-			case UMLPackage.COMBINED_FRAGMENT__OPERAND :
-				getOperands().clear();
-				return;
+		case UMLPackage.COMBINED_FRAGMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__COVERED:
+			getCovereds().clear();
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) null);
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) null);
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE:
+			getCfragmentGates().clear();
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__INTERACTION_OPERATOR:
+			setInteractionOperator(INTERACTION_OPERATOR_EDEFAULT);
+			return;
+		case UMLPackage.COMBINED_FRAGMENT__OPERAND:
+			getOperands().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -507,42 +467,40 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.COMBINED_FRAGMENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.COMBINED_FRAGMENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.COMBINED_FRAGMENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.COMBINED_FRAGMENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.COMBINED_FRAGMENT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.COMBINED_FRAGMENT__NAME :
-				return isSetName();
-			case UMLPackage.COMBINED_FRAGMENT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.COMBINED_FRAGMENT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.COMBINED_FRAGMENT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.COMBINED_FRAGMENT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.COMBINED_FRAGMENT__COVERED :
-				return !getCovereds().isEmpty();
-			case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_OPERAND :
-				return basicGetEnclosingOperand() != null;
-			case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_INTERACTION :
-				return basicGetEnclosingInteraction() != null;
-			case UMLPackage.COMBINED_FRAGMENT__GENERAL_ORDERING :
-				return !getGeneralOrderings().isEmpty();
-			case UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE :
-				return !getCfragmentGates().isEmpty();
-			case UMLPackage.COMBINED_FRAGMENT__INTERACTION_OPERATOR :
-				return getInteractionOperator() != INTERACTION_OPERATOR_EDEFAULT;
-			case UMLPackage.COMBINED_FRAGMENT__OPERAND :
-				return !getOperands().isEmpty();
+		case UMLPackage.COMBINED_FRAGMENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.COMBINED_FRAGMENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.COMBINED_FRAGMENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.COMBINED_FRAGMENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.COMBINED_FRAGMENT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.COMBINED_FRAGMENT__NAME:
+			return isSetName();
+		case UMLPackage.COMBINED_FRAGMENT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.COMBINED_FRAGMENT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.COMBINED_FRAGMENT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.COMBINED_FRAGMENT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.COMBINED_FRAGMENT__COVERED:
+			return !getCovereds().isEmpty();
+		case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_OPERAND:
+			return basicGetEnclosingOperand() != null;
+		case UMLPackage.COMBINED_FRAGMENT__ENCLOSING_INTERACTION:
+			return basicGetEnclosingInteraction() != null;
+		case UMLPackage.COMBINED_FRAGMENT__GENERAL_ORDERING:
+			return !getGeneralOrderings().isEmpty();
+		case UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE:
+			return !getCfragmentGates().isEmpty();
+		case UMLPackage.COMBINED_FRAGMENT__INTERACTION_OPERATOR:
+			return getInteractionOperator() != INTERACTION_OPERATOR_EDEFAULT;
+		case UMLPackage.COMBINED_FRAGMENT__OPERAND:
+			return !getOperands().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -557,136 +515,116 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.COMBINED_FRAGMENT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMBINED_FRAGMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMBINED_FRAGMENT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.COMBINED_FRAGMENT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.COMBINED_FRAGMENT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.COMBINED_FRAGMENT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.COMBINED_FRAGMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.COMBINED_FRAGMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___GET_MODEL :
-				return getModel();
-			case UMLPackage.COMBINED_FRAGMENT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.COMBINED_FRAGMENT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.COMBINED_FRAGMENT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.COMBINED_FRAGMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.COMBINED_FRAGMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.COMBINED_FRAGMENT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.COMBINED_FRAGMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.COMBINED_FRAGMENT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.COMBINED_FRAGMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.COMBINED_FRAGMENT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.COMBINED_FRAGMENT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.COMBINED_FRAGMENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMBINED_FRAGMENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMBINED_FRAGMENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMBINED_FRAGMENT___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___GET_LABEL :
-				return getLabel();
-			case UMLPackage.COMBINED_FRAGMENT___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.COMBINED_FRAGMENT___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.COMBINED_FRAGMENT___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.COMBINED_FRAGMENT___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.COMBINED_FRAGMENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.COMBINED_FRAGMENT___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.COMBINED_FRAGMENT___SEPARATOR :
-				return separator();
-			case UMLPackage.COMBINED_FRAGMENT___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.COMBINED_FRAGMENT___VALIDATE_BREAK__DIAGNOSTICCHAIN_MAP :
-				return validateBreak((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMBINED_FRAGMENT___VALIDATE_CONSIDER_AND_IGNORE__DIAGNOSTICCHAIN_MAP :
-				return validateConsiderAndIgnore(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMBINED_FRAGMENT___VALIDATE_OPT_LOOP_BREAK_NEG__DIAGNOSTICCHAIN_MAP :
-				return validateOptLoopBreakNeg(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMBINED_FRAGMENT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMBINED_FRAGMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMBINED_FRAGMENT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.COMBINED_FRAGMENT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.COMBINED_FRAGMENT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.COMBINED_FRAGMENT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.COMBINED_FRAGMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.COMBINED_FRAGMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___GET_MODEL:
+			return getModel();
+		case UMLPackage.COMBINED_FRAGMENT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.COMBINED_FRAGMENT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.COMBINED_FRAGMENT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.COMBINED_FRAGMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.COMBINED_FRAGMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.COMBINED_FRAGMENT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.COMBINED_FRAGMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.COMBINED_FRAGMENT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.COMBINED_FRAGMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.COMBINED_FRAGMENT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.COMBINED_FRAGMENT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.COMBINED_FRAGMENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMBINED_FRAGMENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMBINED_FRAGMENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMBINED_FRAGMENT___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___GET_LABEL:
+			return getLabel();
+		case UMLPackage.COMBINED_FRAGMENT___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.COMBINED_FRAGMENT___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.COMBINED_FRAGMENT___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.COMBINED_FRAGMENT___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.COMBINED_FRAGMENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.COMBINED_FRAGMENT___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.COMBINED_FRAGMENT___SEPARATOR:
+			return separator();
+		case UMLPackage.COMBINED_FRAGMENT___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.COMBINED_FRAGMENT___VALIDATE_BREAK__DIAGNOSTICCHAIN_MAP:
+			return validateBreak((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMBINED_FRAGMENT___VALIDATE_CONSIDER_AND_IGNORE__DIAGNOSTICCHAIN_MAP:
+			return validateConsiderAndIgnore((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMBINED_FRAGMENT___VALIDATE_OPT_LOOP_BREAK_NEG__DIAGNOSTICCHAIN_MAP:
+			return validateOptLoopBreakNeg((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -699,12 +637,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.COMBINED_FRAGMENT__OWNED_COMMENT,
-		UMLPackage.COMBINED_FRAGMENT__NAME_EXPRESSION,
-		UMLPackage.COMBINED_FRAGMENT__GENERAL_ORDERING,
-		UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE,
-		UMLPackage.COMBINED_FRAGMENT__OPERAND};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.COMBINED_FRAGMENT__OWNED_COMMENT, UMLPackage.COMBINED_FRAGMENT__NAME_EXPRESSION, UMLPackage.COMBINED_FRAGMENT__GENERAL_ORDERING, UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE,
+			UMLPackage.COMBINED_FRAGMENT__OPERAND };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -714,8 +648,8 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE)
-			|| eIsSet(UMLPackage.COMBINED_FRAGMENT__OPERAND);
+				|| eIsSet(UMLPackage.COMBINED_FRAGMENT__CFRAGMENT_GATE)
+				|| eIsSet(UMLPackage.COMBINED_FRAGMENT__OPERAND);
 	}
 
 } //CombinedFragmentImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CommentImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CommentImpl.java
index badc08a..3665366 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CommentImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CommentImpl.java
@@ -1,23 +1,29 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 451350, 485756
- *   Kenn Hussey - 519572
+ *   Kenn Hussey - 519572, 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
+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;
+
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -75,9 +81,7 @@
 	 * @generated
 	 */
 	public String getBody() {
-		return (String) eDynamicGet(
-			UMLPackage.COMMENT__BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMMENT__BODY, true, true);
+		return (String) eDynamicGet(UMLPackage.COMMENT__BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMMENT__BODY, true, true);
 	}
 
 	/**
@@ -86,8 +90,7 @@
 	 * @generated
 	 */
 	public void setBody(String newBody) {
-		eDynamicSet(UMLPackage.COMMENT__BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMMENT__BODY, newBody);
+		eDynamicSet(UMLPackage.COMMENT__BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMMENT__BODY, newBody);
 	}
 
 	/**
@@ -96,8 +99,7 @@
 	 * @generated
 	 */
 	public void unsetBody() {
-		eDynamicUnset(UMLPackage.COMMENT__BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMMENT__BODY);
+		eDynamicUnset(UMLPackage.COMMENT__BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMMENT__BODY);
 	}
 
 	/**
@@ -106,8 +108,7 @@
 	 * @generated
 	 */
 	public boolean isSetBody() {
-		return eDynamicIsSet(UMLPackage.COMMENT__BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMMENT__BODY);
+		return eDynamicIsSet(UMLPackage.COMMENT__BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMMENT__BODY);
 	}
 
 	/**
@@ -117,9 +118,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Element> getAnnotatedElements() {
-		return (EList<Element>) eDynamicGet(
-			UMLPackage.COMMENT__ANNOTATED_ELEMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMMENT__ANNOTATED_ELEMENT, true, true);
+		return (EList<Element>) eDynamicGet(UMLPackage.COMMENT__ANNOTATED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMMENT__ANNOTATED_ELEMENT, true, true);
 	}
 
 	/**
@@ -130,20 +129,20 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.COMMENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.COMMENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.COMMENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.COMMENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.COMMENT__ANNOTATED_ELEMENT :
-				return getAnnotatedElements();
-			case UMLPackage.COMMENT__BODY :
-				return getBody();
+		case UMLPackage.COMMENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.COMMENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.COMMENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.COMMENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.COMMENT__ANNOTATED_ELEMENT:
+			return getAnnotatedElements();
+		case UMLPackage.COMMENT__BODY:
+			return getBody();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -157,24 +156,21 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.COMMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.COMMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.COMMENT__ANNOTATED_ELEMENT :
-				getAnnotatedElements().clear();
-				getAnnotatedElements()
-					.addAll((Collection<? extends Element>) newValue);
-				return;
-			case UMLPackage.COMMENT__BODY :
-				setBody((String) newValue);
-				return;
+		case UMLPackage.COMMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.COMMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.COMMENT__ANNOTATED_ELEMENT:
+			getAnnotatedElements().clear();
+			getAnnotatedElements().addAll((Collection<? extends Element>) newValue);
+			return;
+		case UMLPackage.COMMENT__BODY:
+			setBody((String) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -187,18 +183,18 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.COMMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.COMMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.COMMENT__ANNOTATED_ELEMENT :
-				getAnnotatedElements().clear();
-				return;
-			case UMLPackage.COMMENT__BODY :
-				unsetBody();
-				return;
+		case UMLPackage.COMMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.COMMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.COMMENT__ANNOTATED_ELEMENT:
+			getAnnotatedElements().clear();
+			return;
+		case UMLPackage.COMMENT__BODY:
+			unsetBody();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -211,18 +207,18 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.COMMENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.COMMENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.COMMENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.COMMENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.COMMENT__ANNOTATED_ELEMENT :
-				return !getAnnotatedElements().isEmpty();
-			case UMLPackage.COMMENT__BODY :
-				return isSetBody();
+		case UMLPackage.COMMENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.COMMENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.COMMENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.COMMENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.COMMENT__ANNOTATED_ELEMENT:
+			return !getAnnotatedElements().isEmpty();
+		case UMLPackage.COMMENT__BODY:
+			return isSetBody();
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CommunicationPathImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CommunicationPathImpl.java
index 6b34a59..f275c7f 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CommunicationPathImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CommunicationPathImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -74,8 +74,7 @@
 	@Override
 	public boolean validateAssociationEnds(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CommunicationPathOperations.validateAssociationEnds(this,
-			diagnostics, context);
+		return CommunicationPathOperations.validateAssociationEnds(this, diagnostics, context);
 	}
 
 	/**
@@ -88,296 +87,231 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.COMMUNICATION_PATH___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.COMMUNICATION_PATH___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.COMMUNICATION_PATH___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.COMMUNICATION_PATH___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.COMMUNICATION_PATH___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___GET_MODEL :
-				return getModel();
-			case UMLPackage.COMMUNICATION_PATH___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.COMMUNICATION_PATH___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.COMMUNICATION_PATH___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.COMMUNICATION_PATH___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.COMMUNICATION_PATH___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.COMMUNICATION_PATH___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.COMMUNICATION_PATH___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.COMMUNICATION_PATH___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.COMMUNICATION_PATH___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___GET_LABEL :
-				return getLabel();
-			case UMLPackage.COMMUNICATION_PATH___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.COMMUNICATION_PATH___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.COMMUNICATION_PATH___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.COMMUNICATION_PATH___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.COMMUNICATION_PATH___SEPARATOR :
-				return separator();
-			case UMLPackage.COMMUNICATION_PATH___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.COMMUNICATION_PATH___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.COMMUNICATION_PATH___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.COMMUNICATION_PATH___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.COMMUNICATION_PATH___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.COMMUNICATION_PATH___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.COMMUNICATION_PATH___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.COMMUNICATION_PATH___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.COMMUNICATION_PATH___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.COMMUNICATION_PATH___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.COMMUNICATION_PATH___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.COMMUNICATION_PATH___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.COMMUNICATION_PATH___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.COMMUNICATION_PATH___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.COMMUNICATION_PATH___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.COMMUNICATION_PATH___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.COMMUNICATION_PATH___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.COMMUNICATION_PATH___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.COMMUNICATION_PATH___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___PARENTS :
-				return parents();
-			case UMLPackage.COMMUNICATION_PATH___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.COMMUNICATION_PATH___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.COMMUNICATION_PATH___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.COMMUNICATION_PATH___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.COMMUNICATION_PATH___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.COMMUNICATION_PATH___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.COMMUNICATION_PATH___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_SPECIALIZED_END_NUMBER__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializedEndNumber(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_SPECIALIZED_END_TYPES__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializedEndTypes(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_BINARY_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP :
-				return validateBinaryAssociations(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_ASSOCIATION_ENDS__DIAGNOSTICCHAIN_MAP :
-				return validateAssociationEnds(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___VALIDATE_ENDS_MUST_BE_TYPED__DIAGNOSTICCHAIN_MAP :
-				return validateEndsMustBeTyped(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMMUNICATION_PATH___IS_BINARY :
-				return isBinary();
-			case UMLPackage.COMMUNICATION_PATH___GET_END_TYPES :
-				return getEndTypes();
+		case UMLPackage.COMMUNICATION_PATH___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.COMMUNICATION_PATH___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.COMMUNICATION_PATH___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.COMMUNICATION_PATH___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.COMMUNICATION_PATH___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___GET_MODEL:
+			return getModel();
+		case UMLPackage.COMMUNICATION_PATH___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.COMMUNICATION_PATH___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.COMMUNICATION_PATH___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.COMMUNICATION_PATH___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.COMMUNICATION_PATH___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.COMMUNICATION_PATH___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.COMMUNICATION_PATH___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.COMMUNICATION_PATH___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.COMMUNICATION_PATH___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___GET_LABEL:
+			return getLabel();
+		case UMLPackage.COMMUNICATION_PATH___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.COMMUNICATION_PATH___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.COMMUNICATION_PATH___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.COMMUNICATION_PATH___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.COMMUNICATION_PATH___SEPARATOR:
+			return separator();
+		case UMLPackage.COMMUNICATION_PATH___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.COMMUNICATION_PATH___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.COMMUNICATION_PATH___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.COMMUNICATION_PATH___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.COMMUNICATION_PATH___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.COMMUNICATION_PATH___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.COMMUNICATION_PATH___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.COMMUNICATION_PATH___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.COMMUNICATION_PATH___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.COMMUNICATION_PATH___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.COMMUNICATION_PATH___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.COMMUNICATION_PATH___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.COMMUNICATION_PATH___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.COMMUNICATION_PATH___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.COMMUNICATION_PATH___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.COMMUNICATION_PATH___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.COMMUNICATION_PATH___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.COMMUNICATION_PATH___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.COMMUNICATION_PATH___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___PARENTS:
+			return parents();
+		case UMLPackage.COMMUNICATION_PATH___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.COMMUNICATION_PATH___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.COMMUNICATION_PATH___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.COMMUNICATION_PATH___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.COMMUNICATION_PATH___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.COMMUNICATION_PATH___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.COMMUNICATION_PATH___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_SPECIALIZED_END_NUMBER__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializedEndNumber((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_SPECIALIZED_END_TYPES__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializedEndTypes((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_BINARY_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP:
+			return validateBinaryAssociations((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_ASSOCIATION_ENDS__DIAGNOSTICCHAIN_MAP:
+			return validateAssociationEnds((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___VALIDATE_ENDS_MUST_BE_TYPED__DIAGNOSTICCHAIN_MAP:
+			return validateEndsMustBeTyped((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMMUNICATION_PATH___IS_BINARY:
+			return isBinary();
+		case UMLPackage.COMMUNICATION_PATH___GET_END_TYPES:
+			return getEndTypes();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ComponentImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ComponentImpl.java
index 5a75498..54a0f92 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ComponentImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ComponentImpl.java
@@ -1,14 +1,14 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -26,8 +27,12 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -135,20 +140,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.COMPONENT__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.COMPONENT__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.COMPONENT__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.COMPONENT__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -162,20 +160,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.COMPONENT__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.COMPONENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.COMPONENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.COMPONENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -184,11 +175,7 @@
 	 * @generated
 	 */
 	public boolean isIndirectlyInstantiated() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.COMPONENT__IS_INDIRECTLY_INSTANTIATED
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMPONENT__IS_INDIRECTLY_INSTANTIATED, true,
-			true);
+		return (Boolean) eDynamicGet(UMLPackage.COMPONENT__IS_INDIRECTLY_INSTANTIATED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMPONENT__IS_INDIRECTLY_INSTANTIATED, true, true);
 	}
 
 	/**
@@ -198,11 +185,7 @@
 	 */
 	public void setIsIndirectlyInstantiated(
 			boolean newIsIndirectlyInstantiated) {
-		eDynamicSet(
-			UMLPackage.COMPONENT__IS_INDIRECTLY_INSTANTIATED
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMPONENT__IS_INDIRECTLY_INSTANTIATED,
-			newIsIndirectlyInstantiated);
+		eDynamicSet(UMLPackage.COMPONENT__IS_INDIRECTLY_INSTANTIATED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMPONENT__IS_INDIRECTLY_INSTANTIATED, newIsIndirectlyInstantiated);
 	}
 
 	/**
@@ -214,11 +197,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.COMPONENT__REQUIRED);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.COMPONENT__REQUIRED);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.COMPONENT__REQUIRED,
-					result = ComponentOperations.getRequireds(this));
+				cache.put(this, UMLPackage.Literals.COMPONENT__REQUIRED, result = ComponentOperations.getRequireds(this));
 			}
 			return result;
 		}
@@ -240,10 +221,8 @@
 	 * @generated
 	 */
 	public Interface getRequired(String name, boolean ignoreCase) {
-		requiredLoop : for (Interface required : getRequireds()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(required.getName())
-				: name.equals(required.getName())))
+		requiredLoop: for (Interface required : getRequireds()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(required.getName()) : name.equals(required.getName())))
 				continue requiredLoop;
 			return required;
 		}
@@ -257,8 +236,7 @@
 	 */
 	public boolean validateNoNestedClassifiers(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ComponentOperations.validateNoNestedClassifiers(this,
-			diagnostics, context);
+		return ComponentOperations.validateNoNestedClassifiers(this, diagnostics, context);
 	}
 
 	/**
@@ -268,8 +246,7 @@
 	 */
 	public boolean validateNoPackagedElements(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ComponentOperations.validateNoPackagedElements(this, diagnostics,
-			context);
+		return ComponentOperations.validateNoPackagedElements(this, diagnostics, context);
 	}
 
 	/**
@@ -281,11 +258,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.COMPONENT__PROVIDED);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.COMPONENT__PROVIDED);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.COMPONENT__PROVIDED,
-					result = ComponentOperations.getProvideds(this));
+				cache.put(this, UMLPackage.Literals.COMPONENT__PROVIDED, result = ComponentOperations.getProvideds(this));
 			}
 			return result;
 		}
@@ -307,10 +282,8 @@
 	 * @generated
 	 */
 	public Interface getProvided(String name, boolean ignoreCase) {
-		providedLoop : for (Interface provided : getProvideds()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(provided.getName())
-				: name.equals(provided.getName())))
+		providedLoop: for (Interface provided : getProvideds()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(provided.getName()) : name.equals(provided.getName())))
 				continue providedLoop;
 			return provided;
 		}
@@ -324,9 +297,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<PackageableElement> getPackagedElements() {
-		return (EList<PackageableElement>) eDynamicGet(
-			UMLPackage.COMPONENT__PACKAGED_ELEMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMPONENT__PACKAGED_ELEMENT, true, true);
+		return (EList<PackageableElement>) eDynamicGet(UMLPackage.COMPONENT__PACKAGED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMPONENT__PACKAGED_ELEMENT, true, true);
 	}
 
 	/**
@@ -336,8 +307,7 @@
 	 */
 	public PackageableElement createPackagedElement(String name,
 			EClass eClass) {
-		PackageableElement newPackagedElement = (PackageableElement) create(
-			eClass);
+		PackageableElement newPackagedElement = (PackageableElement) create(eClass);
 		getPackagedElements().add(newPackagedElement);
 		if (name != null)
 			newPackagedElement.setName(name);
@@ -360,18 +330,14 @@
 	 */
 	public PackageableElement getPackagedElement(String name,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		packagedElementLoop : for (PackageableElement packagedElement : getPackagedElements()) {
+		packagedElementLoop: for (PackageableElement packagedElement : getPackagedElements()) {
 			if (eClass != null && !eClass.isInstance(packagedElement))
 				continue packagedElementLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(packagedElement.getName())
-				: name.equals(packagedElement.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(packagedElement.getName()) : name.equals(packagedElement.getName())))
 				continue packagedElementLoop;
 			return packagedElement;
 		}
-		return createOnDemand && eClass != null
-			? createPackagedElement(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createPackagedElement(name, eClass) : null;
 	}
 
 	/**
@@ -381,9 +347,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ComponentRealization> getRealizations() {
-		return (EList<ComponentRealization>) eDynamicGet(
-			UMLPackage.COMPONENT__REALIZATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMPONENT__REALIZATION, true, true);
+		return (EList<ComponentRealization>) eDynamicGet(UMLPackage.COMPONENT__REALIZATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMPONENT__REALIZATION, true, true);
 	}
 
 	/**
@@ -392,8 +356,7 @@
 	 * @generated
 	 */
 	public ComponentRealization createRealization(String name) {
-		ComponentRealization newRealization = (ComponentRealization) create(
-			UMLPackage.Literals.COMPONENT_REALIZATION);
+		ComponentRealization newRealization = (ComponentRealization) create(UMLPackage.Literals.COMPONENT_REALIZATION);
 		getRealizations().add(newRealization);
 		if (name != null)
 			newRealization.setName(name);
@@ -416,16 +379,12 @@
 	 */
 	public ComponentRealization getRealization(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		realizationLoop : for (ComponentRealization realization : getRealizations()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(realization.getName())
-				: name.equals(realization.getName())))
+		realizationLoop: for (ComponentRealization realization : getRealizations()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(realization.getName()) : name.equals(realization.getName())))
 				continue realizationLoop;
 			return realization;
 		}
-		return createOnDemand
-			? createRealization(name)
-			: null;
+		return createOnDemand ? createRealization(name) : null;
 	}
 
 	/**
@@ -475,65 +434,44 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.COMPONENT__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COMPONENT__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COMPONENT__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COMPONENT__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COMPONENT__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.COMPONENT__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.COMPONENT__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.COMPONENT__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COMPONENT__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COMPONENT__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COMPONENT__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COMPONENT__INTERFACE_REALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COMPONENT__OWNED_OPERATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COMPONENT__REALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getRealizations())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.COMPONENT__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COMPONENT__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COMPONENT__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COMPONENT__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COMPONENT__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.COMPONENT__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.COMPONENT__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.COMPONENT__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COMPONENT__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COMPONENT__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COMPONENT__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COMPONENT__INTERFACE_REALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COMPONENT__OWNED_OPERATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COMPONENT__REALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getRealizations()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -547,77 +485,56 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.COMPONENT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.COMPONENT__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.COMPONENT__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.COMPONENT__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__OWNED_CONNECTOR :
-				return ((InternalEList<?>) getOwnedConnectors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__INTERFACE_REALIZATION :
-				return ((InternalEList<?>) getInterfaceRealizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__OWNED_BEHAVIOR :
-				return ((InternalEList<?>) getOwnedBehaviors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__OWNED_OPERATION :
-				return ((InternalEList<?>) getOwnedOperations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__NESTED_CLASSIFIER :
-				return ((InternalEList<?>) getNestedClassifiers())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__OWNED_RECEPTION :
-				return ((InternalEList<?>) getOwnedReceptions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__PACKAGED_ELEMENT :
-				return ((InternalEList<?>) getPackagedElements())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT__REALIZATION :
-				return ((InternalEList<?>) getRealizations())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.COMPONENT__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.COMPONENT__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__OWNED_CONNECTOR:
+			return ((InternalEList<?>) getOwnedConnectors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__INTERFACE_REALIZATION:
+			return ((InternalEList<?>) getInterfaceRealizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__OWNED_BEHAVIOR:
+			return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__OWNED_OPERATION:
+			return ((InternalEList<?>) getOwnedOperations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__NESTED_CLASSIFIER:
+			return ((InternalEList<?>) getNestedClassifiers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__OWNED_RECEPTION:
+			return ((InternalEList<?>) getOwnedReceptions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__PACKAGED_ELEMENT:
+			return ((InternalEList<?>) getPackagedElements()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT__REALIZATION:
+			return ((InternalEList<?>) getRealizations()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -630,138 +547,138 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.COMPONENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.COMPONENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.COMPONENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.COMPONENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.COMPONENT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.COMPONENT__NAME :
-				return getName();
-			case UMLPackage.COMPONENT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.COMPONENT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.COMPONENT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.COMPONENT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.COMPONENT__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.COMPONENT__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.COMPONENT__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.COMPONENT__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.COMPONENT__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.COMPONENT__MEMBER :
-				return getMembers();
-			case UMLPackage.COMPONENT__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.COMPONENT__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.COMPONENT__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.COMPONENT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.COMPONENT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.COMPONENT__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.COMPONENT__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.COMPONENT__FEATURE :
-				return getFeatures();
-			case UMLPackage.COMPONENT__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.COMPONENT__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.COMPONENT__GENERAL :
-				return getGenerals();
-			case UMLPackage.COMPONENT__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.COMPONENT__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.COMPONENT__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.COMPONENT__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.COMPONENT__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.COMPONENT__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.COMPONENT__USE_CASE :
-				return getUseCases();
-			case UMLPackage.COMPONENT__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.COMPONENT__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.COMPONENT__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.COMPONENT__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.COMPONENT__OWNED_CONNECTOR :
-				return getOwnedConnectors();
-			case UMLPackage.COMPONENT__PART :
-				return getParts();
-			case UMLPackage.COMPONENT__ROLE :
-				return getRoles();
-			case UMLPackage.COMPONENT__OWNED_PORT :
-				return getOwnedPorts();
-			case UMLPackage.COMPONENT__CLASSIFIER_BEHAVIOR :
-				if (resolve)
-					return getClassifierBehavior();
-				return basicGetClassifierBehavior();
-			case UMLPackage.COMPONENT__INTERFACE_REALIZATION :
-				return getInterfaceRealizations();
-			case UMLPackage.COMPONENT__OWNED_BEHAVIOR :
-				return getOwnedBehaviors();
-			case UMLPackage.COMPONENT__OWNED_OPERATION :
-				return getOwnedOperations();
-			case UMLPackage.COMPONENT__EXTENSION :
-				return getExtensions();
-			case UMLPackage.COMPONENT__IS_ACTIVE :
-				return isActive();
-			case UMLPackage.COMPONENT__NESTED_CLASSIFIER :
-				return getNestedClassifiers();
-			case UMLPackage.COMPONENT__OWNED_RECEPTION :
-				return getOwnedReceptions();
-			case UMLPackage.COMPONENT__SUPER_CLASS :
-				return getSuperClasses();
-			case UMLPackage.COMPONENT__IS_INDIRECTLY_INSTANTIATED :
-				return isIndirectlyInstantiated();
-			case UMLPackage.COMPONENT__PACKAGED_ELEMENT :
-				return getPackagedElements();
-			case UMLPackage.COMPONENT__PROVIDED :
-				return getProvideds();
-			case UMLPackage.COMPONENT__REALIZATION :
-				return getRealizations();
-			case UMLPackage.COMPONENT__REQUIRED :
-				return getRequireds();
+		case UMLPackage.COMPONENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.COMPONENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.COMPONENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.COMPONENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.COMPONENT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.COMPONENT__NAME:
+			return getName();
+		case UMLPackage.COMPONENT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.COMPONENT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.COMPONENT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.COMPONENT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.COMPONENT__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.COMPONENT__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.COMPONENT__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.COMPONENT__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.COMPONENT__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.COMPONENT__MEMBER:
+			return getMembers();
+		case UMLPackage.COMPONENT__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.COMPONENT__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.COMPONENT__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.COMPONENT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.COMPONENT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.COMPONENT__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.COMPONENT__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.COMPONENT__FEATURE:
+			return getFeatures();
+		case UMLPackage.COMPONENT__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.COMPONENT__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.COMPONENT__GENERAL:
+			return getGenerals();
+		case UMLPackage.COMPONENT__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.COMPONENT__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.COMPONENT__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.COMPONENT__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.COMPONENT__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.COMPONENT__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.COMPONENT__USE_CASE:
+			return getUseCases();
+		case UMLPackage.COMPONENT__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.COMPONENT__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.COMPONENT__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.COMPONENT__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.COMPONENT__OWNED_CONNECTOR:
+			return getOwnedConnectors();
+		case UMLPackage.COMPONENT__PART:
+			return getParts();
+		case UMLPackage.COMPONENT__ROLE:
+			return getRoles();
+		case UMLPackage.COMPONENT__OWNED_PORT:
+			return getOwnedPorts();
+		case UMLPackage.COMPONENT__CLASSIFIER_BEHAVIOR:
+			if (resolve)
+				return getClassifierBehavior();
+			return basicGetClassifierBehavior();
+		case UMLPackage.COMPONENT__INTERFACE_REALIZATION:
+			return getInterfaceRealizations();
+		case UMLPackage.COMPONENT__OWNED_BEHAVIOR:
+			return getOwnedBehaviors();
+		case UMLPackage.COMPONENT__OWNED_OPERATION:
+			return getOwnedOperations();
+		case UMLPackage.COMPONENT__EXTENSION:
+			return getExtensions();
+		case UMLPackage.COMPONENT__IS_ACTIVE:
+			return isActive();
+		case UMLPackage.COMPONENT__NESTED_CLASSIFIER:
+			return getNestedClassifiers();
+		case UMLPackage.COMPONENT__OWNED_RECEPTION:
+			return getOwnedReceptions();
+		case UMLPackage.COMPONENT__SUPER_CLASS:
+			return getSuperClasses();
+		case UMLPackage.COMPONENT__IS_INDIRECTLY_INSTANTIATED:
+			return isIndirectlyInstantiated();
+		case UMLPackage.COMPONENT__PACKAGED_ELEMENT:
+			return getPackagedElements();
+		case UMLPackage.COMPONENT__PROVIDED:
+			return getProvideds();
+		case UMLPackage.COMPONENT__REALIZATION:
+			return getRealizations();
+		case UMLPackage.COMPONENT__REQUIRED:
+			return getRequireds();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -775,167 +692,144 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.COMPONENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.COMPONENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.COMPONENT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.COMPONENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.COMPONENT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.COMPONENT__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.COMPONENT__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.COMPONENT__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.COMPONENT__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.COMPONENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.COMPONENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.COMPONENT__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.COMPONENT__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.COMPONENT__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.COMPONENT__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.COMPONENT__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.COMPONENT__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.COMPONENT__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.COMPONENT__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.COMPONENT__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.COMPONENT__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.COMPONENT__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.COMPONENT__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.COMPONENT__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.COMPONENT__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.COMPONENT__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				getOwnedConnectors()
-					.addAll((Collection<? extends Connector>) newValue);
-				return;
-			case UMLPackage.COMPONENT__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) newValue);
-				return;
-			case UMLPackage.COMPONENT__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll(
-					(Collection<? extends InterfaceRealization>) newValue);
-				return;
-			case UMLPackage.COMPONENT__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				getOwnedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.COMPONENT__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
-			case UMLPackage.COMPONENT__IS_ACTIVE :
-				setIsActive((Boolean) newValue);
-				return;
-			case UMLPackage.COMPONENT__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				getNestedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.COMPONENT__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				getOwnedReceptions()
-					.addAll((Collection<? extends Reception>) newValue);
-				return;
-			case UMLPackage.COMPONENT__SUPER_CLASS :
-				getSuperClasses().clear();
-				getSuperClasses().addAll(
-					(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
-				return;
-			case UMLPackage.COMPONENT__IS_INDIRECTLY_INSTANTIATED :
-				setIsIndirectlyInstantiated((Boolean) newValue);
-				return;
-			case UMLPackage.COMPONENT__PACKAGED_ELEMENT :
-				getPackagedElements().clear();
-				getPackagedElements().addAll(
-					(Collection<? extends PackageableElement>) newValue);
-				return;
-			case UMLPackage.COMPONENT__REALIZATION :
-				getRealizations().clear();
-				getRealizations().addAll(
-					(Collection<? extends ComponentRealization>) newValue);
-				return;
+		case UMLPackage.COMPONENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.COMPONENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.COMPONENT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.COMPONENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.COMPONENT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.COMPONENT__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.COMPONENT__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.COMPONENT__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.COMPONENT__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.COMPONENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.COMPONENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.COMPONENT__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.COMPONENT__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.COMPONENT__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.COMPONENT__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.COMPONENT__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.COMPONENT__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.COMPONENT__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.COMPONENT__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.COMPONENT__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.COMPONENT__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.COMPONENT__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.COMPONENT__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.COMPONENT__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.COMPONENT__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.COMPONENT__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			getOwnedConnectors().addAll((Collection<? extends Connector>) newValue);
+			return;
+		case UMLPackage.COMPONENT__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) newValue);
+			return;
+		case UMLPackage.COMPONENT__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			getInterfaceRealizations().addAll((Collection<? extends InterfaceRealization>) newValue);
+			return;
+		case UMLPackage.COMPONENT__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			getOwnedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.COMPONENT__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
+		case UMLPackage.COMPONENT__IS_ACTIVE:
+			setIsActive((Boolean) newValue);
+			return;
+		case UMLPackage.COMPONENT__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			getNestedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.COMPONENT__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			getOwnedReceptions().addAll((Collection<? extends Reception>) newValue);
+			return;
+		case UMLPackage.COMPONENT__SUPER_CLASS:
+			getSuperClasses().clear();
+			getSuperClasses().addAll((Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
+			return;
+		case UMLPackage.COMPONENT__IS_INDIRECTLY_INSTANTIATED:
+			setIsIndirectlyInstantiated((Boolean) newValue);
+			return;
+		case UMLPackage.COMPONENT__PACKAGED_ELEMENT:
+			getPackagedElements().clear();
+			getPackagedElements().addAll((Collection<? extends PackageableElement>) newValue);
+			return;
+		case UMLPackage.COMPONENT__REALIZATION:
+			getRealizations().clear();
+			getRealizations().addAll((Collection<? extends ComponentRealization>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -948,121 +842,120 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.COMPONENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.COMPONENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.COMPONENT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.COMPONENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.COMPONENT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.COMPONENT__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.COMPONENT__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.COMPONENT__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.COMPONENT__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.COMPONENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.COMPONENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.COMPONENT__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.COMPONENT__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.COMPONENT__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.COMPONENT__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.COMPONENT__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.COMPONENT__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.COMPONENT__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.COMPONENT__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.COMPONENT__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.COMPONENT__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.COMPONENT__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.COMPONENT__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.COMPONENT__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.COMPONENT__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.COMPONENT__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				return;
-			case UMLPackage.COMPONENT__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) null);
-				return;
-			case UMLPackage.COMPONENT__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				return;
-			case UMLPackage.COMPONENT__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				return;
-			case UMLPackage.COMPONENT__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
-			case UMLPackage.COMPONENT__IS_ACTIVE :
-				setIsActive(IS_ACTIVE_EDEFAULT);
-				return;
-			case UMLPackage.COMPONENT__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				return;
-			case UMLPackage.COMPONENT__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				return;
-			case UMLPackage.COMPONENT__SUPER_CLASS :
-				getSuperClasses().clear();
-				return;
-			case UMLPackage.COMPONENT__IS_INDIRECTLY_INSTANTIATED :
-				setIsIndirectlyInstantiated(
-					IS_INDIRECTLY_INSTANTIATED_EDEFAULT);
-				return;
-			case UMLPackage.COMPONENT__PACKAGED_ELEMENT :
-				getPackagedElements().clear();
-				return;
-			case UMLPackage.COMPONENT__REALIZATION :
-				getRealizations().clear();
-				return;
+		case UMLPackage.COMPONENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.COMPONENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.COMPONENT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.COMPONENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.COMPONENT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.COMPONENT__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.COMPONENT__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.COMPONENT__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.COMPONENT__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.COMPONENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.COMPONENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.COMPONENT__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.COMPONENT__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.COMPONENT__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.COMPONENT__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.COMPONENT__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.COMPONENT__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.COMPONENT__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.COMPONENT__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.COMPONENT__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.COMPONENT__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.COMPONENT__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.COMPONENT__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.COMPONENT__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.COMPONENT__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.COMPONENT__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			return;
+		case UMLPackage.COMPONENT__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) null);
+			return;
+		case UMLPackage.COMPONENT__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			return;
+		case UMLPackage.COMPONENT__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			return;
+		case UMLPackage.COMPONENT__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
+		case UMLPackage.COMPONENT__IS_ACTIVE:
+			setIsActive(IS_ACTIVE_EDEFAULT);
+			return;
+		case UMLPackage.COMPONENT__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			return;
+		case UMLPackage.COMPONENT__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			return;
+		case UMLPackage.COMPONENT__SUPER_CLASS:
+			getSuperClasses().clear();
+			return;
+		case UMLPackage.COMPONENT__IS_INDIRECTLY_INSTANTIATED:
+			setIsIndirectlyInstantiated(IS_INDIRECTLY_INSTANTIATED_EDEFAULT);
+			return;
+		case UMLPackage.COMPONENT__PACKAGED_ELEMENT:
+			getPackagedElements().clear();
+			return;
+		case UMLPackage.COMPONENT__REALIZATION:
+			getRealizations().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1075,122 +968,120 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.COMPONENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.COMPONENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.COMPONENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.COMPONENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.COMPONENT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.COMPONENT__NAME :
-				return isSetName();
-			case UMLPackage.COMPONENT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.COMPONENT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.COMPONENT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.COMPONENT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.COMPONENT__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.COMPONENT__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.COMPONENT__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.COMPONENT__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.COMPONENT__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.COMPONENT__MEMBER :
-				return isSetMembers();
-			case UMLPackage.COMPONENT__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.COMPONENT__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.COMPONENT__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.COMPONENT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.COMPONENT__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.COMPONENT__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.COMPONENT__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.COMPONENT__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.COMPONENT__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.COMPONENT__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.COMPONENT__GENERAL :
-				return isSetGenerals();
-			case UMLPackage.COMPONENT__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.COMPONENT__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.COMPONENT__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.COMPONENT__IS_ABSTRACT :
-				return isSetIsAbstract();
-			case UMLPackage.COMPONENT__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.COMPONENT__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.COMPONENT__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.COMPONENT__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.COMPONENT__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.COMPONENT__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.COMPONENT__OWNED_ATTRIBUTE :
-				return isSetOwnedAttributes();
-			case UMLPackage.COMPONENT__OWNED_CONNECTOR :
-				return !getOwnedConnectors().isEmpty();
-			case UMLPackage.COMPONENT__PART :
-				return !getParts().isEmpty();
-			case UMLPackage.COMPONENT__ROLE :
-				return isSetRoles();
-			case UMLPackage.COMPONENT__OWNED_PORT :
-				return !getOwnedPorts().isEmpty();
-			case UMLPackage.COMPONENT__CLASSIFIER_BEHAVIOR :
-				return basicGetClassifierBehavior() != null;
-			case UMLPackage.COMPONENT__INTERFACE_REALIZATION :
-				return !getInterfaceRealizations().isEmpty();
-			case UMLPackage.COMPONENT__OWNED_BEHAVIOR :
-				return !getOwnedBehaviors().isEmpty();
-			case UMLPackage.COMPONENT__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
-			case UMLPackage.COMPONENT__EXTENSION :
-				return !getExtensions().isEmpty();
-			case UMLPackage.COMPONENT__IS_ACTIVE :
-				return isActive() != IS_ACTIVE_EDEFAULT;
-			case UMLPackage.COMPONENT__NESTED_CLASSIFIER :
-				return !getNestedClassifiers().isEmpty();
-			case UMLPackage.COMPONENT__OWNED_RECEPTION :
-				return !getOwnedReceptions().isEmpty();
-			case UMLPackage.COMPONENT__SUPER_CLASS :
-				return isSetSuperClasses();
-			case UMLPackage.COMPONENT__IS_INDIRECTLY_INSTANTIATED :
-				return isIndirectlyInstantiated() != IS_INDIRECTLY_INSTANTIATED_EDEFAULT;
-			case UMLPackage.COMPONENT__PACKAGED_ELEMENT :
-				return !getPackagedElements().isEmpty();
-			case UMLPackage.COMPONENT__PROVIDED :
-				return !getProvideds().isEmpty();
-			case UMLPackage.COMPONENT__REALIZATION :
-				return !getRealizations().isEmpty();
-			case UMLPackage.COMPONENT__REQUIRED :
-				return !getRequireds().isEmpty();
+		case UMLPackage.COMPONENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.COMPONENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.COMPONENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.COMPONENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.COMPONENT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.COMPONENT__NAME:
+			return isSetName();
+		case UMLPackage.COMPONENT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.COMPONENT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.COMPONENT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.COMPONENT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.COMPONENT__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.COMPONENT__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.COMPONENT__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.COMPONENT__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.COMPONENT__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.COMPONENT__MEMBER:
+			return isSetMembers();
+		case UMLPackage.COMPONENT__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.COMPONENT__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.COMPONENT__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.COMPONENT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.COMPONENT__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.COMPONENT__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.COMPONENT__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.COMPONENT__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.COMPONENT__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.COMPONENT__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.COMPONENT__GENERAL:
+			return isSetGenerals();
+		case UMLPackage.COMPONENT__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.COMPONENT__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.COMPONENT__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.COMPONENT__IS_ABSTRACT:
+			return isSetIsAbstract();
+		case UMLPackage.COMPONENT__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.COMPONENT__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.COMPONENT__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.COMPONENT__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.COMPONENT__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.COMPONENT__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.COMPONENT__OWNED_ATTRIBUTE:
+			return isSetOwnedAttributes();
+		case UMLPackage.COMPONENT__OWNED_CONNECTOR:
+			return !getOwnedConnectors().isEmpty();
+		case UMLPackage.COMPONENT__PART:
+			return !getParts().isEmpty();
+		case UMLPackage.COMPONENT__ROLE:
+			return isSetRoles();
+		case UMLPackage.COMPONENT__OWNED_PORT:
+			return !getOwnedPorts().isEmpty();
+		case UMLPackage.COMPONENT__CLASSIFIER_BEHAVIOR:
+			return basicGetClassifierBehavior() != null;
+		case UMLPackage.COMPONENT__INTERFACE_REALIZATION:
+			return !getInterfaceRealizations().isEmpty();
+		case UMLPackage.COMPONENT__OWNED_BEHAVIOR:
+			return !getOwnedBehaviors().isEmpty();
+		case UMLPackage.COMPONENT__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
+		case UMLPackage.COMPONENT__EXTENSION:
+			return !getExtensions().isEmpty();
+		case UMLPackage.COMPONENT__IS_ACTIVE:
+			return isActive() != IS_ACTIVE_EDEFAULT;
+		case UMLPackage.COMPONENT__NESTED_CLASSIFIER:
+			return !getNestedClassifiers().isEmpty();
+		case UMLPackage.COMPONENT__OWNED_RECEPTION:
+			return !getOwnedReceptions().isEmpty();
+		case UMLPackage.COMPONENT__SUPER_CLASS:
+			return isSetSuperClasses();
+		case UMLPackage.COMPONENT__IS_INDIRECTLY_INSTANTIATED:
+			return isIndirectlyInstantiated() != IS_INDIRECTLY_INSTANTIATED_EDEFAULT;
+		case UMLPackage.COMPONENT__PACKAGED_ELEMENT:
+			return !getPackagedElements().isEmpty();
+		case UMLPackage.COMPONENT__PROVIDED:
+			return !getProvideds().isEmpty();
+		case UMLPackage.COMPONENT__REALIZATION:
+			return !getRealizations().isEmpty();
+		case UMLPackage.COMPONENT__REQUIRED:
+			return !getRequireds().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1205,323 +1096,257 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.COMPONENT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.COMPONENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.COMPONENT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.COMPONENT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.COMPONENT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.COMPONENT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.COMPONENT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.COMPONENT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.COMPONENT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.COMPONENT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.COMPONENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.COMPONENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.COMPONENT___GET_MODEL :
-				return getModel();
-			case UMLPackage.COMPONENT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.COMPONENT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.COMPONENT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.COMPONENT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.COMPONENT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.COMPONENT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.COMPONENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.COMPONENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.COMPONENT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.COMPONENT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.COMPONENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.COMPONENT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.COMPONENT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.COMPONENT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.COMPONENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.COMPONENT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.COMPONENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.COMPONENT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.COMPONENT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.COMPONENT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.COMPONENT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.COMPONENT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.COMPONENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.COMPONENT___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.COMPONENT___GET_LABEL :
-				return getLabel();
-			case UMLPackage.COMPONENT___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.COMPONENT___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.COMPONENT___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.COMPONENT___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.COMPONENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.COMPONENT___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.COMPONENT___SEPARATOR :
-				return separator();
-			case UMLPackage.COMPONENT___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.COMPONENT___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.COMPONENT___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.COMPONENT___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.COMPONENT___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.COMPONENT___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.COMPONENT___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.COMPONENT___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.COMPONENT___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.COMPONENT___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.COMPONENT___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.COMPONENT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.COMPONENT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.COMPONENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.COMPONENT___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.COMPONENT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.COMPONENT___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.COMPONENT___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.COMPONENT___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.COMPONENT___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.COMPONENT___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.COMPONENT___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.COMPONENT___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.COMPONENT___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.COMPONENT___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.COMPONENT___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.COMPONENT___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.COMPONENT___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.COMPONENT___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.COMPONENT___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.COMPONENT___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.COMPONENT___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.COMPONENT___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.COMPONENT___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.COMPONENT___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.COMPONENT___PARENTS :
-				return parents();
-			case UMLPackage.COMPONENT___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.COMPONENT___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.COMPONENT___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.COMPONENT___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.COMPONENT___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.COMPONENT___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.COMPONENT___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.COMPONENT___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.COMPONENT___GET_PARTS :
-				return getParts();
-			case UMLPackage.COMPONENT___ALL_ROLES :
-				return allRoles();
-			case UMLPackage.COMPONENT___GET_OWNED_PORTS :
-				return getOwnedPorts();
-			case UMLPackage.COMPONENT___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateClassBehavior((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___GET_ALL_IMPLEMENTED_INTERFACES :
-				return getAllImplementedInterfaces();
-			case UMLPackage.COMPONENT___GET_IMPLEMENTED_INTERFACES :
-				return getImplementedInterfaces();
-			case UMLPackage.COMPONENT___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP :
-				return validatePassiveClass((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
-			case UMLPackage.COMPONENT___IS_METACLASS :
-				return isMetaclass();
-			case UMLPackage.COMPONENT___GET_EXTENSIONS :
-				return getExtensions();
-			case UMLPackage.COMPONENT___GET_SUPER_CLASSES :
-				return getSuperClasses();
-			case UMLPackage.COMPONENT___VALIDATE_NO_NESTED_CLASSIFIERS__DIAGNOSTICCHAIN_MAP :
-				return validateNoNestedClassifiers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___VALIDATE_NO_PACKAGED_ELEMENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNoPackagedElements(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.COMPONENT___CREATE_OWNED_CLASS__STRING_BOOLEAN :
-				return createOwnedClass((String) arguments.get(0),
-					(Boolean) arguments.get(1));
-			case UMLPackage.COMPONENT___CREATE_OWNED_ENUMERATION__STRING :
-				return createOwnedEnumeration((String) arguments.get(0));
-			case UMLPackage.COMPONENT___CREATE_OWNED_INTERFACE__STRING :
-				return createOwnedInterface((String) arguments.get(0));
-			case UMLPackage.COMPONENT___CREATE_OWNED_PRIMITIVE_TYPE__STRING :
-				return createOwnedPrimitiveType((String) arguments.get(0));
-			case UMLPackage.COMPONENT___GET_PROVIDEDS :
-				return getProvideds();
-			case UMLPackage.COMPONENT___GET_REQUIREDS :
-				return getRequireds();
+		case UMLPackage.COMPONENT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.COMPONENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.COMPONENT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.COMPONENT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.COMPONENT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.COMPONENT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.COMPONENT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.COMPONENT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.COMPONENT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.COMPONENT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.COMPONENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.COMPONENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.COMPONENT___GET_MODEL:
+			return getModel();
+		case UMLPackage.COMPONENT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.COMPONENT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.COMPONENT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.COMPONENT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.COMPONENT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.COMPONENT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.COMPONENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.COMPONENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.COMPONENT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.COMPONENT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.COMPONENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.COMPONENT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.COMPONENT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.COMPONENT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.COMPONENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.COMPONENT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.COMPONENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.COMPONENT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.COMPONENT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.COMPONENT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.COMPONENT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.COMPONENT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.COMPONENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.COMPONENT___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.COMPONENT___GET_LABEL:
+			return getLabel();
+		case UMLPackage.COMPONENT___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.COMPONENT___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.COMPONENT___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.COMPONENT___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.COMPONENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.COMPONENT___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.COMPONENT___SEPARATOR:
+			return separator();
+		case UMLPackage.COMPONENT___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.COMPONENT___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.COMPONENT___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.COMPONENT___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.COMPONENT___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.COMPONENT___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.COMPONENT___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.COMPONENT___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.COMPONENT___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.COMPONENT___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.COMPONENT___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.COMPONENT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.COMPONENT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.COMPONENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.COMPONENT___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.COMPONENT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.COMPONENT___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.COMPONENT___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.COMPONENT___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.COMPONENT___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.COMPONENT___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.COMPONENT___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.COMPONENT___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.COMPONENT___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.COMPONENT___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.COMPONENT___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.COMPONENT___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.COMPONENT___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.COMPONENT___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.COMPONENT___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.COMPONENT___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.COMPONENT___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.COMPONENT___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.COMPONENT___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.COMPONENT___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.COMPONENT___PARENTS:
+			return parents();
+		case UMLPackage.COMPONENT___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.COMPONENT___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.COMPONENT___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.COMPONENT___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.COMPONENT___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.COMPONENT___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.COMPONENT___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.COMPONENT___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.COMPONENT___GET_PARTS:
+			return getParts();
+		case UMLPackage.COMPONENT___ALL_ROLES:
+			return allRoles();
+		case UMLPackage.COMPONENT___GET_OWNED_PORTS:
+			return getOwnedPorts();
+		case UMLPackage.COMPONENT___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateClassBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___GET_ALL_IMPLEMENTED_INTERFACES:
+			return getAllImplementedInterfaces();
+		case UMLPackage.COMPONENT___GET_IMPLEMENTED_INTERFACES:
+			return getImplementedInterfaces();
+		case UMLPackage.COMPONENT___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP:
+			return validatePassiveClass((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.COMPONENT___IS_METACLASS:
+			return isMetaclass();
+		case UMLPackage.COMPONENT___GET_EXTENSIONS:
+			return getExtensions();
+		case UMLPackage.COMPONENT___GET_SUPER_CLASSES:
+			return getSuperClasses();
+		case UMLPackage.COMPONENT___VALIDATE_NO_NESTED_CLASSIFIERS__DIAGNOSTICCHAIN_MAP:
+			return validateNoNestedClassifiers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___VALIDATE_NO_PACKAGED_ELEMENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNoPackagedElements((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.COMPONENT___CREATE_OWNED_CLASS__STRING_BOOLEAN:
+			return createOwnedClass((String) arguments.get(0), (Boolean) arguments.get(1));
+		case UMLPackage.COMPONENT___CREATE_OWNED_ENUMERATION__STRING:
+			return createOwnedEnumeration((String) arguments.get(0));
+		case UMLPackage.COMPONENT___CREATE_OWNED_INTERFACE__STRING:
+			return createOwnedInterface((String) arguments.get(0));
+		case UMLPackage.COMPONENT___CREATE_OWNED_PRIMITIVE_TYPE__STRING:
+			return createOwnedPrimitiveType((String) arguments.get(0));
+		case UMLPackage.COMPONENT___GET_PROVIDEDS:
+			return getProvideds();
+		case UMLPackage.COMPONENT___GET_REQUIREDS:
+			return getRequireds();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1534,15 +1359,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.COMPONENT__OWNED_RULE, UMLPackage.COMPONENT__OWNED_USE_CASE,
-		UMLPackage.COMPONENT__OWNED_ATTRIBUTE,
-		UMLPackage.COMPONENT__OWNED_CONNECTOR,
-		UMLPackage.COMPONENT__OWNED_BEHAVIOR,
-		UMLPackage.COMPONENT__OWNED_OPERATION,
-		UMLPackage.COMPONENT__NESTED_CLASSIFIER,
-		UMLPackage.COMPONENT__OWNED_RECEPTION,
-		UMLPackage.COMPONENT__PACKAGED_ELEMENT};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.COMPONENT__OWNED_RULE, UMLPackage.COMPONENT__OWNED_USE_CASE, UMLPackage.COMPONENT__OWNED_ATTRIBUTE, UMLPackage.COMPONENT__OWNED_CONNECTOR, UMLPackage.COMPONENT__OWNED_BEHAVIOR,
+			UMLPackage.COMPONENT__OWNED_OPERATION, UMLPackage.COMPONENT__NESTED_CLASSIFIER, UMLPackage.COMPONENT__OWNED_RECEPTION, UMLPackage.COMPONENT__PACKAGED_ELEMENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1552,7 +1370,7 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.COMPONENT__PACKAGED_ELEMENT);
+				|| eIsSet(UMLPackage.COMPONENT__PACKAGED_ELEMENT);
 	}
 
 	/**
@@ -1563,19 +1381,9 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.COMPONENT__OWNED_COMMENT,
-		UMLPackage.COMPONENT__NAME_EXPRESSION,
-		UMLPackage.COMPONENT__ELEMENT_IMPORT,
-		UMLPackage.COMPONENT__PACKAGE_IMPORT,
-		UMLPackage.COMPONENT__OWNED_MEMBER,
-		UMLPackage.COMPONENT__TEMPLATE_BINDING,
-		UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE,
-		UMLPackage.COMPONENT__COLLABORATION_USE,
-		UMLPackage.COMPONENT__GENERALIZATION,
-		UMLPackage.COMPONENT__SUBSTITUTION,
-		UMLPackage.COMPONENT__INTERFACE_REALIZATION,
-		UMLPackage.COMPONENT__REALIZATION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.COMPONENT__OWNED_COMMENT, UMLPackage.COMPONENT__NAME_EXPRESSION, UMLPackage.COMPONENT__ELEMENT_IMPORT, UMLPackage.COMPONENT__PACKAGE_IMPORT, UMLPackage.COMPONENT__OWNED_MEMBER,
+			UMLPackage.COMPONENT__TEMPLATE_BINDING, UMLPackage.COMPONENT__OWNED_TEMPLATE_SIGNATURE, UMLPackage.COMPONENT__COLLABORATION_USE, UMLPackage.COMPONENT__GENERALIZATION, UMLPackage.COMPONENT__SUBSTITUTION, UMLPackage.COMPONENT__INTERFACE_REALIZATION,
+			UMLPackage.COMPONENT__REALIZATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1585,7 +1393,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.COMPONENT__REALIZATION);
+				|| eIsSet(UMLPackage.COMPONENT__REALIZATION);
 	}
 
 } //ComponentImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ComponentRealizationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ComponentRealizationImpl.java
index 9a3b435..973f0ca 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ComponentRealizationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ComponentRealizationImpl.java
@@ -1,28 +1,40 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Eike Stepper - 540786
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
 
+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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectResolvingEList;
+
 import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Component;
@@ -75,17 +87,9 @@
 		return UMLPackage.Literals.COMPONENT_REALIZATION;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.DEPENDENCY__CLIENT) {
 			return createClientsList();
 		}
@@ -109,9 +113,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -122,15 +124,13 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<NamedElement> getClients() {
-		return (EList<NamedElement>) eDynamicGet(
-			UMLPackage.COMPONENT_REALIZATION__CLIENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPENDENCY__CLIENT, true, true);
+		return (EList<NamedElement>) eDynamicGet(UMLPackage.COMPONENT_REALIZATION__CLIENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPENDENCY__CLIENT, true, true);
 	}
 
 	private EList<NamedElement> createClientsList() {
 		return new SubsetSupersetEObjectResolvingEList<NamedElement>(
-			NamedElement.class, this, UMLPackage.COMPONENT_REALIZATION__CLIENT,
-			null, CLIENT_ESUBSETS);
+				NamedElement.class, this, UMLPackage.COMPONENT_REALIZATION__CLIENT,
+				null, CLIENT_ESUBSETS);
 	}
 
 	/**
@@ -141,8 +141,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] CLIENT_ESUBSETS = new int[]{
-		UMLPackage.COMPONENT_REALIZATION__REALIZING_CLASSIFIER};
+	protected static final int[] CLIENT_ESUBSETS = new int[] { UMLPackage.COMPONENT_REALIZATION__REALIZING_CLASSIFIER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -152,16 +151,14 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<NamedElement> getSuppliers() {
-		return (EList<NamedElement>) eDynamicGet(
-			UMLPackage.COMPONENT_REALIZATION__SUPPLIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPENDENCY__SUPPLIER, true, true);
+		return (EList<NamedElement>) eDynamicGet(UMLPackage.COMPONENT_REALIZATION__SUPPLIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPENDENCY__SUPPLIER, true, true);
 	}
 
 	private EList<NamedElement> createSuppliersList() {
 		return new SubsetSupersetEObjectResolvingEList<NamedElement>(
-			NamedElement.class, this,
-			UMLPackage.COMPONENT_REALIZATION__SUPPLIER, null,
-			SUPPLIER_ESUBSETS);
+				NamedElement.class, this,
+				UMLPackage.COMPONENT_REALIZATION__SUPPLIER, null,
+				SUPPLIER_ESUBSETS);
 	}
 
 	/**
@@ -172,8 +169,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SUPPLIER_ESUBSETS = new int[]{
-		UMLPackage.COMPONENT_REALIZATION__ABSTRACTION};
+	protected static final int[] SUPPLIER_ESUBSETS = new int[] { UMLPackage.COMPONENT_REALIZATION__ABSTRACTION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -181,10 +177,7 @@
 	 * @generated
 	 */
 	public Component getAbstraction() {
-		return (Component) eDynamicGet(
-			UMLPackage.COMPONENT_REALIZATION__ABSTRACTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMPONENT_REALIZATION__ABSTRACTION, true, true);
+		return (Component) eDynamicGet(UMLPackage.COMPONENT_REALIZATION__ABSTRACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMPONENT_REALIZATION__ABSTRACTION, true, true);
 	}
 
 	/**
@@ -193,11 +186,7 @@
 	 * @generated
 	 */
 	public Component basicGetAbstraction() {
-		return (Component) eDynamicGet(
-			UMLPackage.COMPONENT_REALIZATION__ABSTRACTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMPONENT_REALIZATION__ABSTRACTION, false,
-			true);
+		return (Component) eDynamicGet(UMLPackage.COMPONENT_REALIZATION__ABSTRACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMPONENT_REALIZATION__ABSTRACTION, false, true);
 	}
 
 	/**
@@ -207,8 +196,7 @@
 	 */
 	public NotificationChain basicSetAbstraction(Component newAbstraction,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newAbstraction,
-			UMLPackage.COMPONENT_REALIZATION__ABSTRACTION, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newAbstraction, UMLPackage.COMPONENT_REALIZATION__ABSTRACTION, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newAbstraction != null) {
@@ -227,11 +215,7 @@
 	 * @generated
 	 */
 	public void setAbstraction(Component newAbstraction) {
-		eDynamicSet(
-			UMLPackage.COMPONENT_REALIZATION__ABSTRACTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMPONENT_REALIZATION__ABSTRACTION,
-			newAbstraction);
+		eDynamicSet(UMLPackage.COMPONENT_REALIZATION__ABSTRACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMPONENT_REALIZATION__ABSTRACTION, newAbstraction);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newAbstraction != null) {
@@ -250,18 +234,14 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Classifier> getRealizingClassifiers() {
-		return (EList<Classifier>) eDynamicGet(
-			UMLPackage.COMPONENT_REALIZATION__REALIZING_CLASSIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.COMPONENT_REALIZATION__REALIZING_CLASSIFIER,
-			true, true);
+		return (EList<Classifier>) eDynamicGet(UMLPackage.COMPONENT_REALIZATION__REALIZING_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.COMPONENT_REALIZATION__REALIZING_CLASSIFIER, true, true);
 	}
 
 	private EList<Classifier> createRealizingClassifiersList() {
 		return new SubsetSupersetEObjectResolvingEList<Classifier>(
-			Classifier.class, this,
-			UMLPackage.COMPONENT_REALIZATION__REALIZING_CLASSIFIER,
-			REALIZING_CLASSIFIER_ESUPERSETS, null);
+				Classifier.class, this,
+				UMLPackage.COMPONENT_REALIZATION__REALIZING_CLASSIFIER,
+				REALIZING_CLASSIFIER_ESUPERSETS, null);
 	}
 
 	/**
@@ -272,8 +252,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REALIZING_CLASSIFIER_ESUPERSETS = new int[]{
-		UMLPackage.COMPONENT_REALIZATION__CLIENT};
+	protected static final int[] REALIZING_CLASSIFIER_ESUPERSETS = new int[] { UMLPackage.COMPONENT_REALIZATION__CLIENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -291,12 +270,10 @@
 	 */
 	public Classifier getRealizingClassifier(String name, boolean ignoreCase,
 			EClass eClass) {
-		realizingClassifierLoop : for (Classifier realizingClassifier : getRealizingClassifiers()) {
+		realizingClassifierLoop: for (Classifier realizingClassifier : getRealizingClassifiers()) {
 			if (eClass != null && !eClass.isInstance(realizingClassifier))
 				continue realizingClassifierLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(realizingClassifier.getName())
-				: name.equals(realizingClassifier.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(realizingClassifier.getName()) : name.equals(realizingClassifier.getName())))
 				continue realizingClassifierLoop;
 			return realizingClassifier;
 		}
@@ -313,27 +290,21 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.COMPONENT_REALIZATION__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.COMPONENT_REALIZATION__ABSTRACTION :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetAbstraction((Component) otherEnd, msgs);
+		case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.COMPONENT_REALIZATION__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.COMPONENT_REALIZATION__ABSTRACTION:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetAbstraction((Component) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -347,22 +318,20 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT_REALIZATION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.COMPONENT_REALIZATION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.COMPONENT_REALIZATION__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.COMPONENT_REALIZATION__MAPPING :
-				return basicSetMapping(null, msgs);
-			case UMLPackage.COMPONENT_REALIZATION__ABSTRACTION :
-				return basicSetAbstraction(null, msgs);
+		case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT_REALIZATION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.COMPONENT_REALIZATION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.COMPONENT_REALIZATION__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.COMPONENT_REALIZATION__MAPPING:
+			return basicSetMapping(null, msgs);
+		case UMLPackage.COMPONENT_REALIZATION__ABSTRACTION:
+			return basicSetAbstraction(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -376,13 +345,10 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
-			case UMLPackage.COMPONENT_REALIZATION__ABSTRACTION :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.COMPONENT__REALIZATION, Component.class, msgs);
+		case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+		case UMLPackage.COMPONENT_REALIZATION__ABSTRACTION:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.COMPONENT__REALIZATION, Component.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -395,60 +361,60 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.COMPONENT_REALIZATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.COMPONENT_REALIZATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.COMPONENT_REALIZATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.COMPONENT_REALIZATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.COMPONENT_REALIZATION__NAME :
-				return getName();
-			case UMLPackage.COMPONENT_REALIZATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.COMPONENT_REALIZATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.COMPONENT_REALIZATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.COMPONENT_REALIZATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.COMPONENT_REALIZATION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.COMPONENT_REALIZATION__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.COMPONENT_REALIZATION__SOURCE :
-				return getSources();
-			case UMLPackage.COMPONENT_REALIZATION__TARGET :
-				return getTargets();
-			case UMLPackage.COMPONENT_REALIZATION__CLIENT :
-				return getClients();
-			case UMLPackage.COMPONENT_REALIZATION__SUPPLIER :
-				return getSuppliers();
-			case UMLPackage.COMPONENT_REALIZATION__MAPPING :
-				if (resolve)
-					return getMapping();
-				return basicGetMapping();
-			case UMLPackage.COMPONENT_REALIZATION__REALIZING_CLASSIFIER :
-				return getRealizingClassifiers();
-			case UMLPackage.COMPONENT_REALIZATION__ABSTRACTION :
-				if (resolve)
-					return getAbstraction();
-				return basicGetAbstraction();
+		case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.COMPONENT_REALIZATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.COMPONENT_REALIZATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.COMPONENT_REALIZATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.COMPONENT_REALIZATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.COMPONENT_REALIZATION__NAME:
+			return getName();
+		case UMLPackage.COMPONENT_REALIZATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.COMPONENT_REALIZATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.COMPONENT_REALIZATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.COMPONENT_REALIZATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.COMPONENT_REALIZATION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.COMPONENT_REALIZATION__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.COMPONENT_REALIZATION__SOURCE:
+			return getSources();
+		case UMLPackage.COMPONENT_REALIZATION__TARGET:
+			return getTargets();
+		case UMLPackage.COMPONENT_REALIZATION__CLIENT:
+			return getClients();
+		case UMLPackage.COMPONENT_REALIZATION__SUPPLIER:
+			return getSuppliers();
+		case UMLPackage.COMPONENT_REALIZATION__MAPPING:
+			if (resolve)
+				return getMapping();
+			return basicGetMapping();
+		case UMLPackage.COMPONENT_REALIZATION__REALIZING_CLASSIFIER:
+			return getRealizingClassifiers();
+		case UMLPackage.COMPONENT_REALIZATION__ABSTRACTION:
+			if (resolve)
+				return getAbstraction();
+			return basicGetAbstraction();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -462,52 +428,47 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__CLIENT :
-				getClients().clear();
-				getClients()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__SUPPLIER :
-				getSuppliers().clear();
-				getSuppliers()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__MAPPING :
-				setMapping((OpaqueExpression) newValue);
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__REALIZING_CLASSIFIER :
-				getRealizingClassifiers().clear();
-				getRealizingClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__ABSTRACTION :
-				setAbstraction((Component) newValue);
-				return;
+		case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__CLIENT:
+			getClients().clear();
+			getClients().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__SUPPLIER:
+			getSuppliers().clear();
+			getSuppliers().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__MAPPING:
+			setMapping((OpaqueExpression) newValue);
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__REALIZING_CLASSIFIER:
+			getRealizingClassifiers().clear();
+			getRealizingClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__ABSTRACTION:
+			setAbstraction((Component) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -520,42 +481,42 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__CLIENT :
-				getClients().clear();
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__SUPPLIER :
-				getSuppliers().clear();
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__MAPPING :
-				setMapping((OpaqueExpression) null);
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__REALIZING_CLASSIFIER :
-				getRealizingClassifiers().clear();
-				return;
-			case UMLPackage.COMPONENT_REALIZATION__ABSTRACTION :
-				setAbstraction((Component) null);
-				return;
+		case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__CLIENT:
+			getClients().clear();
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__SUPPLIER:
+			getSuppliers().clear();
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__MAPPING:
+			setMapping((OpaqueExpression) null);
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__REALIZING_CLASSIFIER:
+			getRealizingClassifiers().clear();
+			return;
+		case UMLPackage.COMPONENT_REALIZATION__ABSTRACTION:
+			setAbstraction((Component) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -568,48 +529,46 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.COMPONENT_REALIZATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.COMPONENT_REALIZATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.COMPONENT_REALIZATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.COMPONENT_REALIZATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.COMPONENT_REALIZATION__NAME :
-				return isSetName();
-			case UMLPackage.COMPONENT_REALIZATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.COMPONENT_REALIZATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.COMPONENT_REALIZATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.COMPONENT_REALIZATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.COMPONENT_REALIZATION__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.COMPONENT_REALIZATION__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.COMPONENT_REALIZATION__SOURCE :
-				return isSetSources();
-			case UMLPackage.COMPONENT_REALIZATION__TARGET :
-				return isSetTargets();
-			case UMLPackage.COMPONENT_REALIZATION__CLIENT :
-				return !getClients().isEmpty();
-			case UMLPackage.COMPONENT_REALIZATION__SUPPLIER :
-				return !getSuppliers().isEmpty();
-			case UMLPackage.COMPONENT_REALIZATION__MAPPING :
-				return basicGetMapping() != null;
-			case UMLPackage.COMPONENT_REALIZATION__REALIZING_CLASSIFIER :
-				return !getRealizingClassifiers().isEmpty();
-			case UMLPackage.COMPONENT_REALIZATION__ABSTRACTION :
-				return basicGetAbstraction() != null;
+		case UMLPackage.COMPONENT_REALIZATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.COMPONENT_REALIZATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.COMPONENT_REALIZATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.COMPONENT_REALIZATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.COMPONENT_REALIZATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.COMPONENT_REALIZATION__NAME:
+			return isSetName();
+		case UMLPackage.COMPONENT_REALIZATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.COMPONENT_REALIZATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.COMPONENT_REALIZATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.COMPONENT_REALIZATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.COMPONENT_REALIZATION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.COMPONENT_REALIZATION__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.COMPONENT_REALIZATION__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.COMPONENT_REALIZATION__SOURCE:
+			return isSetSources();
+		case UMLPackage.COMPONENT_REALIZATION__TARGET:
+			return isSetTargets();
+		case UMLPackage.COMPONENT_REALIZATION__CLIENT:
+			return !getClients().isEmpty();
+		case UMLPackage.COMPONENT_REALIZATION__SUPPLIER:
+			return !getSuppliers().isEmpty();
+		case UMLPackage.COMPONENT_REALIZATION__MAPPING:
+			return basicGetMapping() != null;
+		case UMLPackage.COMPONENT_REALIZATION__REALIZING_CLASSIFIER:
+			return !getRealizingClassifiers().isEmpty();
+		case UMLPackage.COMPONENT_REALIZATION__ABSTRACTION:
+			return basicGetAbstraction() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -636,7 +595,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.COMPONENT_REALIZATION__ABSTRACTION);
+				|| eIsSet(UMLPackage.COMPONENT_REALIZATION__ABSTRACTION);
 	}
 
 } //ComponentRealizationImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConditionalNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConditionalNodeImpl.java
index b3c34db..0bd9a6d 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConditionalNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConditionalNodeImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 397139, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,8 +29,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -136,20 +140,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.CONDITIONAL_NODE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.CONDITIONAL_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.CONDITIONAL_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.CONDITIONAL_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -158,9 +155,7 @@
 	 * @generated
 	 */
 	public boolean isDeterminate() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.CONDITIONAL_NODE__IS_DETERMINATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONDITIONAL_NODE__IS_DETERMINATE, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.CONDITIONAL_NODE__IS_DETERMINATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONDITIONAL_NODE__IS_DETERMINATE, true, true);
 	}
 
 	/**
@@ -169,10 +164,7 @@
 	 * @generated
 	 */
 	public void setIsDeterminate(boolean newIsDeterminate) {
-		eDynamicSet(
-			UMLPackage.CONDITIONAL_NODE__IS_DETERMINATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONDITIONAL_NODE__IS_DETERMINATE,
-			newIsDeterminate);
+		eDynamicSet(UMLPackage.CONDITIONAL_NODE__IS_DETERMINATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONDITIONAL_NODE__IS_DETERMINATE, newIsDeterminate);
 	}
 
 	/**
@@ -181,9 +173,7 @@
 	 * @generated
 	 */
 	public boolean isAssured() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.CONDITIONAL_NODE__IS_ASSURED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONDITIONAL_NODE__IS_ASSURED, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.CONDITIONAL_NODE__IS_ASSURED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONDITIONAL_NODE__IS_ASSURED, true, true);
 	}
 
 	/**
@@ -192,9 +182,7 @@
 	 * @generated
 	 */
 	public void setIsAssured(boolean newIsAssured) {
-		eDynamicSet(
-			UMLPackage.CONDITIONAL_NODE__IS_ASSURED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONDITIONAL_NODE__IS_ASSURED, newIsAssured);
+		eDynamicSet(UMLPackage.CONDITIONAL_NODE__IS_ASSURED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONDITIONAL_NODE__IS_ASSURED, newIsAssured);
 	}
 
 	/**
@@ -204,9 +192,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Clause> getClauses() {
-		return (EList<Clause>) eDynamicGet(
-			UMLPackage.CONDITIONAL_NODE__CLAUSE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONDITIONAL_NODE__CLAUSE, true, true);
+		return (EList<Clause>) eDynamicGet(UMLPackage.CONDITIONAL_NODE__CLAUSE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONDITIONAL_NODE__CLAUSE, true, true);
 	}
 
 	/**
@@ -227,9 +213,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<OutputPin> getResults() {
-		return (EList<OutputPin>) eDynamicGet(
-			UMLPackage.CONDITIONAL_NODE__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONDITIONAL_NODE__RESULT, true, true);
+		return (EList<OutputPin>) eDynamicGet(UMLPackage.CONDITIONAL_NODE__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONDITIONAL_NODE__RESULT, true, true);
 	}
 
 	/**
@@ -238,8 +222,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		getResults().add(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -264,18 +247,14 @@
 	 */
 	public OutputPin getResult(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		resultLoop : for (OutputPin result : getResults()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(result.getName())
-				: name.equals(result.getName())))
+		resultLoop: for (OutputPin result : getResults()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(result.getName()) : name.equals(result.getName())))
 				continue resultLoop;
 			if (type != null && !type.equals(result.getType()))
 				continue resultLoop;
 			return result;
 		}
-		return createOnDemand
-			? createResult(name, type)
-			: null;
+		return createOnDemand ? createResult(name, type) : null;
 	}
 
 	/**
@@ -294,8 +273,7 @@
 	 */
 	public boolean validateResultNoIncoming(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConditionalNodeOperations.validateResultNoIncoming(this,
-			diagnostics, context);
+		return ConditionalNodeOperations.validateResultNoIncoming(this, diagnostics, context);
 	}
 
 	/**
@@ -305,8 +283,7 @@
 	 */
 	public boolean validateNoInputPins(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConditionalNodeOperations.validateNoInputPins(this, diagnostics,
-			context);
+		return ConditionalNodeOperations.validateNoInputPins(this, diagnostics, context);
 	}
 
 	/**
@@ -316,8 +293,7 @@
 	 */
 	public boolean validateOneClauseWithExecutableNode(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return ConditionalNodeOperations
-			.validateOneClauseWithExecutableNode(this, diagnostics, context);
+		return ConditionalNodeOperations.validateOneClauseWithExecutableNode(this, diagnostics, context);
 	}
 
 	/**
@@ -327,8 +303,7 @@
 	 */
 	public boolean validateMatchingOutputPins(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConditionalNodeOperations.validateMatchingOutputPins(this,
-			diagnostics, context);
+		return ConditionalNodeOperations.validateMatchingOutputPins(this, diagnostics, context);
 	}
 
 	/**
@@ -338,8 +313,7 @@
 	 */
 	public boolean validateExecutableNodes(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConditionalNodeOperations.validateExecutableNodes(this,
-			diagnostics, context);
+		return ConditionalNodeOperations.validateExecutableNodes(this, diagnostics, context);
 	}
 
 	/**
@@ -349,8 +323,7 @@
 	 */
 	public boolean validateClauseNoPredecessor(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConditionalNodeOperations.validateClauseNoPredecessor(this,
-			diagnostics, context);
+		return ConditionalNodeOperations.validateClauseNoPredecessor(this, diagnostics, context);
 	}
 
 	/**
@@ -363,11 +336,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Action> result = (EList<Action>) cache.get(this,
-				UMLPackage.Literals.ACTION___ALL_ACTIONS);
+			EList<Action> result = (EList<Action>) cache.get(this, UMLPackage.Literals.ACTION___ALL_ACTIONS);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.ACTION___ALL_ACTIONS,
-					result = ConditionalNodeOperations.allActions(this));
+				cache.put(this, UMLPackage.Literals.ACTION___ALL_ACTIONS, result = ConditionalNodeOperations.allActions(this));
 			}
 			return result;
 		}
@@ -383,67 +354,48 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CONDITIONAL_NODE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONDITIONAL_NODE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONDITIONAL_NODE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.CONDITIONAL_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONDITIONAL_NODE__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.CONDITIONAL_NODE__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CONDITIONAL_NODE__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CONDITIONAL_NODE__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONDITIONAL_NODE__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CONDITIONAL_NODE__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONDITIONAL_NODE__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONDITIONAL_NODE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONDITIONAL_NODE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONDITIONAL_NODE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONDITIONAL_NODE__EDGE :
-				return ((InternalEList<?>) getEdges()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_INPUT :
-				return ((InternalEList<?>) getStructuredNodeInputs())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_OUTPUT :
-				return ((InternalEList<?>) getStructuredNodeOutputs())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONDITIONAL_NODE__VARIABLE :
-				return ((InternalEList<?>) getVariables()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CONDITIONAL_NODE__NODE :
-				return ((InternalEList<?>) getNodes()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CONDITIONAL_NODE__CLAUSE :
-				return ((InternalEList<?>) getClauses()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CONDITIONAL_NODE__RESULT :
-				return ((InternalEList<?>) getResults()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.CONDITIONAL_NODE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.CONDITIONAL_NODE__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.CONDITIONAL_NODE__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__EDGE:
+			return ((InternalEList<?>) getEdges()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_INPUT:
+			return ((InternalEList<?>) getStructuredNodeInputs()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_OUTPUT:
+			return ((InternalEList<?>) getStructuredNodeOutputs()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__VARIABLE:
+			return ((InternalEList<?>) getVariables()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__NODE:
+			return ((InternalEList<?>) getNodes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__CLAUSE:
+			return ((InternalEList<?>) getClauses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONDITIONAL_NODE__RESULT:
+			return ((InternalEList<?>) getResults()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -456,120 +408,120 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CONDITIONAL_NODE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CONDITIONAL_NODE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CONDITIONAL_NODE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CONDITIONAL_NODE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CONDITIONAL_NODE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CONDITIONAL_NODE__NAME :
-				return getName();
-			case UMLPackage.CONDITIONAL_NODE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CONDITIONAL_NODE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CONDITIONAL_NODE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CONDITIONAL_NODE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CONDITIONAL_NODE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.CONDITIONAL_NODE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.CONDITIONAL_NODE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.CONDITIONAL_NODE__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.CONDITIONAL_NODE__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.CONDITIONAL_NODE__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.CONDITIONAL_NODE__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.CONDITIONAL_NODE__INCOMING :
-				return getIncomings();
-			case UMLPackage.CONDITIONAL_NODE__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.CONDITIONAL_NODE__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.CONDITIONAL_NODE__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.CONDITIONAL_NODE__HANDLER :
-				return getHandlers();
-			case UMLPackage.CONDITIONAL_NODE__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.CONDITIONAL_NODE__INPUT :
-				return getInputs();
-			case UMLPackage.CONDITIONAL_NODE__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.CONDITIONAL_NODE__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.CONDITIONAL_NODE__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.CONDITIONAL_NODE__OUTPUT :
-				return getOutputs();
-			case UMLPackage.CONDITIONAL_NODE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.CONDITIONAL_NODE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.CONDITIONAL_NODE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.CONDITIONAL_NODE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.CONDITIONAL_NODE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.CONDITIONAL_NODE__MEMBER :
-				return getMembers();
-			case UMLPackage.CONDITIONAL_NODE__CONTAINED_EDGE :
-				return getContainedEdges();
-			case UMLPackage.CONDITIONAL_NODE__CONTAINED_NODE :
-				return getContainedNodes();
-			case UMLPackage.CONDITIONAL_NODE__IN_ACTIVITY :
-				if (resolve)
-					return getInActivity();
-				return basicGetInActivity();
-			case UMLPackage.CONDITIONAL_NODE__SUBGROUP :
-				return getSubgroups();
-			case UMLPackage.CONDITIONAL_NODE__SUPER_GROUP :
-				if (resolve)
-					return getSuperGroup();
-				return basicGetSuperGroup();
-			case UMLPackage.CONDITIONAL_NODE__EDGE :
-				return getEdges();
-			case UMLPackage.CONDITIONAL_NODE__MUST_ISOLATE :
-				return isMustIsolate();
-			case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_INPUT :
-				return getStructuredNodeInputs();
-			case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_OUTPUT :
-				return getStructuredNodeOutputs();
-			case UMLPackage.CONDITIONAL_NODE__VARIABLE :
-				return getVariables();
-			case UMLPackage.CONDITIONAL_NODE__NODE :
-				return getNodes();
-			case UMLPackage.CONDITIONAL_NODE__CLAUSE :
-				return getClauses();
-			case UMLPackage.CONDITIONAL_NODE__IS_ASSURED :
-				return isAssured();
-			case UMLPackage.CONDITIONAL_NODE__IS_DETERMINATE :
-				return isDeterminate();
-			case UMLPackage.CONDITIONAL_NODE__RESULT :
-				return getResults();
+		case UMLPackage.CONDITIONAL_NODE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CONDITIONAL_NODE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CONDITIONAL_NODE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CONDITIONAL_NODE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CONDITIONAL_NODE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CONDITIONAL_NODE__NAME:
+			return getName();
+		case UMLPackage.CONDITIONAL_NODE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CONDITIONAL_NODE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CONDITIONAL_NODE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CONDITIONAL_NODE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CONDITIONAL_NODE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.CONDITIONAL_NODE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.CONDITIONAL_NODE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.CONDITIONAL_NODE__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.CONDITIONAL_NODE__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.CONDITIONAL_NODE__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.CONDITIONAL_NODE__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.CONDITIONAL_NODE__INCOMING:
+			return getIncomings();
+		case UMLPackage.CONDITIONAL_NODE__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.CONDITIONAL_NODE__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.CONDITIONAL_NODE__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.CONDITIONAL_NODE__HANDLER:
+			return getHandlers();
+		case UMLPackage.CONDITIONAL_NODE__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.CONDITIONAL_NODE__INPUT:
+			return getInputs();
+		case UMLPackage.CONDITIONAL_NODE__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.CONDITIONAL_NODE__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.CONDITIONAL_NODE__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.CONDITIONAL_NODE__OUTPUT:
+			return getOutputs();
+		case UMLPackage.CONDITIONAL_NODE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.CONDITIONAL_NODE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.CONDITIONAL_NODE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.CONDITIONAL_NODE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.CONDITIONAL_NODE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.CONDITIONAL_NODE__MEMBER:
+			return getMembers();
+		case UMLPackage.CONDITIONAL_NODE__CONTAINED_EDGE:
+			return getContainedEdges();
+		case UMLPackage.CONDITIONAL_NODE__CONTAINED_NODE:
+			return getContainedNodes();
+		case UMLPackage.CONDITIONAL_NODE__IN_ACTIVITY:
+			if (resolve)
+				return getInActivity();
+			return basicGetInActivity();
+		case UMLPackage.CONDITIONAL_NODE__SUBGROUP:
+			return getSubgroups();
+		case UMLPackage.CONDITIONAL_NODE__SUPER_GROUP:
+			if (resolve)
+				return getSuperGroup();
+			return basicGetSuperGroup();
+		case UMLPackage.CONDITIONAL_NODE__EDGE:
+			return getEdges();
+		case UMLPackage.CONDITIONAL_NODE__MUST_ISOLATE:
+			return isMustIsolate();
+		case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_INPUT:
+			return getStructuredNodeInputs();
+		case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_OUTPUT:
+			return getStructuredNodeOutputs();
+		case UMLPackage.CONDITIONAL_NODE__VARIABLE:
+			return getVariables();
+		case UMLPackage.CONDITIONAL_NODE__NODE:
+			return getNodes();
+		case UMLPackage.CONDITIONAL_NODE__CLAUSE:
+			return getClauses();
+		case UMLPackage.CONDITIONAL_NODE__IS_ASSURED:
+			return isAssured();
+		case UMLPackage.CONDITIONAL_NODE__IS_DETERMINATE:
+			return isDeterminate();
+		case UMLPackage.CONDITIONAL_NODE__RESULT:
+			return getResults();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -583,137 +535,119 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CONDITIONAL_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IN_ACTIVITY :
-				setInActivity((Activity) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__EDGE :
-				getEdges().clear();
-				getEdges()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__MUST_ISOLATE :
-				setMustIsolate((Boolean) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_INPUT :
-				getStructuredNodeInputs().clear();
-				getStructuredNodeInputs()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_OUTPUT :
-				getStructuredNodeOutputs().clear();
-				getStructuredNodeOutputs()
-					.addAll((Collection<? extends OutputPin>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__VARIABLE :
-				getVariables().clear();
-				getVariables()
-					.addAll((Collection<? extends Variable>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__NODE :
-				getNodes().clear();
-				getNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__CLAUSE :
-				getClauses().clear();
-				getClauses().addAll((Collection<? extends Clause>) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IS_ASSURED :
-				setIsAssured((Boolean) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IS_DETERMINATE :
-				setIsDeterminate((Boolean) newValue);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__RESULT :
-				getResults().clear();
-				getResults().addAll((Collection<? extends OutputPin>) newValue);
-				return;
+		case UMLPackage.CONDITIONAL_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IN_ACTIVITY:
+			setInActivity((Activity) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__EDGE:
+			getEdges().clear();
+			getEdges().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__MUST_ISOLATE:
+			setMustIsolate((Boolean) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_INPUT:
+			getStructuredNodeInputs().clear();
+			getStructuredNodeInputs().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_OUTPUT:
+			getStructuredNodeOutputs().clear();
+			getStructuredNodeOutputs().addAll((Collection<? extends OutputPin>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__VARIABLE:
+			getVariables().clear();
+			getVariables().addAll((Collection<? extends Variable>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__NODE:
+			getNodes().clear();
+			getNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__CLAUSE:
+			getClauses().clear();
+			getClauses().addAll((Collection<? extends Clause>) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IS_ASSURED:
+			setIsAssured((Boolean) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IS_DETERMINATE:
+			setIsDeterminate((Boolean) newValue);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__RESULT:
+			getResults().clear();
+			getResults().addAll((Collection<? extends OutputPin>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -726,99 +660,99 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONDITIONAL_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IN_ACTIVITY :
-				setInActivity((Activity) null);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__EDGE :
-				getEdges().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__MUST_ISOLATE :
-				setMustIsolate(MUST_ISOLATE_EDEFAULT);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_INPUT :
-				getStructuredNodeInputs().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_OUTPUT :
-				getStructuredNodeOutputs().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__VARIABLE :
-				getVariables().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__NODE :
-				getNodes().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__CLAUSE :
-				getClauses().clear();
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IS_ASSURED :
-				setIsAssured(IS_ASSURED_EDEFAULT);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__IS_DETERMINATE :
-				setIsDeterminate(IS_DETERMINATE_EDEFAULT);
-				return;
-			case UMLPackage.CONDITIONAL_NODE__RESULT :
-				getResults().clear();
-				return;
+		case UMLPackage.CONDITIONAL_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IN_ACTIVITY:
+			setInActivity((Activity) null);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__EDGE:
+			getEdges().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__MUST_ISOLATE:
+			setMustIsolate(MUST_ISOLATE_EDEFAULT);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_INPUT:
+			getStructuredNodeInputs().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_OUTPUT:
+			getStructuredNodeOutputs().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__VARIABLE:
+			getVariables().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__NODE:
+			getNodes().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__CLAUSE:
+			getClauses().clear();
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IS_ASSURED:
+			setIsAssured(IS_ASSURED_EDEFAULT);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__IS_DETERMINATE:
+			setIsDeterminate(IS_DETERMINATE_EDEFAULT);
+			return;
+		case UMLPackage.CONDITIONAL_NODE__RESULT:
+			getResults().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -831,106 +765,104 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONDITIONAL_NODE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CONDITIONAL_NODE__OWNER :
-				return isSetOwner();
-			case UMLPackage.CONDITIONAL_NODE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__NAME :
-				return isSetName();
-			case UMLPackage.CONDITIONAL_NODE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CONDITIONAL_NODE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CONDITIONAL_NODE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CONDITIONAL_NODE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CONDITIONAL_NODE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.CONDITIONAL_NODE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.CONDITIONAL_NODE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.CONDITIONAL_NODE__ACTIVITY :
-				return isSetActivity();
-			case UMLPackage.CONDITIONAL_NODE__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.CONDITIONAL_NODE__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.CONDITIONAL_NODE__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.CONDITIONAL_NODE__INPUT :
-				return isSetInputs();
-			case UMLPackage.CONDITIONAL_NODE__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.CONDITIONAL_NODE__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.CONDITIONAL_NODE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.CONDITIONAL_NODE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__MEMBER :
-				return isSetMembers();
-			case UMLPackage.CONDITIONAL_NODE__CONTAINED_EDGE :
-				return isSetContainedEdges();
-			case UMLPackage.CONDITIONAL_NODE__CONTAINED_NODE :
-				return isSetContainedNodes();
-			case UMLPackage.CONDITIONAL_NODE__IN_ACTIVITY :
-				return isSetInActivity();
-			case UMLPackage.CONDITIONAL_NODE__SUBGROUP :
-				return isSetSubgroups();
-			case UMLPackage.CONDITIONAL_NODE__SUPER_GROUP :
-				return isSetSuperGroup();
-			case UMLPackage.CONDITIONAL_NODE__EDGE :
-				return !getEdges().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__MUST_ISOLATE :
-				return isMustIsolate() != MUST_ISOLATE_EDEFAULT;
-			case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_INPUT :
-				return !getStructuredNodeInputs().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_OUTPUT :
-				return isSetStructuredNodeOutputs();
-			case UMLPackage.CONDITIONAL_NODE__VARIABLE :
-				return !getVariables().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__NODE :
-				return !getNodes().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__CLAUSE :
-				return !getClauses().isEmpty();
-			case UMLPackage.CONDITIONAL_NODE__IS_ASSURED :
-				return isAssured() != IS_ASSURED_EDEFAULT;
-			case UMLPackage.CONDITIONAL_NODE__IS_DETERMINATE :
-				return isDeterminate() != IS_DETERMINATE_EDEFAULT;
-			case UMLPackage.CONDITIONAL_NODE__RESULT :
-				return isSetResults();
+		case UMLPackage.CONDITIONAL_NODE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CONDITIONAL_NODE__OWNER:
+			return isSetOwner();
+		case UMLPackage.CONDITIONAL_NODE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__NAME:
+			return isSetName();
+		case UMLPackage.CONDITIONAL_NODE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CONDITIONAL_NODE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CONDITIONAL_NODE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CONDITIONAL_NODE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CONDITIONAL_NODE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.CONDITIONAL_NODE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.CONDITIONAL_NODE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.CONDITIONAL_NODE__ACTIVITY:
+			return isSetActivity();
+		case UMLPackage.CONDITIONAL_NODE__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.CONDITIONAL_NODE__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.CONDITIONAL_NODE__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.CONDITIONAL_NODE__INPUT:
+			return isSetInputs();
+		case UMLPackage.CONDITIONAL_NODE__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.CONDITIONAL_NODE__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.CONDITIONAL_NODE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.CONDITIONAL_NODE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__MEMBER:
+			return isSetMembers();
+		case UMLPackage.CONDITIONAL_NODE__CONTAINED_EDGE:
+			return isSetContainedEdges();
+		case UMLPackage.CONDITIONAL_NODE__CONTAINED_NODE:
+			return isSetContainedNodes();
+		case UMLPackage.CONDITIONAL_NODE__IN_ACTIVITY:
+			return isSetInActivity();
+		case UMLPackage.CONDITIONAL_NODE__SUBGROUP:
+			return isSetSubgroups();
+		case UMLPackage.CONDITIONAL_NODE__SUPER_GROUP:
+			return isSetSuperGroup();
+		case UMLPackage.CONDITIONAL_NODE__EDGE:
+			return !getEdges().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__MUST_ISOLATE:
+			return isMustIsolate() != MUST_ISOLATE_EDEFAULT;
+		case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_INPUT:
+			return !getStructuredNodeInputs().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__STRUCTURED_NODE_OUTPUT:
+			return isSetStructuredNodeOutputs();
+		case UMLPackage.CONDITIONAL_NODE__VARIABLE:
+			return !getVariables().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__NODE:
+			return !getNodes().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__CLAUSE:
+			return !getClauses().isEmpty();
+		case UMLPackage.CONDITIONAL_NODE__IS_ASSURED:
+			return isAssured() != IS_ASSURED_EDEFAULT;
+		case UMLPackage.CONDITIONAL_NODE__IS_DETERMINATE:
+			return isDeterminate() != IS_DETERMINATE_EDEFAULT;
+		case UMLPackage.CONDITIONAL_NODE__RESULT:
+			return isSetResults();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -945,233 +877,182 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CONDITIONAL_NODE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CONDITIONAL_NODE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CONDITIONAL_NODE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CONDITIONAL_NODE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CONDITIONAL_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___GET_MODEL :
-				return getModel();
-			case UMLPackage.CONDITIONAL_NODE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CONDITIONAL_NODE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CONDITIONAL_NODE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CONDITIONAL_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CONDITIONAL_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CONDITIONAL_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CONDITIONAL_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CONDITIONAL_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CONDITIONAL_NODE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CONDITIONAL_NODE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CONDITIONAL_NODE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CONDITIONAL_NODE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CONDITIONAL_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CONDITIONAL_NODE___SEPARATOR :
-				return separator();
-			case UMLPackage.CONDITIONAL_NODE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.CONDITIONAL_NODE___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.CONDITIONAL_NODE___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.CONDITIONAL_NODE___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.CONDITIONAL_NODE___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.CONDITIONAL_NODE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.CONDITIONAL_NODE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.CONDITIONAL_NODE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.CONDITIONAL_NODE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.CONDITIONAL_NODE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateNodesAndEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP :
-				return validateNotContained((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_OUTPUT_PIN_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateOutputPinEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_INPUT_PIN_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateInputPinEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___SOURCE_NODES :
-				return sourceNodes();
-			case UMLPackage.CONDITIONAL_NODE___TARGET_NODES :
-				return targetNodes();
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_RESULT_NO_INCOMING__DIAGNOSTICCHAIN_MAP :
-				return validateResultNoIncoming(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_NO_INPUT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateNoInputPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_ONE_CLAUSE_WITH_EXECUTABLE_NODE__DIAGNOSTICCHAIN_MAP :
-				return validateOneClauseWithExecutableNode(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_MATCHING_OUTPUT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateMatchingOutputPins(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_EXECUTABLE_NODES__DIAGNOSTICCHAIN_MAP :
-				return validateExecutableNodes(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONDITIONAL_NODE___VALIDATE_CLAUSE_NO_PREDECESSOR__DIAGNOSTICCHAIN_MAP :
-				return validateClauseNoPredecessor(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CONDITIONAL_NODE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CONDITIONAL_NODE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CONDITIONAL_NODE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CONDITIONAL_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___GET_MODEL:
+			return getModel();
+		case UMLPackage.CONDITIONAL_NODE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CONDITIONAL_NODE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CONDITIONAL_NODE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CONDITIONAL_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CONDITIONAL_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CONDITIONAL_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CONDITIONAL_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CONDITIONAL_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CONDITIONAL_NODE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CONDITIONAL_NODE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CONDITIONAL_NODE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CONDITIONAL_NODE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CONDITIONAL_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CONDITIONAL_NODE___SEPARATOR:
+			return separator();
+		case UMLPackage.CONDITIONAL_NODE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.CONDITIONAL_NODE___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.CONDITIONAL_NODE___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.CONDITIONAL_NODE___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.CONDITIONAL_NODE___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.CONDITIONAL_NODE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.CONDITIONAL_NODE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.CONDITIONAL_NODE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.CONDITIONAL_NODE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.CONDITIONAL_NODE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateNodesAndEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP:
+			return validateNotContained((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_OUTPUT_PIN_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateOutputPinEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_INPUT_PIN_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateInputPinEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___SOURCE_NODES:
+			return sourceNodes();
+		case UMLPackage.CONDITIONAL_NODE___TARGET_NODES:
+			return targetNodes();
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_RESULT_NO_INCOMING__DIAGNOSTICCHAIN_MAP:
+			return validateResultNoIncoming((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_NO_INPUT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateNoInputPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_ONE_CLAUSE_WITH_EXECUTABLE_NODE__DIAGNOSTICCHAIN_MAP:
+			return validateOneClauseWithExecutableNode((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_MATCHING_OUTPUT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateMatchingOutputPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_EXECUTABLE_NODES__DIAGNOSTICCHAIN_MAP:
+			return validateExecutableNodes((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONDITIONAL_NODE___VALIDATE_CLAUSE_NO_PREDECESSOR__DIAGNOSTICCHAIN_MAP:
+			return validateClauseNoPredecessor((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1184,20 +1065,9 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.CONDITIONAL_NODE__OWNED_COMMENT,
-		UMLPackage.CONDITIONAL_NODE__NAME_EXPRESSION,
-		UMLPackage.CONDITIONAL_NODE__HANDLER,
-		UMLPackage.CONDITIONAL_NODE__INPUT,
-		UMLPackage.CONDITIONAL_NODE__LOCAL_POSTCONDITION,
-		UMLPackage.CONDITIONAL_NODE__LOCAL_PRECONDITION,
-		UMLPackage.CONDITIONAL_NODE__OUTPUT,
-		UMLPackage.CONDITIONAL_NODE__ELEMENT_IMPORT,
-		UMLPackage.CONDITIONAL_NODE__PACKAGE_IMPORT,
-		UMLPackage.CONDITIONAL_NODE__OWNED_MEMBER,
-		UMLPackage.CONDITIONAL_NODE__SUBGROUP,
-		UMLPackage.CONDITIONAL_NODE__EDGE, UMLPackage.CONDITIONAL_NODE__NODE,
-		UMLPackage.CONDITIONAL_NODE__CLAUSE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.CONDITIONAL_NODE__OWNED_COMMENT, UMLPackage.CONDITIONAL_NODE__NAME_EXPRESSION, UMLPackage.CONDITIONAL_NODE__HANDLER, UMLPackage.CONDITIONAL_NODE__INPUT,
+			UMLPackage.CONDITIONAL_NODE__LOCAL_POSTCONDITION, UMLPackage.CONDITIONAL_NODE__LOCAL_PRECONDITION, UMLPackage.CONDITIONAL_NODE__OUTPUT, UMLPackage.CONDITIONAL_NODE__ELEMENT_IMPORT, UMLPackage.CONDITIONAL_NODE__PACKAGE_IMPORT,
+			UMLPackage.CONDITIONAL_NODE__OWNED_MEMBER, UMLPackage.CONDITIONAL_NODE__SUBGROUP, UMLPackage.CONDITIONAL_NODE__EDGE, UMLPackage.CONDITIONAL_NODE__NODE, UMLPackage.CONDITIONAL_NODE__CLAUSE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1207,7 +1077,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.CONDITIONAL_NODE__CLAUSE);
+				|| eIsSet(UMLPackage.CONDITIONAL_NODE__CLAUSE);
 	}
 
 	/**
@@ -1229,8 +1099,8 @@
 		return false;
 	}
 
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.CONDITIONAL_NODE__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] {
+			UMLPackage.CONDITIONAL_NODE__RESULT };
 
 	@Override
 	public EList<OutputPin> getOutputs() {
@@ -1239,17 +1109,17 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+					this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList<OutputPin>(
-						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>(OutputPin.class, this,
-			UMLPackage.CONDITIONAL_NODE__OUTPUT, OUTPUT_ESUBSETS);
+				UMLPackage.CONDITIONAL_NODE__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 } //ConditionalNodeImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectableElementImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectableElementImpl.java
index ea47950..d54cb9e 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectableElementImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectableElementImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 212765, 418466, 451350, 485756
  *
  */
@@ -16,6 +16,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -25,8 +26,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Comment;
@@ -94,9 +98,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -105,11 +107,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true,
-			true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -118,11 +116,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -132,13 +126,10 @@
 	 */
 	public NotificationChain basicSetTemplateParameterGen(
 			TemplateParameter newTemplateParameter, NotificationChain msgs) {
-		if (newTemplateParameter != null
-			&& !(newTemplateParameter instanceof ConnectableElementTemplateParameter)) {
-			throw new IllegalArgumentException(
-				"newTemplateParameter must be an instance of ConnectableElementTemplateParameter"); //$NON-NLS-1$
+		if (newTemplateParameter != null && !(newTemplateParameter instanceof ConnectableElementTemplateParameter)) {
+			throw new IllegalArgumentException("newTemplateParameter must be an instance of ConnectableElementTemplateParameter"); //$NON-NLS-1$
 		}
-		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter,
-			UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter, UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER, msgs);
 		return msgs;
 	}
 
@@ -152,7 +143,7 @@
 			TemplateParameter owningTemplateParameter = basicGetOwningTemplateParameter();
 
 			if (owningTemplateParameter != null
-				&& owningTemplateParameter != newTemplateParameter) {
+					&& owningTemplateParameter != newTemplateParameter) {
 
 				setOwningTemplateParameter(null);
 			}
@@ -167,16 +158,10 @@
 	 * @generated
 	 */
 	public void setTemplateParameter(TemplateParameter newTemplateParameter) {
-		if (newTemplateParameter != null
-			&& !(newTemplateParameter instanceof ConnectableElementTemplateParameter)) {
-			throw new IllegalArgumentException(
-				"newTemplateParameter must be an instance of ConnectableElementTemplateParameter"); //$NON-NLS-1$
+		if (newTemplateParameter != null && !(newTemplateParameter instanceof ConnectableElementTemplateParameter)) {
+			throw new IllegalArgumentException("newTemplateParameter must be an instance of ConnectableElementTemplateParameter"); //$NON-NLS-1$
 		}
-		eDynamicSet(
-			UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			newTemplateParameter);
+		eDynamicSet(UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, newTemplateParameter);
 	}
 
 	/**
@@ -194,11 +179,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			true, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -207,11 +188,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -222,8 +199,7 @@
 	public NotificationChain basicSetOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter,
-			UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter, UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -242,11 +218,7 @@
 	 */
 	public void setOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter) {
-		eDynamicSet(
-			UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			newOwningTemplateParameter);
+		eDynamicSet(UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, newOwningTemplateParameter);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -294,23 +266,17 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -324,18 +290,16 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONNECTABLE_ELEMENT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -349,10 +313,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -365,46 +327,46 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CONNECTABLE_ELEMENT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CONNECTABLE_ELEMENT__NAME :
-				return getName();
-			case UMLPackage.CONNECTABLE_ELEMENT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CONNECTABLE_ELEMENT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CONNECTABLE_ELEMENT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CONNECTABLE_ELEMENT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CONNECTABLE_ELEMENT__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.CONNECTABLE_ELEMENT__END :
-				return getEnds();
+		case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CONNECTABLE_ELEMENT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CONNECTABLE_ELEMENT__NAME:
+			return getName();
+		case UMLPackage.CONNECTABLE_ELEMENT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CONNECTABLE_ELEMENT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CONNECTABLE_ELEMENT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CONNECTABLE_ELEMENT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CONNECTABLE_ELEMENT__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.CONNECTABLE_ELEMENT__END:
+			return getEnds();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -418,34 +380,32 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
+		case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -458,30 +418,30 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
+		case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -494,36 +454,34 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.CONNECTABLE_ELEMENT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CONNECTABLE_ELEMENT__NAME :
-				return isSetName();
-			case UMLPackage.CONNECTABLE_ELEMENT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CONNECTABLE_ELEMENT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CONNECTABLE_ELEMENT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CONNECTABLE_ELEMENT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CONNECTABLE_ELEMENT__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.CONNECTABLE_ELEMENT__END :
-				return !getEnds().isEmpty();
+		case UMLPackage.CONNECTABLE_ELEMENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.CONNECTABLE_ELEMENT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CONNECTABLE_ELEMENT__NAME:
+			return isSetName();
+		case UMLPackage.CONNECTABLE_ELEMENT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CONNECTABLE_ELEMENT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CONNECTABLE_ELEMENT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CONNECTABLE_ELEMENT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CONNECTABLE_ELEMENT__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.CONNECTABLE_ELEMENT__END:
+			return !getEnds().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -538,12 +496,12 @@
 			Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-					return UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
-				case UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER :
-					return UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+				return UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
+			case UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER:
+				return UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -559,12 +517,12 @@
 			Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-					return UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
-				case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER :
-					return UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+				return UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
+			case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER:
+				return UMLPackage.CONNECTABLE_ELEMENT__TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -579,12 +537,12 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-					return UMLPackage.CONNECTABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT;
-				case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER :
-					return UMLPackage.CONNECTABLE_ELEMENT___IS_TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+				return UMLPackage.CONNECTABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT;
+			case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER:
+				return UMLPackage.CONNECTABLE_ELEMENT___IS_TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -600,132 +558,116 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTABLE_ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTABLE_ELEMENT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_MODEL :
-				return getModel();
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONNECTABLE_ELEMENT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONNECTABLE_ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CONNECTABLE_ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CONNECTABLE_ELEMENT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CONNECTABLE_ELEMENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTABLE_ELEMENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTABLE_ELEMENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTABLE_ELEMENT___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CONNECTABLE_ELEMENT___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CONNECTABLE_ELEMENT___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CONNECTABLE_ELEMENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CONNECTABLE_ELEMENT___SEPARATOR :
-				return separator();
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CONNECTABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.CONNECTABLE_ELEMENT___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.CONNECTABLE_ELEMENT___GET_ENDS :
-				return getEnds();
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTABLE_ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTABLE_ELEMENT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_MODEL:
+			return getModel();
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONNECTABLE_ELEMENT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONNECTABLE_ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CONNECTABLE_ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CONNECTABLE_ELEMENT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CONNECTABLE_ELEMENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTABLE_ELEMENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTABLE_ELEMENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTABLE_ELEMENT___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CONNECTABLE_ELEMENT___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CONNECTABLE_ELEMENT___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CONNECTABLE_ELEMENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CONNECTABLE_ELEMENT___SEPARATOR:
+			return separator();
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CONNECTABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.CONNECTABLE_ELEMENT___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.CONNECTABLE_ELEMENT___GET_ENDS:
+			return getEnds();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -751,8 +693,8 @@
 	 */
 	@Override
 	public boolean isSetOwner() {
-		return super.isSetOwner() || eIsSet(
-			UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER);
+		return super.isSetOwner()
+				|| eIsSet(UMLPackage.CONNECTABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER);
 	}
 
 } //ConnectableElementImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectableElementTemplateParameterImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectableElementTemplateParameterImpl.java
index fc33e97..0cf5fca 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectableElementTemplateParameterImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectableElementTemplateParameterImpl.java
@@ -1,27 +1,34 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 212765, 418466, 451350, 485756
+ *   Eike Stepper - 540786
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
+
+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.emf.ecore.resource.Resource;
 
 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;
@@ -72,11 +79,7 @@
 	 */
 	@Override
 	public ParameterableElement getParameteredElement() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, true,
-			true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, true, true);
 	}
 
 	/**
@@ -86,11 +89,7 @@
 	 */
 	@Override
 	public ParameterableElement basicGetParameteredElement() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, false,
-			true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, false, true);
 	}
 
 	/**
@@ -101,14 +100,10 @@
 	public NotificationChain basicSetParameteredElementGen(
 			ParameterableElement newParameteredElement,
 			NotificationChain msgs) {
-		if (newParameteredElement != null
-			&& !(newParameteredElement instanceof ConnectableElement)) {
-			throw new IllegalArgumentException(
-				"newParameteredElement must be an instance of ConnectableElement"); //$NON-NLS-1$
+		if (newParameteredElement != null && !(newParameteredElement instanceof ConnectableElement)) {
+			throw new IllegalArgumentException("newParameteredElement must be an instance of ConnectableElement"); //$NON-NLS-1$
 		}
-		msgs = eDynamicInverseAdd((InternalEObject) newParameteredElement,
-			UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-			msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newParameteredElement, UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, msgs);
 		return msgs;
 	}
 
@@ -124,7 +119,7 @@
 
 			ParameterableElement ownedParameteredElement = basicGetOwnedParameteredElement();
 			if (ownedParameteredElement != null
-				&& ownedParameteredElement != newParameteredElement) {
+					&& ownedParameteredElement != newParameteredElement) {
 
 				setOwnedParameteredElement(null);
 			}
@@ -141,16 +136,10 @@
 	@Override
 	public void setParameteredElement(
 			ParameterableElement newParameteredElement) {
-		if (newParameteredElement != null
-			&& !(newParameteredElement instanceof ConnectableElement)) {
-			throw new IllegalArgumentException(
-				"newParameteredElement must be an instance of ConnectableElement"); //$NON-NLS-1$
+		if (newParameteredElement != null && !(newParameteredElement instanceof ConnectableElement)) {
+			throw new IllegalArgumentException("newParameteredElement must be an instance of ConnectableElement"); //$NON-NLS-1$
 		}
-		eDynamicSet(
-			UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-			newParameteredElement);
+		eDynamicSet(UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, newParameteredElement);
 	}
 
 	/**
@@ -172,31 +161,22 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				ParameterableElement parameteredElement = basicGetParameteredElement();
-				if (parameteredElement != null)
-					msgs = ((InternalEObject) parameteredElement)
-						.eInverseRemove(this,
-							UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-							ParameterableElement.class, msgs);
-				return basicSetParameteredElement(
-					(ParameterableElement) otherEnd, msgs);
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__SIGNATURE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetSignature((TemplateSignature) otherEnd, msgs);
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				ParameterableElement ownedParameteredElement = basicGetOwnedParameteredElement();
-				if (ownedParameteredElement != null)
-					msgs = ((InternalEObject) ownedParameteredElement)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-							null, msgs);
-				return basicSetOwnedParameteredElement(
-					(ParameterableElement) otherEnd, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			ParameterableElement parameteredElement = basicGetParameteredElement();
+			if (parameteredElement != null)
+				msgs = ((InternalEObject) parameteredElement).eInverseRemove(this, UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, ParameterableElement.class, msgs);
+			return basicSetParameteredElement((ParameterableElement) otherEnd, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__SIGNATURE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			ParameterableElement ownedParameteredElement = basicGetOwnedParameteredElement();
+			if (ownedParameteredElement != null)
+				msgs = ((InternalEObject) ownedParameteredElement).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, null, msgs);
+			return basicSetOwnedParameteredElement((ParameterableElement) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -210,20 +190,18 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				return basicSetOwnedDefault(null, msgs);
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				return basicSetParameteredElement(null, msgs);
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__SIGNATURE :
-				return basicSetSignature(null, msgs);
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				return basicSetOwnedParameteredElement(null, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			return basicSetOwnedDefault(null, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			return basicSetParameteredElement(null, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__SIGNATURE:
+			return basicSetSignature(null, msgs);
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			return basicSetOwnedParameteredElement(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -236,36 +214,36 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__DEFAULT :
-				if (resolve)
-					return getDefault();
-				return basicGetDefault();
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				if (resolve)
-					return getOwnedDefault();
-				return basicGetOwnedDefault();
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				if (resolve)
-					return getParameteredElement();
-				return basicGetParameteredElement();
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__SIGNATURE :
-				if (resolve)
-					return getSignature();
-				return basicGetSignature();
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				if (resolve)
-					return getOwnedParameteredElement();
-				return basicGetOwnedParameteredElement();
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__DEFAULT:
+			if (resolve)
+				return getDefault();
+			return basicGetDefault();
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			if (resolve)
+				return getOwnedDefault();
+			return basicGetOwnedDefault();
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			if (resolve)
+				return getParameteredElement();
+			return basicGetParameteredElement();
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__SIGNATURE:
+			if (resolve)
+				return getSignature();
+			return basicGetSignature();
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			if (resolve)
+				return getOwnedParameteredElement();
+			return basicGetOwnedParameteredElement();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -279,31 +257,29 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__DEFAULT :
-				setDefault((ParameterableElement) newValue);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				setOwnedDefault((ParameterableElement) newValue);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				setParameteredElement((ParameterableElement) newValue);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__SIGNATURE :
-				setSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				setOwnedParameteredElement((ParameterableElement) newValue);
-				return;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__DEFAULT:
+			setDefault((ParameterableElement) newValue);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			setOwnedDefault((ParameterableElement) newValue);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			setParameteredElement((ParameterableElement) newValue);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__SIGNATURE:
+			setSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			setOwnedParameteredElement((ParameterableElement) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -316,27 +292,27 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__DEFAULT :
-				setDefault((ParameterableElement) null);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				setOwnedDefault((ParameterableElement) null);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				setParameteredElement((ParameterableElement) null);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__SIGNATURE :
-				setSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				setOwnedParameteredElement((ParameterableElement) null);
-				return;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__DEFAULT:
+			setDefault((ParameterableElement) null);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			setOwnedDefault((ParameterableElement) null);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			setParameteredElement((ParameterableElement) null);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__SIGNATURE:
+			setSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			setOwnedParameteredElement((ParameterableElement) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -349,24 +325,24 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNER :
-				return isSetOwner();
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__DEFAULT :
-				return basicGetDefault() != null;
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				return basicGetOwnedDefault() != null;
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				return isSetParameteredElement();
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__SIGNATURE :
-				return basicGetSignature() != null;
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				return basicGetOwnedParameteredElement() != null;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNER:
+			return isSetOwner();
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__DEFAULT:
+			return basicGetDefault() != null;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			return basicGetOwnedDefault() != null;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			return isSetParameteredElement();
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__SIGNATURE:
+			return basicGetSignature() != null;
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			return basicGetOwnedParameteredElement() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectionPointReferenceImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectionPointReferenceImpl.java
index 090bd4c..8e46b6d 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectionPointReferenceImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectionPointReferenceImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,10 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Comment;
@@ -90,9 +95,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -102,10 +105,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Pseudostate> getEntries() {
-		return (EList<Pseudostate>) eDynamicGet(
-			UMLPackage.CONNECTION_POINT_REFERENCE__ENTRY
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTION_POINT_REFERENCE__ENTRY, true, true);
+		return (EList<Pseudostate>) eDynamicGet(UMLPackage.CONNECTION_POINT_REFERENCE__ENTRY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTION_POINT_REFERENCE__ENTRY, true, true);
 	}
 
 	/**
@@ -123,10 +123,8 @@
 	 * @generated
 	 */
 	public Pseudostate getEntry(String name, boolean ignoreCase) {
-		entryLoop : for (Pseudostate entry : getEntries()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(entry.getName())
-				: name.equals(entry.getName())))
+		entryLoop: for (Pseudostate entry : getEntries()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(entry.getName()) : name.equals(entry.getName())))
 				continue entryLoop;
 			return entry;
 		}
@@ -140,9 +138,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Pseudostate> getExits() {
-		return (EList<Pseudostate>) eDynamicGet(
-			UMLPackage.CONNECTION_POINT_REFERENCE__EXIT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTION_POINT_REFERENCE__EXIT, true, true);
+		return (EList<Pseudostate>) eDynamicGet(UMLPackage.CONNECTION_POINT_REFERENCE__EXIT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTION_POINT_REFERENCE__EXIT, true, true);
 	}
 
 	/**
@@ -160,10 +156,8 @@
 	 * @generated
 	 */
 	public Pseudostate getExit(String name, boolean ignoreCase) {
-		exitLoop : for (Pseudostate exit : getExits()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(exit.getName())
-				: name.equals(exit.getName())))
+		exitLoop: for (Pseudostate exit : getExits()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(exit.getName()) : name.equals(exit.getName())))
 				continue exitLoop;
 			return exit;
 		}
@@ -176,10 +170,7 @@
 	 * @generated
 	 */
 	public State getState() {
-		return (State) eDynamicGet(
-			UMLPackage.CONNECTION_POINT_REFERENCE__STATE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTION_POINT_REFERENCE__STATE, true, true);
+		return (State) eDynamicGet(UMLPackage.CONNECTION_POINT_REFERENCE__STATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTION_POINT_REFERENCE__STATE, true, true);
 	}
 
 	/**
@@ -188,10 +179,7 @@
 	 * @generated
 	 */
 	public State basicGetState() {
-		return (State) eDynamicGet(
-			UMLPackage.CONNECTION_POINT_REFERENCE__STATE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTION_POINT_REFERENCE__STATE, false, true);
+		return (State) eDynamicGet(UMLPackage.CONNECTION_POINT_REFERENCE__STATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTION_POINT_REFERENCE__STATE, false, true);
 	}
 
 	/**
@@ -201,8 +189,7 @@
 	 */
 	public NotificationChain basicSetState(State newState,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newState,
-			UMLPackage.CONNECTION_POINT_REFERENCE__STATE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newState, UMLPackage.CONNECTION_POINT_REFERENCE__STATE, msgs);
 		return msgs;
 	}
 
@@ -212,10 +199,7 @@
 	 * @generated
 	 */
 	public void setState(State newState) {
-		eDynamicSet(
-			UMLPackage.CONNECTION_POINT_REFERENCE__STATE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTION_POINT_REFERENCE__STATE, newState);
+		eDynamicSet(UMLPackage.CONNECTION_POINT_REFERENCE__STATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTION_POINT_REFERENCE__STATE, newState);
 	}
 
 	/**
@@ -225,8 +209,7 @@
 	 */
 	public boolean validateEntryPseudostates(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConnectionPointReferenceOperations
-			.validateEntryPseudostates(this, diagnostics, context);
+		return ConnectionPointReferenceOperations.validateEntryPseudostates(this, diagnostics, context);
 	}
 
 	/**
@@ -236,8 +219,7 @@
 	 */
 	public boolean validateExitPseudostates(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConnectionPointReferenceOperations.validateExitPseudostates(this,
-			diagnostics, context);
+		return ConnectionPointReferenceOperations.validateExitPseudostates(this, diagnostics, context);
 	}
 
 	/**
@@ -250,17 +232,16 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetContainer((Region) otherEnd, msgs);
-			case UMLPackage.CONNECTION_POINT_REFERENCE__STATE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetState((State) otherEnd, msgs);
+		case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetContainer((Region) otherEnd, msgs);
+		case UMLPackage.CONNECTION_POINT_REFERENCE__STATE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetState((State) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -274,18 +255,16 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONNECTION_POINT_REFERENCE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER :
-				return basicSetContainer(null, msgs);
-			case UMLPackage.CONNECTION_POINT_REFERENCE__STATE :
-				return basicSetState(null, msgs);
+		case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONNECTION_POINT_REFERENCE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER:
+			return basicSetContainer(null, msgs);
+		case UMLPackage.CONNECTION_POINT_REFERENCE__STATE:
+			return basicSetState(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -299,12 +278,10 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.REGION__SUBVERTEX, Region.class, msgs);
-			case UMLPackage.CONNECTION_POINT_REFERENCE__STATE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.STATE__CONNECTION, State.class, msgs);
+		case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.REGION__SUBVERTEX, Region.class, msgs);
+		case UMLPackage.CONNECTION_POINT_REFERENCE__STATE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.STATE__CONNECTION, State.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -317,48 +294,48 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__NAME :
-				return getName();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER :
-				if (resolve)
-					return getContainer();
-				return basicGetContainer();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__INCOMING :
-				return getIncomings();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__ENTRY :
-				return getEntries();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__EXIT :
-				return getExits();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__STATE :
-				if (resolve)
-					return getState();
-				return basicGetState();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__NAME:
+			return getName();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER:
+			if (resolve)
+				return getContainer();
+			return basicGetContainer();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__INCOMING:
+			return getIncomings();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__ENTRY:
+			return getEntries();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__EXIT:
+			return getExits();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__STATE:
+			if (resolve)
+				return getState();
+			return basicGetState();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -372,40 +349,37 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER :
-				setContainer((Region) newValue);
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__ENTRY :
-				getEntries().clear();
-				getEntries()
-					.addAll((Collection<? extends Pseudostate>) newValue);
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__EXIT :
-				getExits().clear();
-				getExits().addAll((Collection<? extends Pseudostate>) newValue);
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__STATE :
-				setState((State) newValue);
-				return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER:
+			setContainer((Region) newValue);
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__ENTRY:
+			getEntries().clear();
+			getEntries().addAll((Collection<? extends Pseudostate>) newValue);
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__EXIT:
+			getExits().clear();
+			getExits().addAll((Collection<? extends Pseudostate>) newValue);
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__STATE:
+			setState((State) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -418,33 +392,33 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER :
-				setContainer((Region) null);
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__ENTRY :
-				getEntries().clear();
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__EXIT :
-				getExits().clear();
-				return;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__STATE :
-				setState((State) null);
-				return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER:
+			setContainer((Region) null);
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__ENTRY:
+			getEntries().clear();
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__EXIT:
+			getExits().clear();
+			return;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__STATE:
+			setState((State) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -457,40 +431,38 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__OWNER :
-				return isSetOwner();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__NAME :
-				return isSetName();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CONNECTION_POINT_REFERENCE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER :
-				return basicGetContainer() != null;
-			case UMLPackage.CONNECTION_POINT_REFERENCE__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__ENTRY :
-				return !getEntries().isEmpty();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__EXIT :
-				return !getExits().isEmpty();
-			case UMLPackage.CONNECTION_POINT_REFERENCE__STATE :
-				return basicGetState() != null;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__OWNER:
+			return isSetOwner();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__NAME:
+			return isSetName();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CONNECTION_POINT_REFERENCE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__CONTAINER:
+			return basicGetContainer() != null;
+		case UMLPackage.CONNECTION_POINT_REFERENCE__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__ENTRY:
+			return !getEntries().isEmpty();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__EXIT:
+			return !getExits().isEmpty();
+		case UMLPackage.CONNECTION_POINT_REFERENCE__STATE:
+			return basicGetState() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -505,143 +477,124 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_MODEL :
-				return getModel();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CONNECTION_POINT_REFERENCE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___SEPARATOR :
-				return separator();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___CONTAINING_STATE_MACHINE :
-				return containingStateMachine();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_INCOMINGS :
-				return getIncomings();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___GET_OUTGOINGS :
-				return getOutgoings();
-			case UMLPackage.CONNECTION_POINT_REFERENCE___IS_CONTAINED_IN_STATE__STATE :
-				return isContainedInState((State) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___IS_CONTAINED_IN_REGION__REGION :
-				return isContainedInRegion((Region) arguments.get(0));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___VALIDATE_EXIT_PSEUDOSTATES__DIAGNOSTICCHAIN_MAP :
-				return validateExitPseudostates(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTION_POINT_REFERENCE___VALIDATE_ENTRY_PSEUDOSTATES__DIAGNOSTICCHAIN_MAP :
-				return validateEntryPseudostates(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_MODEL:
+			return getModel();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CONNECTION_POINT_REFERENCE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___SEPARATOR:
+			return separator();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___CONTAINING_STATE_MACHINE:
+			return containingStateMachine();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_INCOMINGS:
+			return getIncomings();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___GET_OUTGOINGS:
+			return getOutgoings();
+		case UMLPackage.CONNECTION_POINT_REFERENCE___IS_CONTAINED_IN_STATE__STATE:
+			return isContainedInState((State) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___IS_CONTAINED_IN_REGION__REGION:
+			return isContainedInRegion((Region) arguments.get(0));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___VALIDATE_EXIT_PSEUDOSTATES__DIAGNOSTICCHAIN_MAP:
+			return validateExitPseudostates((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTION_POINT_REFERENCE___VALIDATE_ENTRY_PSEUDOSTATES__DIAGNOSTICCHAIN_MAP:
+			return validateEntryPseudostates((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -668,7 +621,7 @@
 	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
-			|| eIsSet(UMLPackage.CONNECTION_POINT_REFERENCE__STATE);
+				|| eIsSet(UMLPackage.CONNECTION_POINT_REFERENCE__STATE);
 	}
 
 } //ConnectionPointReferenceImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectorEndImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectorEndImpl.java
index 4c76eb4..182bd84 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectorEndImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectorEndImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,8 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 import org.eclipse.emf.common.util.DiagnosticChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -24,6 +26,8 @@
 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.ConnectableElement;
 import org.eclipse.uml2.uml.ConnectorEnd;
@@ -80,9 +84,7 @@
 	 */
 	public Property getDefiningEnd() {
 		Property definingEnd = basicGetDefiningEnd();
-		return definingEnd != null && definingEnd.eIsProxy()
-			? (Property) eResolveProxy((InternalEObject) definingEnd)
-			: definingEnd;
+		return definingEnd != null && definingEnd.eIsProxy() ? (Property) eResolveProxy((InternalEObject) definingEnd) : definingEnd;
 	}
 
 	/**
@@ -100,9 +102,7 @@
 	 * @generated
 	 */
 	public Property getPartWithPort() {
-		return (Property) eDynamicGet(
-			UMLPackage.CONNECTOR_END__PART_WITH_PORT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTOR_END__PART_WITH_PORT, true, true);
+		return (Property) eDynamicGet(UMLPackage.CONNECTOR_END__PART_WITH_PORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTOR_END__PART_WITH_PORT, true, true);
 	}
 
 	/**
@@ -111,9 +111,7 @@
 	 * @generated
 	 */
 	public Property basicGetPartWithPort() {
-		return (Property) eDynamicGet(
-			UMLPackage.CONNECTOR_END__PART_WITH_PORT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTOR_END__PART_WITH_PORT, false, true);
+		return (Property) eDynamicGet(UMLPackage.CONNECTOR_END__PART_WITH_PORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTOR_END__PART_WITH_PORT, false, true);
 	}
 
 	/**
@@ -122,9 +120,7 @@
 	 * @generated
 	 */
 	public void setPartWithPort(Property newPartWithPort) {
-		eDynamicSet(
-			UMLPackage.CONNECTOR_END__PART_WITH_PORT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTOR_END__PART_WITH_PORT, newPartWithPort);
+		eDynamicSet(UMLPackage.CONNECTOR_END__PART_WITH_PORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTOR_END__PART_WITH_PORT, newPartWithPort);
 	}
 
 	/**
@@ -133,9 +129,7 @@
 	 * @generated
 	 */
 	public ConnectableElement getRole() {
-		return (ConnectableElement) eDynamicGet(
-			UMLPackage.CONNECTOR_END__ROLE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTOR_END__ROLE, true, true);
+		return (ConnectableElement) eDynamicGet(UMLPackage.CONNECTOR_END__ROLE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTOR_END__ROLE, true, true);
 	}
 
 	/**
@@ -144,9 +138,7 @@
 	 * @generated
 	 */
 	public ConnectableElement basicGetRole() {
-		return (ConnectableElement) eDynamicGet(
-			UMLPackage.CONNECTOR_END__ROLE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTOR_END__ROLE, false, true);
+		return (ConnectableElement) eDynamicGet(UMLPackage.CONNECTOR_END__ROLE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTOR_END__ROLE, false, true);
 	}
 
 	/**
@@ -155,8 +147,7 @@
 	 * @generated
 	 */
 	public void setRole(ConnectableElement newRole) {
-		eDynamicSet(UMLPackage.CONNECTOR_END__ROLE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTOR_END__ROLE, newRole);
+		eDynamicSet(UMLPackage.CONNECTOR_END__ROLE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTOR_END__ROLE, newRole);
 	}
 
 	/**
@@ -166,8 +157,7 @@
 	 */
 	public boolean validateMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConnectorEndOperations.validateMultiplicity(this, diagnostics,
-			context);
+		return ConnectorEndOperations.validateMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -177,8 +167,7 @@
 	 */
 	public boolean validatePartWithPortEmpty(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConnectorEndOperations.validatePartWithPortEmpty(this,
-			diagnostics, context);
+		return ConnectorEndOperations.validatePartWithPortEmpty(this, diagnostics, context);
 	}
 
 	/**
@@ -188,8 +177,7 @@
 	 */
 	public boolean validateRoleAndPartWithPort(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConnectorEndOperations.validateRoleAndPartWithPort(this,
-			diagnostics, context);
+		return ConnectorEndOperations.validateRoleAndPartWithPort(this, diagnostics, context);
 	}
 
 	/**
@@ -199,8 +187,7 @@
 	 */
 	public boolean validateSelfPartWithPort(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConnectorEndOperations.validateSelfPartWithPort(this,
-			diagnostics, context);
+		return ConnectorEndOperations.validateSelfPartWithPort(this, diagnostics, context);
 	}
 
 	/**
@@ -211,44 +198,44 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CONNECTOR_END__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CONNECTOR_END__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CONNECTOR_END__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CONNECTOR_END__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CONNECTOR_END__IS_ORDERED :
-				return isOrdered();
-			case UMLPackage.CONNECTOR_END__IS_UNIQUE :
-				return isUnique();
-			case UMLPackage.CONNECTOR_END__LOWER :
-				return getLower();
-			case UMLPackage.CONNECTOR_END__LOWER_VALUE :
-				if (resolve)
-					return getLowerValue();
-				return basicGetLowerValue();
-			case UMLPackage.CONNECTOR_END__UPPER :
-				return getUpper();
-			case UMLPackage.CONNECTOR_END__UPPER_VALUE :
-				if (resolve)
-					return getUpperValue();
-				return basicGetUpperValue();
-			case UMLPackage.CONNECTOR_END__DEFINING_END :
-				if (resolve)
-					return getDefiningEnd();
-				return basicGetDefiningEnd();
-			case UMLPackage.CONNECTOR_END__PART_WITH_PORT :
-				if (resolve)
-					return getPartWithPort();
-				return basicGetPartWithPort();
-			case UMLPackage.CONNECTOR_END__ROLE :
-				if (resolve)
-					return getRole();
-				return basicGetRole();
+		case UMLPackage.CONNECTOR_END__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CONNECTOR_END__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CONNECTOR_END__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CONNECTOR_END__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CONNECTOR_END__IS_ORDERED:
+			return isOrdered();
+		case UMLPackage.CONNECTOR_END__IS_UNIQUE:
+			return isUnique();
+		case UMLPackage.CONNECTOR_END__LOWER:
+			return getLower();
+		case UMLPackage.CONNECTOR_END__LOWER_VALUE:
+			if (resolve)
+				return getLowerValue();
+			return basicGetLowerValue();
+		case UMLPackage.CONNECTOR_END__UPPER:
+			return getUpper();
+		case UMLPackage.CONNECTOR_END__UPPER_VALUE:
+			if (resolve)
+				return getUpperValue();
+			return basicGetUpperValue();
+		case UMLPackage.CONNECTOR_END__DEFINING_END:
+			if (resolve)
+				return getDefiningEnd();
+			return basicGetDefiningEnd();
+		case UMLPackage.CONNECTOR_END__PART_WITH_PORT:
+			if (resolve)
+				return getPartWithPort();
+			return basicGetPartWithPort();
+		case UMLPackage.CONNECTOR_END__ROLE:
+			if (resolve)
+				return getRole();
+			return basicGetRole();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -262,40 +249,38 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CONNECTOR_END__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CONNECTOR_END__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CONNECTOR_END__IS_ORDERED :
-				setIsOrdered((Boolean) newValue);
-				return;
-			case UMLPackage.CONNECTOR_END__IS_UNIQUE :
-				setIsUnique((Boolean) newValue);
-				return;
-			case UMLPackage.CONNECTOR_END__LOWER :
-				setLower((Integer) newValue);
-				return;
-			case UMLPackage.CONNECTOR_END__LOWER_VALUE :
-				setLowerValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.CONNECTOR_END__UPPER :
-				setUpper((Integer) newValue);
-				return;
-			case UMLPackage.CONNECTOR_END__UPPER_VALUE :
-				setUpperValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.CONNECTOR_END__PART_WITH_PORT :
-				setPartWithPort((Property) newValue);
-				return;
-			case UMLPackage.CONNECTOR_END__ROLE :
-				setRole((ConnectableElement) newValue);
-				return;
+		case UMLPackage.CONNECTOR_END__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CONNECTOR_END__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CONNECTOR_END__IS_ORDERED:
+			setIsOrdered((Boolean) newValue);
+			return;
+		case UMLPackage.CONNECTOR_END__IS_UNIQUE:
+			setIsUnique((Boolean) newValue);
+			return;
+		case UMLPackage.CONNECTOR_END__LOWER:
+			setLower((Integer) newValue);
+			return;
+		case UMLPackage.CONNECTOR_END__LOWER_VALUE:
+			setLowerValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.CONNECTOR_END__UPPER:
+			setUpper((Integer) newValue);
+			return;
+		case UMLPackage.CONNECTOR_END__UPPER_VALUE:
+			setUpperValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.CONNECTOR_END__PART_WITH_PORT:
+			setPartWithPort((Property) newValue);
+			return;
+		case UMLPackage.CONNECTOR_END__ROLE:
+			setRole((ConnectableElement) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -308,36 +293,36 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONNECTOR_END__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CONNECTOR_END__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CONNECTOR_END__IS_ORDERED :
-				setIsOrdered(IS_ORDERED_EDEFAULT);
-				return;
-			case UMLPackage.CONNECTOR_END__IS_UNIQUE :
-				setIsUnique(IS_UNIQUE_EDEFAULT);
-				return;
-			case UMLPackage.CONNECTOR_END__LOWER :
-				setLower(LOWER_EDEFAULT);
-				return;
-			case UMLPackage.CONNECTOR_END__LOWER_VALUE :
-				setLowerValue((ValueSpecification) null);
-				return;
-			case UMLPackage.CONNECTOR_END__UPPER :
-				setUpper(UPPER_EDEFAULT);
-				return;
-			case UMLPackage.CONNECTOR_END__UPPER_VALUE :
-				setUpperValue((ValueSpecification) null);
-				return;
-			case UMLPackage.CONNECTOR_END__PART_WITH_PORT :
-				setPartWithPort((Property) null);
-				return;
-			case UMLPackage.CONNECTOR_END__ROLE :
-				setRole((ConnectableElement) null);
-				return;
+		case UMLPackage.CONNECTOR_END__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CONNECTOR_END__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CONNECTOR_END__IS_ORDERED:
+			setIsOrdered(IS_ORDERED_EDEFAULT);
+			return;
+		case UMLPackage.CONNECTOR_END__IS_UNIQUE:
+			setIsUnique(IS_UNIQUE_EDEFAULT);
+			return;
+		case UMLPackage.CONNECTOR_END__LOWER:
+			setLower(LOWER_EDEFAULT);
+			return;
+		case UMLPackage.CONNECTOR_END__LOWER_VALUE:
+			setLowerValue((ValueSpecification) null);
+			return;
+		case UMLPackage.CONNECTOR_END__UPPER:
+			setUpper(UPPER_EDEFAULT);
+			return;
+		case UMLPackage.CONNECTOR_END__UPPER_VALUE:
+			setUpperValue((ValueSpecification) null);
+			return;
+		case UMLPackage.CONNECTOR_END__PART_WITH_PORT:
+			setPartWithPort((Property) null);
+			return;
+		case UMLPackage.CONNECTOR_END__ROLE:
+			setRole((ConnectableElement) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -350,32 +335,32 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONNECTOR_END__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CONNECTOR_END__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CONNECTOR_END__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CONNECTOR_END__OWNER :
-				return isSetOwner();
-			case UMLPackage.CONNECTOR_END__IS_ORDERED :
-				return isOrdered() != IS_ORDERED_EDEFAULT;
-			case UMLPackage.CONNECTOR_END__IS_UNIQUE :
-				return isUnique() != IS_UNIQUE_EDEFAULT;
-			case UMLPackage.CONNECTOR_END__LOWER :
-				return getLower() != LOWER_EDEFAULT;
-			case UMLPackage.CONNECTOR_END__LOWER_VALUE :
-				return basicGetLowerValue() != null;
-			case UMLPackage.CONNECTOR_END__UPPER :
-				return getUpper() != UPPER_EDEFAULT;
-			case UMLPackage.CONNECTOR_END__UPPER_VALUE :
-				return basicGetUpperValue() != null;
-			case UMLPackage.CONNECTOR_END__DEFINING_END :
-				return basicGetDefiningEnd() != null;
-			case UMLPackage.CONNECTOR_END__PART_WITH_PORT :
-				return basicGetPartWithPort() != null;
-			case UMLPackage.CONNECTOR_END__ROLE :
-				return basicGetRole() != null;
+		case UMLPackage.CONNECTOR_END__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CONNECTOR_END__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CONNECTOR_END__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CONNECTOR_END__OWNER:
+			return isSetOwner();
+		case UMLPackage.CONNECTOR_END__IS_ORDERED:
+			return isOrdered() != IS_ORDERED_EDEFAULT;
+		case UMLPackage.CONNECTOR_END__IS_UNIQUE:
+			return isUnique() != IS_UNIQUE_EDEFAULT;
+		case UMLPackage.CONNECTOR_END__LOWER:
+			return getLower() != LOWER_EDEFAULT;
+		case UMLPackage.CONNECTOR_END__LOWER_VALUE:
+			return basicGetLowerValue() != null;
+		case UMLPackage.CONNECTOR_END__UPPER:
+			return getUpper() != UPPER_EDEFAULT;
+		case UMLPackage.CONNECTOR_END__UPPER_VALUE:
+			return basicGetUpperValue() != null;
+		case UMLPackage.CONNECTOR_END__DEFINING_END:
+			return basicGetDefiningEnd() != null;
+		case UMLPackage.CONNECTOR_END__PART_WITH_PORT:
+			return basicGetPartWithPort() != null;
+		case UMLPackage.CONNECTOR_END__ROLE:
+			return basicGetRole() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -390,153 +375,126 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CONNECTOR_END___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CONNECTOR_END___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CONNECTOR_END___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CONNECTOR_END___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CONNECTOR_END___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___GET_MODEL :
-				return getModel();
-			case UMLPackage.CONNECTOR_END___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CONNECTOR_END___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CONNECTOR_END___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CONNECTOR_END___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CONNECTOR_END___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CONNECTOR_END___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CONNECTOR_END___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CONNECTOR_END___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CONNECTOR_END___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CONNECTOR_END___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-				return validateUpperGeLower((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-				return validateLowerGe0((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationNoSideEffects(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationConstant(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-				return validateLowerIsInteger(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-				return validateUpperIsUnlimitedNatural(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___SET_LOWER__INT :
-				setLower((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.CONNECTOR_END___SET_UPPER__INT :
-				setUpper((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.CONNECTOR_END___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-				return compatibleWith((MultiplicityElement) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-				return includesMultiplicity(
-					(MultiplicityElement) arguments.get(0));
-			case UMLPackage.CONNECTOR_END___IS__INT_INT :
-				return is((Integer) arguments.get(0),
-					(Integer) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___IS_MULTIVALUED :
-				return isMultivalued();
-			case UMLPackage.CONNECTOR_END___GET_LOWER :
-				return getLower();
-			case UMLPackage.CONNECTOR_END___LOWER_BOUND :
-				return lowerBound();
-			case UMLPackage.CONNECTOR_END___GET_UPPER :
-				return getUpper();
-			case UMLPackage.CONNECTOR_END___UPPER_BOUND :
-				return upperBound();
-			case UMLPackage.CONNECTOR_END___VALIDATE_ROLE_AND_PART_WITH_PORT__DIAGNOSTICCHAIN_MAP :
-				return validateRoleAndPartWithPort(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___VALIDATE_PART_WITH_PORT_EMPTY__DIAGNOSTICCHAIN_MAP :
-				return validatePartWithPortEmpty(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___VALIDATE_SELF_PART_WITH_PORT__DIAGNOSTICCHAIN_MAP :
-				return validateSelfPartWithPort(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR_END___GET_DEFINING_END :
-				return getDefiningEnd();
+		case UMLPackage.CONNECTOR_END___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CONNECTOR_END___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CONNECTOR_END___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CONNECTOR_END___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CONNECTOR_END___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___GET_MODEL:
+			return getModel();
+		case UMLPackage.CONNECTOR_END___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CONNECTOR_END___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CONNECTOR_END___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CONNECTOR_END___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CONNECTOR_END___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CONNECTOR_END___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CONNECTOR_END___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CONNECTOR_END___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CONNECTOR_END___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CONNECTOR_END___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+			return validateUpperGeLower((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+			return validateLowerGe0((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationConstant((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+			return validateLowerIsInteger((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+			return validateUpperIsUnlimitedNatural((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___SET_LOWER__INT:
+			setLower((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.CONNECTOR_END___SET_UPPER__INT:
+			setUpper((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.CONNECTOR_END___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+			return compatibleWith((MultiplicityElement) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+			return includesMultiplicity((MultiplicityElement) arguments.get(0));
+		case UMLPackage.CONNECTOR_END___IS__INT_INT:
+			return is((Integer) arguments.get(0), (Integer) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___IS_MULTIVALUED:
+			return isMultivalued();
+		case UMLPackage.CONNECTOR_END___GET_LOWER:
+			return getLower();
+		case UMLPackage.CONNECTOR_END___LOWER_BOUND:
+			return lowerBound();
+		case UMLPackage.CONNECTOR_END___GET_UPPER:
+			return getUpper();
+		case UMLPackage.CONNECTOR_END___UPPER_BOUND:
+			return upperBound();
+		case UMLPackage.CONNECTOR_END___VALIDATE_ROLE_AND_PART_WITH_PORT__DIAGNOSTICCHAIN_MAP:
+			return validateRoleAndPartWithPort((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___VALIDATE_PART_WITH_PORT_EMPTY__DIAGNOSTICCHAIN_MAP:
+			return validatePartWithPortEmpty((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___VALIDATE_SELF_PART_WITH_PORT__DIAGNOSTICCHAIN_MAP:
+			return validateSelfPartWithPort((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR_END___GET_DEFINING_END:
+			return getDefiningEnd();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectorImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectorImpl.java
index 8ef76ba..6044c31 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectorImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConnectorImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,8 +29,12 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -115,23 +120,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			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>(
-						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>(
-			RedefinableElement.class, this,
-			UMLPackage.CONNECTOR__REDEFINED_ELEMENT,
-			REDEFINED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<RedefinableElement>(RedefinableElement.class, this, UMLPackage.CONNECTOR__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -145,20 +141,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.CONNECTOR__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.CONNECTOR__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.CONNECTOR__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.CONNECTOR__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -167,9 +156,7 @@
 	 * @generated
 	 */
 	public Association getType() {
-		return (Association) eDynamicGet(
-			UMLPackage.CONNECTOR__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTOR__TYPE, true, true);
+		return (Association) eDynamicGet(UMLPackage.CONNECTOR__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTOR__TYPE, true, true);
 	}
 
 	/**
@@ -178,9 +165,7 @@
 	 * @generated
 	 */
 	public Association basicGetType() {
-		return (Association) eDynamicGet(
-			UMLPackage.CONNECTOR__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTOR__TYPE, false, true);
+		return (Association) eDynamicGet(UMLPackage.CONNECTOR__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTOR__TYPE, false, true);
 	}
 
 	/**
@@ -189,8 +174,7 @@
 	 * @generated
 	 */
 	public void setType(Association newType) {
-		eDynamicSet(UMLPackage.CONNECTOR__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTOR__TYPE, newType);
+		eDynamicSet(UMLPackage.CONNECTOR__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTOR__TYPE, newType);
 	}
 
 	/**
@@ -200,9 +184,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Connector> getRedefinedConnectors() {
-		return (EList<Connector>) eDynamicGet(
-			UMLPackage.CONNECTOR__REDEFINED_CONNECTOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTOR__REDEFINED_CONNECTOR, true, true);
+		return (EList<Connector>) eDynamicGet(UMLPackage.CONNECTOR__REDEFINED_CONNECTOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTOR__REDEFINED_CONNECTOR, true, true);
 	}
 
 	/**
@@ -220,10 +202,8 @@
 	 * @generated
 	 */
 	public Connector getRedefinedConnector(String name, boolean ignoreCase) {
-		redefinedConnectorLoop : for (Connector redefinedConnector : getRedefinedConnectors()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinedConnector.getName())
-				: name.equals(redefinedConnector.getName())))
+		redefinedConnectorLoop: for (Connector redefinedConnector : getRedefinedConnectors()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinedConnector.getName()) : name.equals(redefinedConnector.getName())))
 				continue redefinedConnectorLoop;
 			return redefinedConnector;
 		}
@@ -237,9 +217,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ConnectorEnd> getEnds() {
-		return (EList<ConnectorEnd>) eDynamicGet(
-			UMLPackage.CONNECTOR__END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTOR__END, true, true);
+		return (EList<ConnectorEnd>) eDynamicGet(UMLPackage.CONNECTOR__END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTOR__END, true, true);
 	}
 
 	/**
@@ -248,8 +226,7 @@
 	 * @generated
 	 */
 	public ConnectorEnd createEnd() {
-		ConnectorEnd newEnd = (ConnectorEnd) create(
-			UMLPackage.Literals.CONNECTOR_END);
+		ConnectorEnd newEnd = (ConnectorEnd) create(UMLPackage.Literals.CONNECTOR_END);
 		getEnds().add(newEnd);
 		return newEnd;
 	}
@@ -270,9 +247,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Behavior> getContracts() {
-		return (EList<Behavior>) eDynamicGet(
-			UMLPackage.CONNECTOR__CONTRACT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONNECTOR__CONTRACT, true, true);
+		return (EList<Behavior>) eDynamicGet(UMLPackage.CONNECTOR__CONTRACT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONNECTOR__CONTRACT, true, true);
 	}
 
 	/**
@@ -291,12 +266,10 @@
 	 */
 	public Behavior getContract(String name, boolean ignoreCase,
 			EClass eClass) {
-		contractLoop : for (Behavior contract : getContracts()) {
+		contractLoop: for (Behavior contract : getContracts()) {
 			if (eClass != null && !eClass.isInstance(contract))
 				continue contractLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(contract.getName())
-				: name.equals(contract.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(contract.getName()) : name.equals(contract.getName())))
 				continue contractLoop;
 			return contract;
 		}
@@ -332,17 +305,14 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CONNECTOR__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONNECTOR__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONNECTOR__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.CONNECTOR__END :
-				return ((InternalEList<?>) getEnds()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.CONNECTOR__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONNECTOR__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONNECTOR__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.CONNECTOR__END:
+			return ((InternalEList<?>) getEnds()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -355,54 +325,54 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CONNECTOR__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CONNECTOR__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CONNECTOR__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CONNECTOR__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CONNECTOR__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CONNECTOR__NAME :
-				return getName();
-			case UMLPackage.CONNECTOR__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CONNECTOR__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CONNECTOR__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CONNECTOR__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CONNECTOR__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.CONNECTOR__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.CONNECTOR__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.CONNECTOR__FEATURING_CLASSIFIER :
-				return getFeaturingClassifiers();
-			case UMLPackage.CONNECTOR__IS_STATIC :
-				return isStatic();
-			case UMLPackage.CONNECTOR__CONTRACT :
-				return getContracts();
-			case UMLPackage.CONNECTOR__END :
-				return getEnds();
-			case UMLPackage.CONNECTOR__KIND :
-				return getKind();
-			case UMLPackage.CONNECTOR__REDEFINED_CONNECTOR :
-				return getRedefinedConnectors();
-			case UMLPackage.CONNECTOR__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
+		case UMLPackage.CONNECTOR__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CONNECTOR__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CONNECTOR__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CONNECTOR__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CONNECTOR__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CONNECTOR__NAME:
+			return getName();
+		case UMLPackage.CONNECTOR__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CONNECTOR__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CONNECTOR__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CONNECTOR__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CONNECTOR__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.CONNECTOR__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.CONNECTOR__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.CONNECTOR__FEATURING_CLASSIFIER:
+			return getFeaturingClassifiers();
+		case UMLPackage.CONNECTOR__IS_STATIC:
+			return isStatic();
+		case UMLPackage.CONNECTOR__CONTRACT:
+			return getContracts();
+		case UMLPackage.CONNECTOR__END:
+			return getEnds();
+		case UMLPackage.CONNECTOR__KIND:
+			return getKind();
+		case UMLPackage.CONNECTOR__REDEFINED_CONNECTOR:
+			return getRedefinedConnectors();
+		case UMLPackage.CONNECTOR__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -416,48 +386,44 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CONNECTOR__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CONNECTOR__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CONNECTOR__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CONNECTOR__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CONNECTOR__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CONNECTOR__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.CONNECTOR__IS_STATIC :
-				setIsStatic((Boolean) newValue);
-				return;
-			case UMLPackage.CONNECTOR__CONTRACT :
-				getContracts().clear();
-				getContracts()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.CONNECTOR__END :
-				getEnds().clear();
-				getEnds().addAll((Collection<? extends ConnectorEnd>) newValue);
-				return;
-			case UMLPackage.CONNECTOR__REDEFINED_CONNECTOR :
-				getRedefinedConnectors().clear();
-				getRedefinedConnectors()
-					.addAll((Collection<? extends Connector>) newValue);
-				return;
-			case UMLPackage.CONNECTOR__TYPE :
-				setType((Association) newValue);
-				return;
+		case UMLPackage.CONNECTOR__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CONNECTOR__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CONNECTOR__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CONNECTOR__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CONNECTOR__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CONNECTOR__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.CONNECTOR__IS_STATIC:
+			setIsStatic((Boolean) newValue);
+			return;
+		case UMLPackage.CONNECTOR__CONTRACT:
+			getContracts().clear();
+			getContracts().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.CONNECTOR__END:
+			getEnds().clear();
+			getEnds().addAll((Collection<? extends ConnectorEnd>) newValue);
+			return;
+		case UMLPackage.CONNECTOR__REDEFINED_CONNECTOR:
+			getRedefinedConnectors().clear();
+			getRedefinedConnectors().addAll((Collection<? extends Connector>) newValue);
+			return;
+		case UMLPackage.CONNECTOR__TYPE:
+			setType((Association) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -470,39 +436,39 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONNECTOR__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CONNECTOR__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CONNECTOR__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CONNECTOR__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CONNECTOR__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CONNECTOR__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.CONNECTOR__IS_STATIC :
-				setIsStatic(IS_STATIC_EDEFAULT);
-				return;
-			case UMLPackage.CONNECTOR__CONTRACT :
-				getContracts().clear();
-				return;
-			case UMLPackage.CONNECTOR__END :
-				getEnds().clear();
-				return;
-			case UMLPackage.CONNECTOR__REDEFINED_CONNECTOR :
-				getRedefinedConnectors().clear();
-				return;
-			case UMLPackage.CONNECTOR__TYPE :
-				setType((Association) null);
-				return;
+		case UMLPackage.CONNECTOR__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CONNECTOR__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CONNECTOR__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CONNECTOR__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CONNECTOR__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CONNECTOR__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.CONNECTOR__IS_STATIC:
+			setIsStatic(IS_STATIC_EDEFAULT);
+			return;
+		case UMLPackage.CONNECTOR__CONTRACT:
+			getContracts().clear();
+			return;
+		case UMLPackage.CONNECTOR__END:
+			getEnds().clear();
+			return;
+		case UMLPackage.CONNECTOR__REDEFINED_CONNECTOR:
+			getRedefinedConnectors().clear();
+			return;
+		case UMLPackage.CONNECTOR__TYPE:
+			setType((Association) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -515,48 +481,46 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONNECTOR__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CONNECTOR__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CONNECTOR__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CONNECTOR__OWNER :
-				return isSetOwner();
-			case UMLPackage.CONNECTOR__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CONNECTOR__NAME :
-				return isSetName();
-			case UMLPackage.CONNECTOR__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CONNECTOR__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CONNECTOR__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CONNECTOR__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CONNECTOR__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.CONNECTOR__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.CONNECTOR__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.CONNECTOR__FEATURING_CLASSIFIER :
-				return isSetFeaturingClassifiers();
-			case UMLPackage.CONNECTOR__IS_STATIC :
-				return isStatic() != IS_STATIC_EDEFAULT;
-			case UMLPackage.CONNECTOR__CONTRACT :
-				return !getContracts().isEmpty();
-			case UMLPackage.CONNECTOR__END :
-				return !getEnds().isEmpty();
-			case UMLPackage.CONNECTOR__KIND :
-				return getKind() != KIND_EDEFAULT;
-			case UMLPackage.CONNECTOR__REDEFINED_CONNECTOR :
-				return !getRedefinedConnectors().isEmpty();
-			case UMLPackage.CONNECTOR__TYPE :
-				return basicGetType() != null;
+		case UMLPackage.CONNECTOR__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CONNECTOR__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CONNECTOR__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CONNECTOR__OWNER:
+			return isSetOwner();
+		case UMLPackage.CONNECTOR__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CONNECTOR__NAME:
+			return isSetName();
+		case UMLPackage.CONNECTOR__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CONNECTOR__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CONNECTOR__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CONNECTOR__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CONNECTOR__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.CONNECTOR__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.CONNECTOR__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.CONNECTOR__FEATURING_CLASSIFIER:
+			return isSetFeaturingClassifiers();
+		case UMLPackage.CONNECTOR__IS_STATIC:
+			return isStatic() != IS_STATIC_EDEFAULT;
+		case UMLPackage.CONNECTOR__CONTRACT:
+			return !getContracts().isEmpty();
+		case UMLPackage.CONNECTOR__END:
+			return !getEnds().isEmpty();
+		case UMLPackage.CONNECTOR__KIND:
+			return getKind() != KIND_EDEFAULT;
+		case UMLPackage.CONNECTOR__REDEFINED_CONNECTOR:
+			return !getRedefinedConnectors().isEmpty();
+		case UMLPackage.CONNECTOR__TYPE:
+			return basicGetType() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -571,150 +535,126 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CONNECTOR___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONNECTOR___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CONNECTOR___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTOR___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONNECTOR___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CONNECTOR___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CONNECTOR___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CONNECTOR___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CONNECTOR___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CONNECTOR___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CONNECTOR___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONNECTOR___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTOR___GET_MODEL :
-				return getModel();
-			case UMLPackage.CONNECTOR___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CONNECTOR___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CONNECTOR___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CONNECTOR___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CONNECTOR___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CONNECTOR___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CONNECTOR___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONNECTOR___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTOR___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CONNECTOR___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CONNECTOR___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONNECTOR___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONNECTOR___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CONNECTOR___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONNECTOR___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTOR___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTOR___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTOR___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CONNECTOR___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CONNECTOR___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONNECTOR___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CONNECTOR___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CONNECTOR___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CONNECTOR___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CONNECTOR___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CONNECTOR___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CONNECTOR___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CONNECTOR___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CONNECTOR___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CONNECTOR___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CONNECTOR___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CONNECTOR___SEPARATOR :
-				return separator();
-			case UMLPackage.CONNECTOR___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CONNECTOR___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.CONNECTOR___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.CONNECTOR___VALIDATE_TYPES__DIAGNOSTICCHAIN_MAP :
-				return validateTypes((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR___VALIDATE_ROLES__DIAGNOSTICCHAIN_MAP :
-				return validateRoles((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONNECTOR___GET_KIND :
-				return getKind();
+		case UMLPackage.CONNECTOR___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONNECTOR___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CONNECTOR___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTOR___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONNECTOR___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CONNECTOR___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CONNECTOR___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CONNECTOR___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CONNECTOR___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CONNECTOR___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CONNECTOR___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONNECTOR___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTOR___GET_MODEL:
+			return getModel();
+		case UMLPackage.CONNECTOR___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CONNECTOR___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CONNECTOR___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONNECTOR___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CONNECTOR___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CONNECTOR___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CONNECTOR___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONNECTOR___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTOR___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CONNECTOR___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CONNECTOR___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONNECTOR___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONNECTOR___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CONNECTOR___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONNECTOR___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTOR___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTOR___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTOR___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CONNECTOR___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CONNECTOR___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONNECTOR___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CONNECTOR___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CONNECTOR___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CONNECTOR___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CONNECTOR___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CONNECTOR___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CONNECTOR___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CONNECTOR___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CONNECTOR___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CONNECTOR___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CONNECTOR___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CONNECTOR___SEPARATOR:
+			return separator();
+		case UMLPackage.CONNECTOR___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CONNECTOR___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.CONNECTOR___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.CONNECTOR___VALIDATE_TYPES__DIAGNOSTICCHAIN_MAP:
+			return validateTypes((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR___VALIDATE_ROLES__DIAGNOSTICCHAIN_MAP:
+			return validateRoles((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONNECTOR___GET_KIND:
+			return getKind();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -727,7 +667,7 @@
 	@Override
 	public boolean isSetRedefinedElements() {
 		return super.isSetRedefinedElements()
-			|| eIsSet(UMLPackage.CONNECTOR__REDEFINED_CONNECTOR);
+				|| eIsSet(UMLPackage.CONNECTOR__REDEFINED_CONNECTOR);
 	}
 
 	/**
@@ -738,9 +678,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.CONNECTOR__OWNED_COMMENT,
-		UMLPackage.CONNECTOR__NAME_EXPRESSION, UMLPackage.CONNECTOR__END};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.CONNECTOR__OWNED_COMMENT, UMLPackage.CONNECTOR__NAME_EXPRESSION, UMLPackage.CONNECTOR__END };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getRedefinedElements() <em>Redefined Element</em>}' reference list.
@@ -750,8 +688,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.CONNECTOR__REDEFINED_CONNECTOR};
+	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[] { UMLPackage.CONNECTOR__REDEFINED_CONNECTOR };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -760,7 +697,8 @@
 	 */
 	@Override
 	public boolean isSetOwnedElements() {
-		return super.isSetOwnedElements() || eIsSet(UMLPackage.CONNECTOR__END);
+		return super.isSetOwnedElements()
+				|| eIsSet(UMLPackage.CONNECTOR__END);
 	}
 
 } //ConnectorImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConsiderIgnoreFragmentImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConsiderIgnoreFragmentImpl.java
index aa1b15f..63cf7e0 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConsiderIgnoreFragmentImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConsiderIgnoreFragmentImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -24,6 +24,8 @@
 
 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.Gate;
@@ -84,10 +86,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<NamedElement> getMessages() {
-		return (EList<NamedElement>) eDynamicGet(
-			UMLPackage.CONSIDER_IGNORE_FRAGMENT__MESSAGE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSIDER_IGNORE_FRAGMENT__MESSAGE, true, true);
+		return (EList<NamedElement>) eDynamicGet(UMLPackage.CONSIDER_IGNORE_FRAGMENT__MESSAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSIDER_IGNORE_FRAGMENT__MESSAGE, true, true);
 	}
 
 	/**
@@ -106,12 +105,10 @@
 	 */
 	public NamedElement getMessage(String name, boolean ignoreCase,
 			EClass eClass) {
-		messageLoop : for (NamedElement message : getMessages()) {
+		messageLoop: for (NamedElement message : getMessages()) {
 			if (eClass != null && !eClass.isInstance(message))
 				continue messageLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(message.getName())
-				: name.equals(message.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(message.getName()) : name.equals(message.getName())))
 				continue messageLoop;
 			return message;
 		}
@@ -125,8 +122,7 @@
 	 */
 	public boolean validateConsiderOrIgnore(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConsiderIgnoreFragmentOperations.validateConsiderOrIgnore(this,
-			diagnostics, context);
+		return ConsiderIgnoreFragmentOperations.validateConsiderOrIgnore(this, diagnostics, context);
 	}
 
 	/**
@@ -136,8 +132,7 @@
 	 */
 	public boolean validateType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConsiderIgnoreFragmentOperations.validateType(this, diagnostics,
-			context);
+		return ConsiderIgnoreFragmentOperations.validateType(this, diagnostics, context);
 	}
 
 	/**
@@ -148,52 +143,52 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME :
-				return getName();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__COVERED :
-				return getCovereds();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_OPERAND :
-				if (resolve)
-					return getEnclosingOperand();
-				return basicGetEnclosingOperand();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_INTERACTION :
-				if (resolve)
-					return getEnclosingInteraction();
-				return basicGetEnclosingInteraction();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__GENERAL_ORDERING :
-				return getGeneralOrderings();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__CFRAGMENT_GATE :
-				return getCfragmentGates();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__INTERACTION_OPERATOR :
-				return getInteractionOperator();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OPERAND :
-				return getOperands();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__MESSAGE :
-				return getMessages();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME:
+			return getName();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__COVERED:
+			return getCovereds();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_OPERAND:
+			if (resolve)
+				return getEnclosingOperand();
+			return basicGetEnclosingOperand();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_INTERACTION:
+			if (resolve)
+				return getEnclosingInteraction();
+			return basicGetEnclosingInteraction();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__GENERAL_ORDERING:
+			return getGeneralOrderings();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__CFRAGMENT_GATE:
+			return getCfragmentGates();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__INTERACTION_OPERATOR:
+			return getInteractionOperator();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OPERAND:
+			return getOperands();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__MESSAGE:
+			return getMessages();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -207,58 +202,52 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__COVERED :
-				getCovereds().clear();
-				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) newValue);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				getGeneralOrderings()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__CFRAGMENT_GATE :
-				getCfragmentGates().clear();
-				getCfragmentGates()
-					.addAll((Collection<? extends Gate>) newValue);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__INTERACTION_OPERATOR :
-				setInteractionOperator((InteractionOperatorKind) newValue);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OPERAND :
-				getOperands().clear();
-				getOperands().addAll(
-					(Collection<? extends InteractionOperand>) newValue);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__MESSAGE :
-				getMessages().clear();
-				getMessages()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__COVERED:
+			getCovereds().clear();
+			getCovereds().addAll((Collection<? extends Lifeline>) newValue);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) newValue);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			getGeneralOrderings().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__CFRAGMENT_GATE:
+			getCfragmentGates().clear();
+			getCfragmentGates().addAll((Collection<? extends Gate>) newValue);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__INTERACTION_OPERATOR:
+			setInteractionOperator((InteractionOperatorKind) newValue);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OPERAND:
+			getOperands().clear();
+			getOperands().addAll((Collection<? extends InteractionOperand>) newValue);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__MESSAGE:
+			getMessages().clear();
+			getMessages().addAll((Collection<? extends NamedElement>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -271,45 +260,45 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__COVERED :
-				getCovereds().clear();
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) null);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) null);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__CFRAGMENT_GATE :
-				getCfragmentGates().clear();
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__INTERACTION_OPERATOR :
-				setInteractionOperator(INTERACTION_OPERATOR_EDEFAULT);
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OPERAND :
-				getOperands().clear();
-				return;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__MESSAGE :
-				getMessages().clear();
-				return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__COVERED:
+			getCovereds().clear();
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) null);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) null);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__CFRAGMENT_GATE:
+			getCfragmentGates().clear();
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__INTERACTION_OPERATOR:
+			setInteractionOperator(INTERACTION_OPERATOR_EDEFAULT);
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OPERAND:
+			getOperands().clear();
+			return;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__MESSAGE:
+			getMessages().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -322,44 +311,42 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME :
-				return isSetName();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__COVERED :
-				return !getCovereds().isEmpty();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_OPERAND :
-				return basicGetEnclosingOperand() != null;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_INTERACTION :
-				return basicGetEnclosingInteraction() != null;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__GENERAL_ORDERING :
-				return !getGeneralOrderings().isEmpty();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__CFRAGMENT_GATE :
-				return !getCfragmentGates().isEmpty();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__INTERACTION_OPERATOR :
-				return getInteractionOperator() != INTERACTION_OPERATOR_EDEFAULT;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OPERAND :
-				return !getOperands().isEmpty();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT__MESSAGE :
-				return !getMessages().isEmpty();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME:
+			return isSetName();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__COVERED:
+			return !getCovereds().isEmpty();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_OPERAND:
+			return basicGetEnclosingOperand() != null;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__ENCLOSING_INTERACTION:
+			return basicGetEnclosingInteraction() != null;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__GENERAL_ORDERING:
+			return !getGeneralOrderings().isEmpty();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__CFRAGMENT_GATE:
+			return !getCfragmentGates().isEmpty();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__INTERACTION_OPERATOR:
+			return getInteractionOperator() != INTERACTION_OPERATOR_EDEFAULT;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__OPERAND:
+			return !getOperands().isEmpty();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT__MESSAGE:
+			return !getMessages().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -374,143 +361,120 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_MODEL :
-				return getModel();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___SEPARATOR :
-				return separator();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_BREAK__DIAGNOSTICCHAIN_MAP :
-				return validateBreak((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_CONSIDER_AND_IGNORE__DIAGNOSTICCHAIN_MAP :
-				return validateConsiderAndIgnore(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_OPT_LOOP_BREAK_NEG__DIAGNOSTICCHAIN_MAP :
-				return validateOptLoopBreakNeg(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_CONSIDER_OR_IGNORE__DIAGNOSTICCHAIN_MAP :
-				return validateConsiderOrIgnore(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_MODEL:
+			return getModel();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___SEPARATOR:
+			return separator();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_BREAK__DIAGNOSTICCHAIN_MAP:
+			return validateBreak((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_CONSIDER_AND_IGNORE__DIAGNOSTICCHAIN_MAP:
+			return validateConsiderAndIgnore((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_OPT_LOOP_BREAK_NEG__DIAGNOSTICCHAIN_MAP:
+			return validateOptLoopBreakNeg((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_CONSIDER_OR_IGNORE__DIAGNOSTICCHAIN_MAP:
+			return validateConsiderOrIgnore((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT___VALIDATE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConstraintImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConstraintImpl.java
index 2b38bcd..ec1170e 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConstraintImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ConstraintImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,8 +28,12 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -101,20 +106,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.CONSTRAINT__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.CONSTRAINT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.CONSTRAINT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.CONSTRAINT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -124,9 +122,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Element> getConstrainedElements() {
-		return (EList<Element>) eDynamicGet(
-			UMLPackage.CONSTRAINT__CONSTRAINED_ELEMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__CONSTRAINED_ELEMENT, true, true);
+		return (EList<Element>) eDynamicGet(UMLPackage.CONSTRAINT__CONSTRAINED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__CONSTRAINED_ELEMENT, true, true);
 	}
 
 	/**
@@ -135,9 +131,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getSpecification() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__SPECIFICATION, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__SPECIFICATION, true, true);
 	}
 
 	/**
@@ -146,9 +140,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetSpecification() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__SPECIFICATION, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__SPECIFICATION, false, true);
 	}
 
 	/**
@@ -158,8 +150,7 @@
 	 */
 	public NotificationChain basicSetSpecification(
 			ValueSpecification newSpecification, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newSpecification,
-			UMLPackage.CONSTRAINT__SPECIFICATION, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newSpecification, UMLPackage.CONSTRAINT__SPECIFICATION, msgs);
 		return msgs;
 	}
 
@@ -169,9 +160,7 @@
 	 * @generated
 	 */
 	public void setSpecification(ValueSpecification newSpecification) {
-		eDynamicSet(
-			UMLPackage.CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__SPECIFICATION, newSpecification);
+		eDynamicSet(UMLPackage.CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__SPECIFICATION, newSpecification);
 	}
 
 	/**
@@ -181,8 +170,7 @@
 	 */
 	public ValueSpecification createSpecification(String name, Type type,
 			EClass eClass) {
-		ValueSpecification newSpecification = (ValueSpecification) create(
-			eClass);
+		ValueSpecification newSpecification = (ValueSpecification) create(eClass);
 		setSpecification(newSpecification);
 		if (name != null)
 			newSpecification.setName(name);
@@ -197,9 +185,7 @@
 	 * @generated
 	 */
 	public Namespace getContext() {
-		return (Namespace) eDynamicGet(
-			UMLPackage.CONSTRAINT__CONTEXT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__CONTEXT, true, true);
+		return (Namespace) eDynamicGet(UMLPackage.CONSTRAINT__CONTEXT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__CONTEXT, true, true);
 	}
 
 	/**
@@ -208,9 +194,7 @@
 	 * @generated
 	 */
 	public Namespace basicGetContext() {
-		return (Namespace) eDynamicGet(
-			UMLPackage.CONSTRAINT__CONTEXT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__CONTEXT, false, true);
+		return (Namespace) eDynamicGet(UMLPackage.CONSTRAINT__CONTEXT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__CONTEXT, false, true);
 	}
 
 	/**
@@ -220,8 +204,7 @@
 	 */
 	public NotificationChain basicSetContext(Namespace newContext,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newContext,
-			UMLPackage.CONSTRAINT__CONTEXT, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newContext, UMLPackage.CONSTRAINT__CONTEXT, msgs);
 		return msgs;
 	}
 
@@ -231,8 +214,7 @@
 	 * @generated
 	 */
 	public void setContext(Namespace newContext) {
-		eDynamicSet(UMLPackage.CONSTRAINT__CONTEXT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__CONTEXT, newContext);
+		eDynamicSet(UMLPackage.CONSTRAINT__CONTEXT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__CONTEXT, newContext);
 	}
 
 	/**
@@ -242,8 +224,7 @@
 	 */
 	public boolean validateNotApplyToSelf(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConstraintOperations.validateNotApplyToSelf(this, diagnostics,
-			context);
+		return ConstraintOperations.validateNotApplyToSelf(this, diagnostics, context);
 	}
 
 	/**
@@ -253,8 +234,7 @@
 	 */
 	public boolean validateBooleanValue(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConstraintOperations.validateBooleanValue(this, diagnostics,
-			context);
+		return ConstraintOperations.validateBooleanValue(this, diagnostics, context);
 	}
 
 	/**
@@ -264,8 +244,7 @@
 	 */
 	public boolean validateNoSideEffects(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ConstraintOperations.validateNoSideEffects(this, diagnostics,
-			context);
+		return ConstraintOperations.validateNoSideEffects(this, diagnostics, context);
 	}
 
 	/**
@@ -278,27 +257,21 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CONSTRAINT__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.CONSTRAINT__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.CONSTRAINT__CONTEXT :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetContext((Namespace) otherEnd, msgs);
+		case UMLPackage.CONSTRAINT__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.CONSTRAINT__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.CONSTRAINT__CONTEXT:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetContext((Namespace) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -312,22 +285,20 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CONSTRAINT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONSTRAINT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CONSTRAINT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.CONSTRAINT__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.CONSTRAINT__CONTEXT :
-				return basicSetContext(null, msgs);
-			case UMLPackage.CONSTRAINT__SPECIFICATION :
-				return basicSetSpecification(null, msgs);
+		case UMLPackage.CONSTRAINT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONSTRAINT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CONSTRAINT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.CONSTRAINT__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.CONSTRAINT__CONTEXT:
+			return basicSetContext(null, msgs);
+		case UMLPackage.CONSTRAINT__SPECIFICATION:
+			return basicSetSpecification(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -341,13 +312,10 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
-			case UMLPackage.CONSTRAINT__CONTEXT :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.NAMESPACE__OWNED_RULE, Namespace.class, msgs);
+		case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+		case UMLPackage.CONSTRAINT__CONTEXT:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.NAMESPACE__OWNED_RULE, Namespace.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -360,50 +328,50 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CONSTRAINT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CONSTRAINT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CONSTRAINT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CONSTRAINT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CONSTRAINT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CONSTRAINT__NAME :
-				return getName();
-			case UMLPackage.CONSTRAINT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CONSTRAINT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CONSTRAINT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CONSTRAINT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.CONSTRAINT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.CONSTRAINT__CONSTRAINED_ELEMENT :
-				return getConstrainedElements();
-			case UMLPackage.CONSTRAINT__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.CONSTRAINT__SPECIFICATION :
-				if (resolve)
-					return getSpecification();
-				return basicGetSpecification();
+		case UMLPackage.CONSTRAINT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CONSTRAINT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CONSTRAINT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CONSTRAINT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CONSTRAINT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CONSTRAINT__NAME:
+			return getName();
+		case UMLPackage.CONSTRAINT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CONSTRAINT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CONSTRAINT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CONSTRAINT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.CONSTRAINT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.CONSTRAINT__CONSTRAINED_ELEMENT:
+			return getConstrainedElements();
+		case UMLPackage.CONSTRAINT__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.CONSTRAINT__SPECIFICATION:
+			if (resolve)
+				return getSpecification();
+			return basicGetSpecification();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -417,42 +385,39 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CONSTRAINT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CONSTRAINT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CONSTRAINT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CONSTRAINT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CONSTRAINT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.CONSTRAINT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.CONSTRAINT__CONSTRAINED_ELEMENT :
-				getConstrainedElements().clear();
-				getConstrainedElements()
-					.addAll((Collection<? extends Element>) newValue);
-				return;
-			case UMLPackage.CONSTRAINT__CONTEXT :
-				setContext((Namespace) newValue);
-				return;
-			case UMLPackage.CONSTRAINT__SPECIFICATION :
-				setSpecification((ValueSpecification) newValue);
-				return;
+		case UMLPackage.CONSTRAINT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CONSTRAINT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CONSTRAINT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CONSTRAINT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CONSTRAINT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.CONSTRAINT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.CONSTRAINT__CONSTRAINED_ELEMENT:
+			getConstrainedElements().clear();
+			getConstrainedElements().addAll((Collection<? extends Element>) newValue);
+			return;
+		case UMLPackage.CONSTRAINT__CONTEXT:
+			setContext((Namespace) newValue);
+			return;
+		case UMLPackage.CONSTRAINT__SPECIFICATION:
+			setSpecification((ValueSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -465,36 +430,36 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONSTRAINT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CONSTRAINT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CONSTRAINT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CONSTRAINT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CONSTRAINT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.CONSTRAINT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.CONSTRAINT__CONSTRAINED_ELEMENT :
-				getConstrainedElements().clear();
-				return;
-			case UMLPackage.CONSTRAINT__CONTEXT :
-				setContext((Namespace) null);
-				return;
-			case UMLPackage.CONSTRAINT__SPECIFICATION :
-				setSpecification((ValueSpecification) null);
-				return;
+		case UMLPackage.CONSTRAINT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CONSTRAINT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CONSTRAINT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CONSTRAINT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CONSTRAINT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.CONSTRAINT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.CONSTRAINT__CONSTRAINED_ELEMENT:
+			getConstrainedElements().clear();
+			return;
+		case UMLPackage.CONSTRAINT__CONTEXT:
+			setContext((Namespace) null);
+			return;
+		case UMLPackage.CONSTRAINT__SPECIFICATION:
+			setSpecification((ValueSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -507,38 +472,36 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONSTRAINT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CONSTRAINT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CONSTRAINT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CONSTRAINT__OWNER :
-				return isSetOwner();
-			case UMLPackage.CONSTRAINT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CONSTRAINT__NAME :
-				return isSetName();
-			case UMLPackage.CONSTRAINT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CONSTRAINT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CONSTRAINT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CONSTRAINT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.CONSTRAINT__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.CONSTRAINT__CONSTRAINED_ELEMENT :
-				return !getConstrainedElements().isEmpty();
-			case UMLPackage.CONSTRAINT__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.CONSTRAINT__SPECIFICATION :
-				return basicGetSpecification() != null;
+		case UMLPackage.CONSTRAINT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CONSTRAINT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CONSTRAINT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CONSTRAINT__OWNER:
+			return isSetOwner();
+		case UMLPackage.CONSTRAINT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CONSTRAINT__NAME:
+			return isSetName();
+		case UMLPackage.CONSTRAINT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CONSTRAINT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CONSTRAINT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CONSTRAINT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.CONSTRAINT__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.CONSTRAINT__CONSTRAINED_ELEMENT:
+			return !getConstrainedElements().isEmpty();
+		case UMLPackage.CONSTRAINT__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.CONSTRAINT__SPECIFICATION:
+			return basicGetSpecification() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -553,144 +516,122 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CONSTRAINT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONSTRAINT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSTRAINT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSTRAINT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CONSTRAINT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONSTRAINT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONSTRAINT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CONSTRAINT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CONSTRAINT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CONSTRAINT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CONSTRAINT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CONSTRAINT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CONSTRAINT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONSTRAINT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CONSTRAINT___GET_MODEL :
-				return getModel();
-			case UMLPackage.CONSTRAINT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CONSTRAINT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CONSTRAINT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CONSTRAINT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CONSTRAINT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONSTRAINT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CONSTRAINT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONSTRAINT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONSTRAINT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CONSTRAINT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONSTRAINT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CONSTRAINT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CONSTRAINT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CONSTRAINT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CONSTRAINT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CONSTRAINT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONSTRAINT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CONSTRAINT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CONSTRAINT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSTRAINT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSTRAINT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSTRAINT___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CONSTRAINT___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CONSTRAINT___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CONSTRAINT___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CONSTRAINT___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CONSTRAINT___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CONSTRAINT___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CONSTRAINT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CONSTRAINT___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CONSTRAINT___SEPARATOR :
-				return separator();
-			case UMLPackage.CONSTRAINT___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CONSTRAINT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.CONSTRAINT___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.CONSTRAINT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSTRAINT___VALIDATE_BOOLEAN_VALUE__DIAGNOSTICCHAIN_MAP :
-				return validateBooleanValue((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSTRAINT___VALIDATE_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateNoSideEffects((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONSTRAINT___VALIDATE_NOT_APPLY_TO_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotApplyToSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSTRAINT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONSTRAINT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSTRAINT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSTRAINT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CONSTRAINT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONSTRAINT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONSTRAINT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CONSTRAINT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CONSTRAINT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CONSTRAINT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CONSTRAINT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CONSTRAINT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CONSTRAINT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONSTRAINT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CONSTRAINT___GET_MODEL:
+			return getModel();
+		case UMLPackage.CONSTRAINT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CONSTRAINT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CONSTRAINT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONSTRAINT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CONSTRAINT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONSTRAINT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CONSTRAINT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONSTRAINT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONSTRAINT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CONSTRAINT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONSTRAINT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CONSTRAINT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CONSTRAINT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CONSTRAINT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CONSTRAINT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CONSTRAINT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONSTRAINT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CONSTRAINT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CONSTRAINT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSTRAINT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSTRAINT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSTRAINT___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CONSTRAINT___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CONSTRAINT___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CONSTRAINT___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CONSTRAINT___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CONSTRAINT___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CONSTRAINT___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CONSTRAINT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CONSTRAINT___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CONSTRAINT___SEPARATOR:
+			return separator();
+		case UMLPackage.CONSTRAINT___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CONSTRAINT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.CONSTRAINT___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.CONSTRAINT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSTRAINT___VALIDATE_BOOLEAN_VALUE__DIAGNOSTICCHAIN_MAP:
+			return validateBooleanValue((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSTRAINT___VALIDATE_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONSTRAINT___VALIDATE_NOT_APPLY_TO_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotApplyToSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -703,10 +644,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.CONSTRAINT__OWNED_COMMENT,
-		UMLPackage.CONSTRAINT__NAME_EXPRESSION,
-		UMLPackage.CONSTRAINT__SPECIFICATION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.CONSTRAINT__OWNED_COMMENT, UMLPackage.CONSTRAINT__NAME_EXPRESSION, UMLPackage.CONSTRAINT__SPECIFICATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -716,9 +654,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -729,7 +665,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.CONSTRAINT__SPECIFICATION);
+				|| eIsSet(UMLPackage.CONSTRAINT__SPECIFICATION);
 	}
 
 	/**
@@ -753,7 +689,8 @@
 	 */
 	@Override
 	public boolean isSetNamespace() {
-		return super.isSetNamespace() || eIsSet(UMLPackage.CONSTRAINT__CONTEXT);
+		return super.isSetNamespace()
+				|| eIsSet(UMLPackage.CONSTRAINT__CONTEXT);
 	}
 
 } //ConstraintImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ContinuationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ContinuationImpl.java
index 9d0f653..77e59ec 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ContinuationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ContinuationImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,11 +18,15 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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.impl.ENotificationImpl;
+
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Continuation;
 import org.eclipse.uml2.uml.GeneralOrdering;
@@ -90,9 +94,7 @@
 	 * @generated
 	 */
 	public boolean isSetting() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.CONTINUATION__SETTING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONTINUATION__SETTING, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.CONTINUATION__SETTING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONTINUATION__SETTING, true, true);
 	}
 
 	/**
@@ -101,8 +103,7 @@
 	 * @generated
 	 */
 	public void setSetting(boolean newSetting) {
-		eDynamicSet(UMLPackage.CONTINUATION__SETTING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONTINUATION__SETTING, newSetting);
+		eDynamicSet(UMLPackage.CONTINUATION__SETTING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONTINUATION__SETTING, newSetting);
 	}
 
 	/**
@@ -112,8 +113,7 @@
 	 */
 	public boolean validateSameName(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ContinuationOperations.validateSameName(this, diagnostics,
-			context);
+		return ContinuationOperations.validateSameName(this, diagnostics, context);
 	}
 
 	/**
@@ -123,8 +123,7 @@
 	 */
 	public boolean validateGlobal(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ContinuationOperations.validateGlobal(this, diagnostics,
-			context);
+		return ContinuationOperations.validateGlobal(this, diagnostics, context);
 	}
 
 	/**
@@ -134,8 +133,7 @@
 	 */
 	public boolean validateFirstOrLastInteractionFragment(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return ContinuationOperations
-			.validateFirstOrLastInteractionFragment(this, diagnostics, context);
+		return ContinuationOperations.validateFirstOrLastInteractionFragment(this, diagnostics, context);
 	}
 
 	/**
@@ -146,46 +144,46 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CONTINUATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CONTINUATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CONTINUATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CONTINUATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CONTINUATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CONTINUATION__NAME :
-				return getName();
-			case UMLPackage.CONTINUATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CONTINUATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CONTINUATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CONTINUATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CONTINUATION__COVERED :
-				return getCovereds();
-			case UMLPackage.CONTINUATION__ENCLOSING_OPERAND :
-				if (resolve)
-					return getEnclosingOperand();
-				return basicGetEnclosingOperand();
-			case UMLPackage.CONTINUATION__ENCLOSING_INTERACTION :
-				if (resolve)
-					return getEnclosingInteraction();
-				return basicGetEnclosingInteraction();
-			case UMLPackage.CONTINUATION__GENERAL_ORDERING :
-				return getGeneralOrderings();
-			case UMLPackage.CONTINUATION__SETTING :
-				return isSetting();
+		case UMLPackage.CONTINUATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CONTINUATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CONTINUATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CONTINUATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CONTINUATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CONTINUATION__NAME:
+			return getName();
+		case UMLPackage.CONTINUATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CONTINUATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CONTINUATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CONTINUATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CONTINUATION__COVERED:
+			return getCovereds();
+		case UMLPackage.CONTINUATION__ENCLOSING_OPERAND:
+			if (resolve)
+				return getEnclosingOperand();
+			return basicGetEnclosingOperand();
+		case UMLPackage.CONTINUATION__ENCLOSING_INTERACTION:
+			if (resolve)
+				return getEnclosingInteraction();
+			return basicGetEnclosingInteraction();
+		case UMLPackage.CONTINUATION__GENERAL_ORDERING:
+			return getGeneralOrderings();
+		case UMLPackage.CONTINUATION__SETTING:
+			return isSetting();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -199,43 +197,40 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CONTINUATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CONTINUATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CONTINUATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CONTINUATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CONTINUATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CONTINUATION__COVERED :
-				getCovereds().clear();
-				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
-				return;
-			case UMLPackage.CONTINUATION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) newValue);
-				return;
-			case UMLPackage.CONTINUATION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.CONTINUATION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				getGeneralOrderings()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.CONTINUATION__SETTING :
-				setSetting((Boolean) newValue);
-				return;
+		case UMLPackage.CONTINUATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CONTINUATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CONTINUATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CONTINUATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CONTINUATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CONTINUATION__COVERED:
+			getCovereds().clear();
+			getCovereds().addAll((Collection<? extends Lifeline>) newValue);
+			return;
+		case UMLPackage.CONTINUATION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) newValue);
+			return;
+		case UMLPackage.CONTINUATION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.CONTINUATION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			getGeneralOrderings().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.CONTINUATION__SETTING:
+			setSetting((Boolean) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -248,36 +243,36 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONTINUATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CONTINUATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CONTINUATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CONTINUATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CONTINUATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CONTINUATION__COVERED :
-				getCovereds().clear();
-				return;
-			case UMLPackage.CONTINUATION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) null);
-				return;
-			case UMLPackage.CONTINUATION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) null);
-				return;
-			case UMLPackage.CONTINUATION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				return;
-			case UMLPackage.CONTINUATION__SETTING :
-				setSetting(SETTING_EDEFAULT);
-				return;
+		case UMLPackage.CONTINUATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CONTINUATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CONTINUATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CONTINUATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CONTINUATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CONTINUATION__COVERED:
+			getCovereds().clear();
+			return;
+		case UMLPackage.CONTINUATION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) null);
+			return;
+		case UMLPackage.CONTINUATION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) null);
+			return;
+		case UMLPackage.CONTINUATION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			return;
+		case UMLPackage.CONTINUATION__SETTING:
+			setSetting(SETTING_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -290,38 +285,36 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CONTINUATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CONTINUATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CONTINUATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CONTINUATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.CONTINUATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CONTINUATION__NAME :
-				return isSetName();
-			case UMLPackage.CONTINUATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CONTINUATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CONTINUATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CONTINUATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CONTINUATION__COVERED :
-				return !getCovereds().isEmpty();
-			case UMLPackage.CONTINUATION__ENCLOSING_OPERAND :
-				return basicGetEnclosingOperand() != null;
-			case UMLPackage.CONTINUATION__ENCLOSING_INTERACTION :
-				return basicGetEnclosingInteraction() != null;
-			case UMLPackage.CONTINUATION__GENERAL_ORDERING :
-				return !getGeneralOrderings().isEmpty();
-			case UMLPackage.CONTINUATION__SETTING :
-				return isSetting() != SETTING_EDEFAULT;
+		case UMLPackage.CONTINUATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CONTINUATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CONTINUATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CONTINUATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.CONTINUATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CONTINUATION__NAME:
+			return isSetName();
+		case UMLPackage.CONTINUATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CONTINUATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CONTINUATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CONTINUATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CONTINUATION__COVERED:
+			return !getCovereds().isEmpty();
+		case UMLPackage.CONTINUATION__ENCLOSING_OPERAND:
+			return basicGetEnclosingOperand() != null;
+		case UMLPackage.CONTINUATION__ENCLOSING_INTERACTION:
+			return basicGetEnclosingInteraction() != null;
+		case UMLPackage.CONTINUATION__GENERAL_ORDERING:
+			return !getGeneralOrderings().isEmpty();
+		case UMLPackage.CONTINUATION__SETTING:
+			return isSetting() != SETTING_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -336,135 +329,116 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CONTINUATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONTINUATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTINUATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTINUATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CONTINUATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONTINUATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONTINUATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CONTINUATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CONTINUATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CONTINUATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CONTINUATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CONTINUATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CONTINUATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONTINUATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CONTINUATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.CONTINUATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CONTINUATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CONTINUATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CONTINUATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CONTINUATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CONTINUATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CONTINUATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONTINUATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CONTINUATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CONTINUATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CONTINUATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONTINUATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONTINUATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CONTINUATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONTINUATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CONTINUATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CONTINUATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CONTINUATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CONTINUATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CONTINUATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONTINUATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CONTINUATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CONTINUATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTINUATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTINUATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTINUATION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CONTINUATION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CONTINUATION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CONTINUATION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CONTINUATION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CONTINUATION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CONTINUATION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CONTINUATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CONTINUATION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CONTINUATION___SEPARATOR :
-				return separator();
-			case UMLPackage.CONTINUATION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CONTINUATION___VALIDATE_FIRST_OR_LAST_INTERACTION_FRAGMENT__DIAGNOSTICCHAIN_MAP :
-				return validateFirstOrLastInteractionFragment(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTINUATION___VALIDATE_SAME_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateSameName((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTINUATION___VALIDATE_GLOBAL__DIAGNOSTICCHAIN_MAP :
-				return validateGlobal((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTINUATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONTINUATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTINUATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTINUATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CONTINUATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONTINUATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONTINUATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CONTINUATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CONTINUATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CONTINUATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CONTINUATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CONTINUATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CONTINUATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONTINUATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CONTINUATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.CONTINUATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CONTINUATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CONTINUATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONTINUATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CONTINUATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CONTINUATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CONTINUATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONTINUATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CONTINUATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CONTINUATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CONTINUATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONTINUATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONTINUATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CONTINUATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONTINUATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CONTINUATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CONTINUATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CONTINUATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CONTINUATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CONTINUATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONTINUATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CONTINUATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CONTINUATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTINUATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTINUATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTINUATION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CONTINUATION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CONTINUATION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CONTINUATION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CONTINUATION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CONTINUATION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CONTINUATION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CONTINUATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CONTINUATION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CONTINUATION___SEPARATOR:
+			return separator();
+		case UMLPackage.CONTINUATION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CONTINUATION___VALIDATE_FIRST_OR_LAST_INTERACTION_FRAGMENT__DIAGNOSTICCHAIN_MAP:
+			return validateFirstOrLastInteractionFragment((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTINUATION___VALIDATE_SAME_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateSameName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTINUATION___VALIDATE_GLOBAL__DIAGNOSTICCHAIN_MAP:
+			return validateGlobal((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ControlFlowImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ControlFlowImpl.java
index c43d075..835bee7 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ControlFlowImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ControlFlowImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -67,8 +67,7 @@
 	 */
 	public boolean validateObjectNodes(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ControlFlowOperations.validateObjectNodes(this, diagnostics,
-			context);
+		return ControlFlowOperations.validateObjectNodes(this, diagnostics, context);
 	}
 
 	/**
@@ -81,149 +80,124 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CONTROL_FLOW___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTROL_FLOW___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTROL_FLOW___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CONTROL_FLOW___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CONTROL_FLOW___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CONTROL_FLOW___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CONTROL_FLOW___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONTROL_FLOW___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___GET_MODEL :
-				return getModel();
-			case UMLPackage.CONTROL_FLOW___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CONTROL_FLOW___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CONTROL_FLOW___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CONTROL_FLOW___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CONTROL_FLOW___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CONTROL_FLOW___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CONTROL_FLOW___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONTROL_FLOW___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CONTROL_FLOW___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CONTROL_FLOW___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CONTROL_FLOW___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CONTROL_FLOW___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTROL_FLOW___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTROL_FLOW___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTROL_FLOW___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CONTROL_FLOW___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CONTROL_FLOW___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CONTROL_FLOW___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CONTROL_FLOW___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CONTROL_FLOW___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CONTROL_FLOW___SEPARATOR :
-				return separator();
-			case UMLPackage.CONTROL_FLOW___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CONTROL_FLOW___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTROL_FLOW___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTROL_FLOW___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTROL_FLOW___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.CONTROL_FLOW___VALIDATE_SOURCE_AND_TARGET__DIAGNOSTICCHAIN_MAP :
-				return validateSourceAndTarget(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CONTROL_FLOW___VALIDATE_OBJECT_NODES__DIAGNOSTICCHAIN_MAP :
-				return validateObjectNodes((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTROL_FLOW___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTROL_FLOW___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTROL_FLOW___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CONTROL_FLOW___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CONTROL_FLOW___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CONTROL_FLOW___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CONTROL_FLOW___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONTROL_FLOW___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___GET_MODEL:
+			return getModel();
+		case UMLPackage.CONTROL_FLOW___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CONTROL_FLOW___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CONTROL_FLOW___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CONTROL_FLOW___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CONTROL_FLOW___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CONTROL_FLOW___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CONTROL_FLOW___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONTROL_FLOW___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CONTROL_FLOW___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CONTROL_FLOW___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CONTROL_FLOW___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CONTROL_FLOW___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTROL_FLOW___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTROL_FLOW___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTROL_FLOW___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CONTROL_FLOW___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CONTROL_FLOW___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CONTROL_FLOW___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CONTROL_FLOW___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CONTROL_FLOW___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CONTROL_FLOW___SEPARATOR:
+			return separator();
+		case UMLPackage.CONTROL_FLOW___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CONTROL_FLOW___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTROL_FLOW___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTROL_FLOW___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTROL_FLOW___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.CONTROL_FLOW___VALIDATE_SOURCE_AND_TARGET__DIAGNOSTICCHAIN_MAP:
+			return validateSourceAndTarget((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CONTROL_FLOW___VALIDATE_OBJECT_NODES__DIAGNOSTICCHAIN_MAP:
+			return validateObjectNodes((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ControlNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ControlNodeImpl.java
index d1b445b..662cd83 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ControlNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ControlNodeImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CreateLinkActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CreateLinkActionImpl.java
index 287f958..5ba7691 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CreateLinkActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CreateLinkActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 212765, 418466, 451350, 485756
  *
  */
@@ -25,6 +25,8 @@
 import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.uml2.uml.Activity;
 import org.eclipse.uml2.uml.ActivityEdge;
@@ -93,9 +95,7 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<LinkEndData> getEndData() {
-		return (EList<LinkEndData>) eDynamicGet(
-			UMLPackage.CREATE_LINK_ACTION__END_DATA - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_ACTION__END_DATA, true, true);
+		return (EList<LinkEndData>) eDynamicGet(UMLPackage.CREATE_LINK_ACTION__END_DATA - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_ACTION__END_DATA, true, true);
 	}
 
 	/**
@@ -105,8 +105,7 @@
 	 */
 	@Override
 	public LinkEndData createEndData() {
-		LinkEndCreationData newEndData = (LinkEndCreationData) create(
-			UMLPackage.Literals.LINK_END_CREATION_DATA);
+		LinkEndCreationData newEndData = (LinkEndCreationData) create(UMLPackage.Literals.LINK_END_CREATION_DATA);
 		getEndData().add(newEndData);
 		return newEndData;
 	}
@@ -127,8 +126,7 @@
 	 */
 	public boolean validateAssociationNotAbstract(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CreateLinkActionOperations.validateAssociationNotAbstract(this,
-			diagnostics, context);
+		return CreateLinkActionOperations.validateAssociationNotAbstract(this, diagnostics, context);
 	}
 
 	/**
@@ -140,43 +138,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CREATE_LINK_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_LINK_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_LINK_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.CREATE_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_LINK_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.CREATE_LINK_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CREATE_LINK_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CREATE_LINK_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_LINK_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CREATE_LINK_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_LINK_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_LINK_ACTION__END_DATA :
-				return ((InternalEList<?>) getEndData()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CREATE_LINK_ACTION__INPUT_VALUE :
-				return ((InternalEList<?>) getInputValues())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.CREATE_LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.CREATE_LINK_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_ACTION__END_DATA:
+			return ((InternalEList<?>) getEndData()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_ACTION__INPUT_VALUE:
+			return ((InternalEList<?>) getInputValues()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -189,78 +176,78 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CREATE_LINK_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CREATE_LINK_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CREATE_LINK_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CREATE_LINK_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CREATE_LINK_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CREATE_LINK_ACTION__NAME :
-				return getName();
-			case UMLPackage.CREATE_LINK_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CREATE_LINK_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CREATE_LINK_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CREATE_LINK_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CREATE_LINK_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.CREATE_LINK_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.CREATE_LINK_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.CREATE_LINK_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.CREATE_LINK_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.CREATE_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.CREATE_LINK_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.CREATE_LINK_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.CREATE_LINK_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.CREATE_LINK_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.CREATE_LINK_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.CREATE_LINK_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.CREATE_LINK_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.CREATE_LINK_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.CREATE_LINK_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.CREATE_LINK_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.CREATE_LINK_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.CREATE_LINK_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.CREATE_LINK_ACTION__END_DATA :
-				return getEndData();
-			case UMLPackage.CREATE_LINK_ACTION__INPUT_VALUE :
-				return getInputValues();
+		case UMLPackage.CREATE_LINK_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CREATE_LINK_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CREATE_LINK_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CREATE_LINK_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CREATE_LINK_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CREATE_LINK_ACTION__NAME:
+			return getName();
+		case UMLPackage.CREATE_LINK_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CREATE_LINK_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CREATE_LINK_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CREATE_LINK_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CREATE_LINK_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.CREATE_LINK_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.CREATE_LINK_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.CREATE_LINK_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.CREATE_LINK_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.CREATE_LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.CREATE_LINK_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.CREATE_LINK_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.CREATE_LINK_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.CREATE_LINK_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.CREATE_LINK_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.CREATE_LINK_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.CREATE_LINK_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.CREATE_LINK_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.CREATE_LINK_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.CREATE_LINK_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.CREATE_LINK_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.CREATE_LINK_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.CREATE_LINK_ACTION__END_DATA:
+			return getEndData();
+		case UMLPackage.CREATE_LINK_ACTION__INPUT_VALUE:
+			return getInputValues();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -274,87 +261,75 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CREATE_LINK_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__END_DATA :
-				getEndData().clear();
-				getEndData()
-					.addAll((Collection<? extends LinkEndData>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__INPUT_VALUE :
-				getInputValues().clear();
-				getInputValues()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
+		case UMLPackage.CREATE_LINK_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__END_DATA:
+			getEndData().clear();
+			getEndData().addAll((Collection<? extends LinkEndData>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__INPUT_VALUE:
+			getInputValues().clear();
+			getInputValues().addAll((Collection<? extends InputPin>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -367,63 +342,63 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CREATE_LINK_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__END_DATA :
-				getEndData().clear();
-				return;
-			case UMLPackage.CREATE_LINK_ACTION__INPUT_VALUE :
-				getInputValues().clear();
-				return;
+		case UMLPackage.CREATE_LINK_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__END_DATA:
+			getEndData().clear();
+			return;
+		case UMLPackage.CREATE_LINK_ACTION__INPUT_VALUE:
+			getInputValues().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -436,68 +411,66 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CREATE_LINK_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CREATE_LINK_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CREATE_LINK_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CREATE_LINK_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.CREATE_LINK_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CREATE_LINK_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.CREATE_LINK_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CREATE_LINK_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CREATE_LINK_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CREATE_LINK_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CREATE_LINK_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.CREATE_LINK_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.CREATE_LINK_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.CREATE_LINK_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.CREATE_LINK_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.CREATE_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.CREATE_LINK_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.CREATE_LINK_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.CREATE_LINK_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.CREATE_LINK_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.CREATE_LINK_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.CREATE_LINK_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.CREATE_LINK_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.CREATE_LINK_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.CREATE_LINK_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.CREATE_LINK_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.CREATE_LINK_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.CREATE_LINK_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.CREATE_LINK_ACTION__END_DATA :
-				return isSetEndData();
-			case UMLPackage.CREATE_LINK_ACTION__INPUT_VALUE :
-				return !getInputValues().isEmpty();
+		case UMLPackage.CREATE_LINK_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CREATE_LINK_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CREATE_LINK_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CREATE_LINK_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.CREATE_LINK_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CREATE_LINK_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.CREATE_LINK_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CREATE_LINK_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CREATE_LINK_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CREATE_LINK_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CREATE_LINK_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.CREATE_LINK_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.CREATE_LINK_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.CREATE_LINK_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.CREATE_LINK_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.CREATE_LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.CREATE_LINK_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.CREATE_LINK_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.CREATE_LINK_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.CREATE_LINK_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.CREATE_LINK_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.CREATE_LINK_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.CREATE_LINK_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.CREATE_LINK_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.CREATE_LINK_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.CREATE_LINK_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.CREATE_LINK_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.CREATE_LINK_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.CREATE_LINK_ACTION__END_DATA:
+			return isSetEndData();
+		case UMLPackage.CREATE_LINK_ACTION__INPUT_VALUE:
+			return !getInputValues().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -512,171 +485,142 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CREATE_LINK_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CREATE_LINK_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CREATE_LINK_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CREATE_LINK_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CREATE_LINK_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.CREATE_LINK_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CREATE_LINK_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CREATE_LINK_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CREATE_LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CREATE_LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CREATE_LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CREATE_LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CREATE_LINK_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CREATE_LINK_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CREATE_LINK_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CREATE_LINK_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CREATE_LINK_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CREATE_LINK_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CREATE_LINK_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CREATE_LINK_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.CREATE_LINK_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CREATE_LINK_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.CREATE_LINK_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.CREATE_LINK_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.CREATE_LINK_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.CREATE_LINK_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.CREATE_LINK_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.CREATE_LINK_ACTION___VALIDATE_SAME_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateSamePins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___VALIDATE_SAME_ASSOCIATION__DIAGNOSTICCHAIN_MAP :
-				return validateSameAssociation(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP :
-				return validateNotStatic((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___ASSOCIATION :
-				return association();
-			case UMLPackage.CREATE_LINK_ACTION___VALIDATE_ALLOW_ACCESS__DIAGNOSTICCHAIN_MAP :
-				return validateAllowAccess((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_ACTION___VALIDATE_ASSOCIATION_NOT_ABSTRACT__DIAGNOSTICCHAIN_MAP :
-				return validateAssociationNotAbstract(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CREATE_LINK_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CREATE_LINK_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CREATE_LINK_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CREATE_LINK_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.CREATE_LINK_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CREATE_LINK_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CREATE_LINK_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CREATE_LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CREATE_LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CREATE_LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CREATE_LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CREATE_LINK_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CREATE_LINK_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CREATE_LINK_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CREATE_LINK_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CREATE_LINK_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CREATE_LINK_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CREATE_LINK_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CREATE_LINK_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.CREATE_LINK_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CREATE_LINK_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.CREATE_LINK_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.CREATE_LINK_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.CREATE_LINK_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.CREATE_LINK_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.CREATE_LINK_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.CREATE_LINK_ACTION___VALIDATE_SAME_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateSamePins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___VALIDATE_SAME_ASSOCIATION__DIAGNOSTICCHAIN_MAP:
+			return validateSameAssociation((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP:
+			return validateNotStatic((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___ASSOCIATION:
+			return association();
+		case UMLPackage.CREATE_LINK_ACTION___VALIDATE_ALLOW_ACCESS__DIAGNOSTICCHAIN_MAP:
+			return validateAllowAccess((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_ACTION___VALIDATE_ASSOCIATION_NOT_ABSTRACT__DIAGNOSTICCHAIN_MAP:
+			return validateAssociationNotAbstract((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CreateLinkObjectActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CreateLinkObjectActionImpl.java
index 0a9c943..47035e4 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CreateLinkObjectActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CreateLinkObjectActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -106,19 +109,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this,
-						UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -127,10 +124,7 @@
 	 * @generated
 	 */
 	public OutputPin getResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CREATE_LINK_OBJECT_ACTION__RESULT, true, true);
+		return (OutputPin) eDynamicGet(UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CREATE_LINK_OBJECT_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -139,10 +133,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CREATE_LINK_OBJECT_ACTION__RESULT, false, true);
+		return (OutputPin) eDynamicGet(UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CREATE_LINK_OBJECT_ACTION__RESULT, false, true);
 	}
 
 	/**
@@ -152,8 +143,7 @@
 	 */
 	public NotificationChain basicSetResult(OutputPin newResult,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newResult,
-			UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newResult, UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT, msgs);
 		return msgs;
 	}
 
@@ -163,10 +153,7 @@
 	 * @generated
 	 */
 	public void setResult(OutputPin newResult) {
-		eDynamicSet(
-			UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CREATE_LINK_OBJECT_ACTION__RESULT, newResult);
+		eDynamicSet(UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CREATE_LINK_OBJECT_ACTION__RESULT, newResult);
 	}
 
 	/**
@@ -175,8 +162,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setResult(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -192,8 +178,7 @@
 	 */
 	public boolean validateAssociationClass(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CreateLinkObjectActionOperations.validateAssociationClass(this,
-			diagnostics, context);
+		return CreateLinkObjectActionOperations.validateAssociationClass(this, diagnostics, context);
 	}
 
 	/**
@@ -203,8 +188,7 @@
 	 */
 	public boolean validateTypeOfResult(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CreateLinkObjectActionOperations.validateTypeOfResult(this,
-			diagnostics, context);
+		return CreateLinkObjectActionOperations.validateTypeOfResult(this, diagnostics, context);
 	}
 
 	/**
@@ -214,8 +198,7 @@
 	 */
 	public boolean validateMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CreateLinkObjectActionOperations.validateMultiplicity(this,
-			diagnostics, context);
+		return CreateLinkObjectActionOperations.validateMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -227,45 +210,34 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__END_DATA :
-				return ((InternalEList<?>) getEndData()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT_VALUE :
-				return ((InternalEList<?>) getInputValues())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT :
-				return basicSetResult(null, msgs);
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__END_DATA:
+			return ((InternalEList<?>) getEndData()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT_VALUE:
+			return ((InternalEList<?>) getInputValues()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT:
+			return basicSetResult(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -278,82 +250,82 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME :
-				return getName();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__END_DATA :
-				return getEndData();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT_VALUE :
-				return getInputValues();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME:
+			return getName();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__END_DATA:
+			return getEndData();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT_VALUE:
+			return getInputValues();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -367,90 +339,78 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__END_DATA :
-				getEndData().clear();
-				getEndData()
-					.addAll((Collection<? extends LinkEndData>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT_VALUE :
-				getInputValues().clear();
-				getInputValues()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__END_DATA:
+			getEndData().clear();
+			getEndData().addAll((Collection<? extends LinkEndData>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT_VALUE:
+			getInputValues().clear();
+			getInputValues().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -463,66 +423,66 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__END_DATA :
-				getEndData().clear();
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT_VALUE :
-				getInputValues().clear();
-				return;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__END_DATA:
+			getEndData().clear();
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT_VALUE:
+			getInputValues().clear();
+			return;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -535,70 +495,68 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__END_DATA :
-				return isSetEndData();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT_VALUE :
-				return !getInputValues().isEmpty();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT :
-				return basicGetResult() != null;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__END_DATA:
+			return isSetEndData();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__INPUT_VALUE:
+			return !getInputValues().isEmpty();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT:
+			return basicGetResult() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -613,181 +571,148 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_SAME_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateSamePins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_SAME_ASSOCIATION__DIAGNOSTICCHAIN_MAP :
-				return validateSameAssociation(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP :
-				return validateNotStatic((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___ASSOCIATION :
-				return association();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_ALLOW_ACCESS__DIAGNOSTICCHAIN_MAP :
-				return validateAllowAccess((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_ASSOCIATION_NOT_ABSTRACT__DIAGNOSTICCHAIN_MAP :
-				return validateAssociationNotAbstract(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_TYPE_OF_RESULT__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfResult((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_ASSOCIATION_CLASS__DIAGNOSTICCHAIN_MAP :
-				return validateAssociationClass(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_SAME_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateSamePins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_SAME_ASSOCIATION__DIAGNOSTICCHAIN_MAP:
+			return validateSameAssociation((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP:
+			return validateNotStatic((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___ASSOCIATION:
+			return association();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_ALLOW_ACCESS__DIAGNOSTICCHAIN_MAP:
+			return validateAllowAccess((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_ASSOCIATION_NOT_ABSTRACT__DIAGNOSTICCHAIN_MAP:
+			return validateAssociationNotAbstract((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_TYPE_OF_RESULT__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfResult((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION___VALIDATE_ASSOCIATION_CLASS__DIAGNOSTICCHAIN_MAP:
+			return validateAssociationClass((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -800,8 +725,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -811,7 +735,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT);
+				|| eIsSet(UMLPackage.CREATE_LINK_OBJECT_ACTION__RESULT);
 	}
 
 } //CreateLinkObjectActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CreateObjectActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CreateObjectActionImpl.java
index bf1c2cb..005e140 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CreateObjectActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/CreateObjectActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -106,19 +109,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this,
-						UMLPackage.CREATE_OBJECT_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.CREATE_OBJECT_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.CREATE_OBJECT_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.CREATE_OBJECT_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -127,9 +124,7 @@
 	 * @generated
 	 */
 	public Classifier getClassifier() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.CREATE_OBJECT_ACTION__CLASSIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CREATE_OBJECT_ACTION__CLASSIFIER, true, true);
+		return (Classifier) eDynamicGet(UMLPackage.CREATE_OBJECT_ACTION__CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CREATE_OBJECT_ACTION__CLASSIFIER, true, true);
 	}
 
 	/**
@@ -138,9 +133,7 @@
 	 * @generated
 	 */
 	public Classifier basicGetClassifier() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.CREATE_OBJECT_ACTION__CLASSIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CREATE_OBJECT_ACTION__CLASSIFIER, false, true);
+		return (Classifier) eDynamicGet(UMLPackage.CREATE_OBJECT_ACTION__CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CREATE_OBJECT_ACTION__CLASSIFIER, false, true);
 	}
 
 	/**
@@ -149,10 +142,7 @@
 	 * @generated
 	 */
 	public void setClassifier(Classifier newClassifier) {
-		eDynamicSet(
-			UMLPackage.CREATE_OBJECT_ACTION__CLASSIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CREATE_OBJECT_ACTION__CLASSIFIER,
-			newClassifier);
+		eDynamicSet(UMLPackage.CREATE_OBJECT_ACTION__CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CREATE_OBJECT_ACTION__CLASSIFIER, newClassifier);
 	}
 
 	/**
@@ -161,9 +151,7 @@
 	 * @generated
 	 */
 	public OutputPin getResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.CREATE_OBJECT_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CREATE_OBJECT_ACTION__RESULT, true, true);
+		return (OutputPin) eDynamicGet(UMLPackage.CREATE_OBJECT_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CREATE_OBJECT_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -172,9 +160,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.CREATE_OBJECT_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CREATE_OBJECT_ACTION__RESULT, false, true);
+		return (OutputPin) eDynamicGet(UMLPackage.CREATE_OBJECT_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CREATE_OBJECT_ACTION__RESULT, false, true);
 	}
 
 	/**
@@ -184,8 +170,7 @@
 	 */
 	public NotificationChain basicSetResult(OutputPin newResult,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newResult,
-			UMLPackage.CREATE_OBJECT_ACTION__RESULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newResult, UMLPackage.CREATE_OBJECT_ACTION__RESULT, msgs);
 		return msgs;
 	}
 
@@ -195,9 +180,7 @@
 	 * @generated
 	 */
 	public void setResult(OutputPin newResult) {
-		eDynamicSet(
-			UMLPackage.CREATE_OBJECT_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CREATE_OBJECT_ACTION__RESULT, newResult);
+		eDynamicSet(UMLPackage.CREATE_OBJECT_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CREATE_OBJECT_ACTION__RESULT, newResult);
 	}
 
 	/**
@@ -206,8 +189,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setResult(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -223,8 +205,7 @@
 	 */
 	public boolean validateClassifierNotAbstract(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CreateObjectActionOperations.validateClassifierNotAbstract(this,
-			diagnostics, context);
+		return CreateObjectActionOperations.validateClassifierNotAbstract(this, diagnostics, context);
 	}
 
 	/**
@@ -234,8 +215,7 @@
 	 */
 	public boolean validateClassifierNotAssociationClass(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return CreateObjectActionOperations
-			.validateClassifierNotAssociationClass(this, diagnostics, context);
+		return CreateObjectActionOperations.validateClassifierNotAssociationClass(this, diagnostics, context);
 	}
 
 	/**
@@ -245,8 +225,7 @@
 	 */
 	public boolean validateSameType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CreateObjectActionOperations.validateSameType(this, diagnostics,
-			context);
+		return CreateObjectActionOperations.validateSameType(this, diagnostics, context);
 	}
 
 	/**
@@ -256,8 +235,7 @@
 	 */
 	public boolean validateMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return CreateObjectActionOperations.validateMultiplicity(this,
-			diagnostics, context);
+		return CreateObjectActionOperations.validateMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -269,39 +247,30 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.CREATE_OBJECT_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_OBJECT_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_OBJECT_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.CREATE_OBJECT_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CREATE_OBJECT_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_OBJECT_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.CREATE_OBJECT_ACTION__RESULT :
-				return basicSetResult(null, msgs);
+		case UMLPackage.CREATE_OBJECT_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_OBJECT_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_OBJECT_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.CREATE_OBJECT_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_OBJECT_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_OBJECT_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.CREATE_OBJECT_ACTION__RESULT:
+			return basicSetResult(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -314,82 +283,82 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.CREATE_OBJECT_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.CREATE_OBJECT_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.CREATE_OBJECT_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.CREATE_OBJECT_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.CREATE_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.CREATE_OBJECT_ACTION__NAME :
-				return getName();
-			case UMLPackage.CREATE_OBJECT_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.CREATE_OBJECT_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.CREATE_OBJECT_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CREATE_OBJECT_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.CREATE_OBJECT_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.CREATE_OBJECT_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.CREATE_OBJECT_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.CREATE_OBJECT_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.CREATE_OBJECT_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.CREATE_OBJECT_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.CREATE_OBJECT_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.CREATE_OBJECT_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.CREATE_OBJECT_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.CREATE_OBJECT_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.CREATE_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.CREATE_OBJECT_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.CREATE_OBJECT_ACTION__CLASSIFIER :
-				if (resolve)
-					return getClassifier();
-				return basicGetClassifier();
-			case UMLPackage.CREATE_OBJECT_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
+		case UMLPackage.CREATE_OBJECT_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.CREATE_OBJECT_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.CREATE_OBJECT_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.CREATE_OBJECT_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.CREATE_OBJECT_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.CREATE_OBJECT_ACTION__NAME:
+			return getName();
+		case UMLPackage.CREATE_OBJECT_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.CREATE_OBJECT_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.CREATE_OBJECT_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CREATE_OBJECT_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.CREATE_OBJECT_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.CREATE_OBJECT_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.CREATE_OBJECT_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.CREATE_OBJECT_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.CREATE_OBJECT_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.CREATE_OBJECT_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.CREATE_OBJECT_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.CREATE_OBJECT_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.CREATE_OBJECT_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.CREATE_OBJECT_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.CREATE_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.CREATE_OBJECT_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.CREATE_OBJECT_ACTION__CLASSIFIER:
+			if (resolve)
+				return getClassifier();
+			return basicGetClassifier();
+		case UMLPackage.CREATE_OBJECT_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -403,83 +372,73 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.CREATE_OBJECT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__CLASSIFIER :
-				setClassifier((Classifier) newValue);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
+		case UMLPackage.CREATE_OBJECT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__CLASSIFIER:
+			setClassifier((Classifier) newValue);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -492,63 +451,63 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CREATE_OBJECT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__CLASSIFIER :
-				setClassifier((Classifier) null);
-				return;
-			case UMLPackage.CREATE_OBJECT_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
+		case UMLPackage.CREATE_OBJECT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__CLASSIFIER:
+			setClassifier((Classifier) null);
+			return;
+		case UMLPackage.CREATE_OBJECT_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -561,68 +520,66 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.CREATE_OBJECT_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.CREATE_OBJECT_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.CREATE_OBJECT_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.CREATE_OBJECT_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.CREATE_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.CREATE_OBJECT_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.CREATE_OBJECT_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.CREATE_OBJECT_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.CREATE_OBJECT_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.CREATE_OBJECT_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.CREATE_OBJECT_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.CREATE_OBJECT_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.CREATE_OBJECT_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.CREATE_OBJECT_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.CREATE_OBJECT_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.CREATE_OBJECT_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.CREATE_OBJECT_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.CREATE_OBJECT_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.CREATE_OBJECT_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.CREATE_OBJECT_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.CREATE_OBJECT_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.CREATE_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.CREATE_OBJECT_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.CREATE_OBJECT_ACTION__CLASSIFIER :
-				return basicGetClassifier() != null;
-			case UMLPackage.CREATE_OBJECT_ACTION__RESULT :
-				return basicGetResult() != null;
+		case UMLPackage.CREATE_OBJECT_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.CREATE_OBJECT_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.CREATE_OBJECT_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.CREATE_OBJECT_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.CREATE_OBJECT_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.CREATE_OBJECT_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.CREATE_OBJECT_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.CREATE_OBJECT_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.CREATE_OBJECT_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.CREATE_OBJECT_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.CREATE_OBJECT_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.CREATE_OBJECT_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.CREATE_OBJECT_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.CREATE_OBJECT_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.CREATE_OBJECT_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.CREATE_OBJECT_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.CREATE_OBJECT_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.CREATE_OBJECT_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.CREATE_OBJECT_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.CREATE_OBJECT_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.CREATE_OBJECT_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.CREATE_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.CREATE_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.CREATE_OBJECT_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.CREATE_OBJECT_ACTION__CLASSIFIER:
+			return basicGetClassifier() != null;
+		case UMLPackage.CREATE_OBJECT_ACTION__RESULT:
+			return basicGetResult() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -637,166 +594,138 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_OBJECT_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CREATE_OBJECT_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.CREATE_OBJECT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.CREATE_OBJECT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.CREATE_OBJECT_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_OBJECT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.CREATE_OBJECT_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.CREATE_OBJECT_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.CREATE_OBJECT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.CREATE_OBJECT_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_OBJECT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.CREATE_OBJECT_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.CREATE_OBJECT_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.CREATE_OBJECT_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.CREATE_OBJECT_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.CREATE_OBJECT_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_CLASSIFIER_NOT_ABSTRACT__DIAGNOSTICCHAIN_MAP :
-				return validateClassifierNotAbstract(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_CLASSIFIER_NOT_ASSOCIATION_CLASS__DIAGNOSTICCHAIN_MAP :
-				return validateClassifierNotAssociationClass(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_SAME_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSameType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.CREATE_OBJECT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.CREATE_OBJECT_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.CREATE_OBJECT_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.CREATE_OBJECT_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.CREATE_OBJECT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.CREATE_OBJECT_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.CREATE_OBJECT_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.CREATE_OBJECT_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.CREATE_OBJECT_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.CREATE_OBJECT_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.CREATE_OBJECT_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_CLASSIFIER_NOT_ABSTRACT__DIAGNOSTICCHAIN_MAP:
+			return validateClassifierNotAbstract((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_CLASSIFIER_NOT_ASSOCIATION_CLASS__DIAGNOSTICCHAIN_MAP:
+			return validateClassifierNotAssociationClass((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.CREATE_OBJECT_ACTION___VALIDATE_SAME_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSameType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -809,8 +738,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.CREATE_OBJECT_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.CREATE_OBJECT_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -820,7 +748,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.CREATE_OBJECT_ACTION__RESULT);
+				|| eIsSet(UMLPackage.CREATE_OBJECT_ACTION__RESULT);
 	}
 
 } //CreateObjectActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DataStoreNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DataStoreNodeImpl.java
index cab321a..cf2f92f 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DataStoreNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DataStoreNodeImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DataTypeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DataTypeImpl.java
index 4422243..c1679cd 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DataTypeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DataTypeImpl.java
@@ -1,13 +1,13 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -27,6 +27,7 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -115,19 +116,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Property> attributes = (EList<Property>) cache.get(eResource,
-				this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
+			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>(
-						Property.class, this, UMLPackage.DATA_TYPE__ATTRIBUTE,
-						ATTRIBUTE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE, attributes = new DerivedUnionEObjectEList<Property>(Property.class, this, UMLPackage.DATA_TYPE__ATTRIBUTE, ATTRIBUTE_ESUBSETS));
 			}
 			return attributes;
 		}
-		return new DerivedUnionEObjectEList<Property>(Property.class, this,
-			UMLPackage.DATA_TYPE__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Property>(Property.class, this, UMLPackage.DATA_TYPE__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
 	}
 
 	/**
@@ -141,20 +136,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.DATA_TYPE__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.DATA_TYPE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(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);
 	}
 
 	/**
@@ -168,19 +156,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Feature> features = (EList<Feature>) cache.get(eResource,
-				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
+			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>(
-						Feature.class, this, UMLPackage.DATA_TYPE__FEATURE,
-						FEATURE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.CLASSIFIER__FEATURE, features = new DerivedUnionEObjectEList<Feature>(Feature.class, this, UMLPackage.DATA_TYPE__FEATURE, FEATURE_ESUBSETS));
 			}
 			return features;
 		}
-		return new DerivedUnionEObjectEList<Feature>(Feature.class, this,
-			UMLPackage.DATA_TYPE__FEATURE, FEATURE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this, UMLPackage.DATA_TYPE__FEATURE, FEATURE_ESUBSETS);
 	}
 
 	/**
@@ -190,9 +172,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Property> getOwnedAttributes() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DATA_TYPE__OWNED_ATTRIBUTE, true, true);
+		return (EList<Property>) eDynamicGet(UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DATA_TYPE__OWNED_ATTRIBUTE, true, true);
 	}
 
 	/**
@@ -236,20 +216,16 @@
 	 */
 	public Property getOwnedAttribute(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		ownedAttributeLoop : for (Property ownedAttribute : getOwnedAttributes()) {
+		ownedAttributeLoop: for (Property ownedAttribute : getOwnedAttributes()) {
 			if (eClass != null && !eClass.isInstance(ownedAttribute))
 				continue ownedAttributeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedAttribute.getName())
-				: name.equals(ownedAttribute.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedAttribute.getName()) : name.equals(ownedAttribute.getName())))
 				continue ownedAttributeLoop;
 			if (type != null && !type.equals(ownedAttribute.getType()))
 				continue ownedAttributeLoop;
 			return ownedAttribute;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedAttribute(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedAttribute(name, type, eClass) : null;
 	}
 
 	/**
@@ -259,9 +235,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Operation> getOwnedOperations() {
-		return (EList<Operation>) eDynamicGet(
-			UMLPackage.DATA_TYPE__OWNED_OPERATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DATA_TYPE__OWNED_OPERATION, true, true);
+		return (EList<Operation>) eDynamicGet(UMLPackage.DATA_TYPE__OWNED_OPERATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DATA_TYPE__OWNED_OPERATION, true, true);
 	}
 
 	/**
@@ -272,29 +246,19 @@
 	public Operation createOwnedOperation(String name,
 			EList<String> ownedParameterNames,
 			EList<Type> ownedParameterTypes) {
-		Operation newOwnedOperation = (Operation) create(
-			UMLPackage.Literals.OPERATION);
+		Operation newOwnedOperation = (Operation) create(UMLPackage.Literals.OPERATION);
 		getOwnedOperations().add(newOwnedOperation);
 		if (name != null)
 			newOwnedOperation.setName(name);
 		int ownedParameterListSize = 0;
-		int ownedParameterNamesSize = ownedParameterNames == null
-			? 0
-			: ownedParameterNames.size();
+		int ownedParameterNamesSize = ownedParameterNames == null ? 0 : ownedParameterNames.size();
 		if (ownedParameterNamesSize > ownedParameterListSize)
 			ownedParameterListSize = ownedParameterNamesSize;
-		int ownedParameterTypesSize = ownedParameterTypes == null
-			? 0
-			: ownedParameterTypes.size();
+		int ownedParameterTypesSize = ownedParameterTypes == null ? 0 : ownedParameterTypes.size();
 		if (ownedParameterTypesSize > ownedParameterListSize)
 			ownedParameterListSize = ownedParameterTypesSize;
 		for (int i = 0; i < ownedParameterListSize; i++) {
-			newOwnedOperation.createOwnedParameter(i < ownedParameterNamesSize
-				? (String) ownedParameterNames.get(i)
-				: null,
-				i < ownedParameterTypesSize
-					? (Type) ownedParameterTypes.get(i)
-					: null);
+			newOwnedOperation.createOwnedParameter(i < ownedParameterNamesSize ? (String) ownedParameterNames.get(i) : null, i < ownedParameterTypesSize ? (Type) ownedParameterTypes.get(i) : null);
 		}
 		return newOwnedOperation;
 	}
@@ -307,8 +271,7 @@
 	public Operation getOwnedOperation(String name,
 			EList<String> ownedParameterNames,
 			EList<Type> ownedParameterTypes) {
-		return getOwnedOperation(name, ownedParameterNames, ownedParameterTypes,
-			false, false);
+		return getOwnedOperation(name, ownedParameterNames, ownedParameterTypes, false, false);
 	}
 
 	/**
@@ -319,37 +282,23 @@
 	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())))
+		ownedOperationLoop: for (Operation ownedOperation : getOwnedOperations()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedOperation.getName()) : name.equals(ownedOperation.getName())))
 				continue ownedOperationLoop;
-			EList<Parameter> ownedParameterList = ownedOperation
-				.getOwnedParameters();
+			EList<Parameter> ownedParameterList = ownedOperation.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
-			if (ownedParameterNames != null
-				&& ownedParameterNames.size() != ownedParameterListSize
-				|| (ownedParameterTypes != null
-					&& ownedParameterTypes.size() != ownedParameterListSize))
+			if (ownedParameterNames != null && ownedParameterNames.size() != ownedParameterListSize || (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue ownedOperationLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
 				Parameter ownedParameter = ownedParameterList.get(j);
-				if (ownedParameterNames != null && !(ignoreCase
-					? (ownedParameterNames.get(j))
-						.equalsIgnoreCase(ownedParameter.getName())
-					: ownedParameterNames.get(j)
-						.equals(ownedParameter.getName())))
+				if (ownedParameterNames != null && !(ignoreCase ? (ownedParameterNames.get(j)).equalsIgnoreCase(ownedParameter.getName()) : ownedParameterNames.get(j).equals(ownedParameter.getName())))
 					continue ownedOperationLoop;
-				if (ownedParameterTypes != null && !ownedParameterTypes.get(j)
-					.equals(ownedParameter.getType()))
+				if (ownedParameterTypes != null && !ownedParameterTypes.get(j).equals(ownedParameter.getType()))
 					continue ownedOperationLoop;
 			}
 			return ownedOperation;
 		}
-		return createOnDemand
-			? createOwnedOperation(name, ownedParameterNames,
-				ownedParameterTypes)
-			: null;
+		return createOnDemand ? createOwnedOperation(name, ownedParameterNames, ownedParameterTypes) : null;
 	}
 
 	/**
@@ -360,8 +309,7 @@
 	public Operation createOwnedOperation(String name,
 			EList<String> parameterNames, EList<Type> parameterTypes,
 			Type returnType) {
-		return DataTypeOperations.createOwnedOperation(this, name,
-			parameterNames, parameterTypes, returnType);
+		return DataTypeOperations.createOwnedOperation(this, name, parameterNames, parameterTypes, returnType);
 	}
 
 	/**
@@ -371,8 +319,7 @@
 	 */
 	public Property createOwnedAttribute(String name, Type type, int lower,
 			int upper) {
-		return DataTypeOperations.createOwnedAttribute(this, name, type, lower,
-			upper);
+		return DataTypeOperations.createOwnedAttribute(this, name, type, lower, upper);
 	}
 
 	/**
@@ -385,62 +332,42 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.DATA_TYPE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.DATA_TYPE__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedAttributes())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__OWNED_OPERATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedAttributes()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__OWNED_OPERATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -454,56 +381,42 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.DATA_TYPE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.DATA_TYPE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.DATA_TYPE__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.DATA_TYPE__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DATA_TYPE__OWNED_OPERATION :
-				return ((InternalEList<?>) getOwnedOperations())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.DATA_TYPE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.DATA_TYPE__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DATA_TYPE__OWNED_OPERATION:
+			return ((InternalEList<?>) getOwnedOperations()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -516,102 +429,102 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.DATA_TYPE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.DATA_TYPE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.DATA_TYPE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.DATA_TYPE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.DATA_TYPE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.DATA_TYPE__NAME :
-				return getName();
-			case UMLPackage.DATA_TYPE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.DATA_TYPE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.DATA_TYPE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DATA_TYPE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.DATA_TYPE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.DATA_TYPE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.DATA_TYPE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.DATA_TYPE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.DATA_TYPE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.DATA_TYPE__MEMBER :
-				return getMembers();
-			case UMLPackage.DATA_TYPE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.DATA_TYPE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.DATA_TYPE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.DATA_TYPE__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.DATA_TYPE__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.DATA_TYPE__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.DATA_TYPE__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.DATA_TYPE__FEATURE :
-				return getFeatures();
-			case UMLPackage.DATA_TYPE__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.DATA_TYPE__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.DATA_TYPE__GENERAL :
-				return getGenerals();
-			case UMLPackage.DATA_TYPE__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.DATA_TYPE__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.DATA_TYPE__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.DATA_TYPE__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.DATA_TYPE__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.DATA_TYPE__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.DATA_TYPE__USE_CASE :
-				return getUseCases();
-			case UMLPackage.DATA_TYPE__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.DATA_TYPE__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.DATA_TYPE__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.DATA_TYPE__OWNED_OPERATION :
-				return getOwnedOperations();
+		case UMLPackage.DATA_TYPE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.DATA_TYPE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.DATA_TYPE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.DATA_TYPE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.DATA_TYPE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.DATA_TYPE__NAME:
+			return getName();
+		case UMLPackage.DATA_TYPE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.DATA_TYPE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.DATA_TYPE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DATA_TYPE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.DATA_TYPE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.DATA_TYPE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.DATA_TYPE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.DATA_TYPE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.DATA_TYPE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.DATA_TYPE__MEMBER:
+			return getMembers();
+		case UMLPackage.DATA_TYPE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.DATA_TYPE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.DATA_TYPE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.DATA_TYPE__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.DATA_TYPE__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.DATA_TYPE__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.DATA_TYPE__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.DATA_TYPE__FEATURE:
+			return getFeatures();
+		case UMLPackage.DATA_TYPE__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.DATA_TYPE__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.DATA_TYPE__GENERAL:
+			return getGenerals();
+		case UMLPackage.DATA_TYPE__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.DATA_TYPE__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.DATA_TYPE__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.DATA_TYPE__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.DATA_TYPE__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.DATA_TYPE__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.DATA_TYPE__USE_CASE:
+			return getUseCases();
+		case UMLPackage.DATA_TYPE__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.DATA_TYPE__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.DATA_TYPE__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.DATA_TYPE__OWNED_OPERATION:
+			return getOwnedOperations();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -625,118 +538,103 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.DATA_TYPE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.DATA_TYPE__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
+		case UMLPackage.DATA_TYPE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.DATA_TYPE__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -749,87 +647,87 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DATA_TYPE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.DATA_TYPE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.DATA_TYPE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.DATA_TYPE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.DATA_TYPE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.DATA_TYPE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.DATA_TYPE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.DATA_TYPE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.DATA_TYPE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.DATA_TYPE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DATA_TYPE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DATA_TYPE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.DATA_TYPE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.DATA_TYPE__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.DATA_TYPE__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.DATA_TYPE__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.DATA_TYPE__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.DATA_TYPE__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.DATA_TYPE__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.DATA_TYPE__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.DATA_TYPE__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.DATA_TYPE__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.DATA_TYPE__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.DATA_TYPE__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.DATA_TYPE__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
+		case UMLPackage.DATA_TYPE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.DATA_TYPE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.DATA_TYPE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.DATA_TYPE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.DATA_TYPE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.DATA_TYPE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.DATA_TYPE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.DATA_TYPE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.DATA_TYPE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.DATA_TYPE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DATA_TYPE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DATA_TYPE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.DATA_TYPE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.DATA_TYPE__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.DATA_TYPE__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.DATA_TYPE__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.DATA_TYPE__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.DATA_TYPE__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.DATA_TYPE__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.DATA_TYPE__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.DATA_TYPE__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.DATA_TYPE__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.DATA_TYPE__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.DATA_TYPE__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.DATA_TYPE__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -842,88 +740,86 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DATA_TYPE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.DATA_TYPE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.DATA_TYPE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.DATA_TYPE__OWNER :
-				return isSetOwner();
-			case UMLPackage.DATA_TYPE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.DATA_TYPE__NAME :
-				return isSetName();
-			case UMLPackage.DATA_TYPE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.DATA_TYPE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.DATA_TYPE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.DATA_TYPE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.DATA_TYPE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.DATA_TYPE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.DATA_TYPE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.DATA_TYPE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.DATA_TYPE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.DATA_TYPE__MEMBER :
-				return isSetMembers();
-			case UMLPackage.DATA_TYPE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.DATA_TYPE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.DATA_TYPE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.DATA_TYPE__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.DATA_TYPE__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.DATA_TYPE__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.DATA_TYPE__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.DATA_TYPE__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.DATA_TYPE__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.DATA_TYPE__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.DATA_TYPE__GENERAL :
-				return !getGenerals().isEmpty();
-			case UMLPackage.DATA_TYPE__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.DATA_TYPE__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.DATA_TYPE__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.DATA_TYPE__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.DATA_TYPE__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.DATA_TYPE__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.DATA_TYPE__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.DATA_TYPE__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.DATA_TYPE__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.DATA_TYPE__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE :
-				return !getOwnedAttributes().isEmpty();
-			case UMLPackage.DATA_TYPE__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
+		case UMLPackage.DATA_TYPE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.DATA_TYPE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.DATA_TYPE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.DATA_TYPE__OWNER:
+			return isSetOwner();
+		case UMLPackage.DATA_TYPE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.DATA_TYPE__NAME:
+			return isSetName();
+		case UMLPackage.DATA_TYPE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.DATA_TYPE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.DATA_TYPE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.DATA_TYPE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.DATA_TYPE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.DATA_TYPE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.DATA_TYPE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.DATA_TYPE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.DATA_TYPE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.DATA_TYPE__MEMBER:
+			return isSetMembers();
+		case UMLPackage.DATA_TYPE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.DATA_TYPE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.DATA_TYPE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.DATA_TYPE__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.DATA_TYPE__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.DATA_TYPE__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.DATA_TYPE__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.DATA_TYPE__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.DATA_TYPE__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.DATA_TYPE__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.DATA_TYPE__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.DATA_TYPE__GENERAL:
+			return !getGenerals().isEmpty();
+		case UMLPackage.DATA_TYPE__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.DATA_TYPE__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.DATA_TYPE__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.DATA_TYPE__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.DATA_TYPE__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.DATA_TYPE__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.DATA_TYPE__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.DATA_TYPE__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.DATA_TYPE__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.DATA_TYPE__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE:
+			return !getOwnedAttributes().isEmpty();
+		case UMLPackage.DATA_TYPE__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -938,280 +834,221 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.DATA_TYPE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.DATA_TYPE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.DATA_TYPE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DATA_TYPE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.DATA_TYPE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.DATA_TYPE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.DATA_TYPE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.DATA_TYPE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.DATA_TYPE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.DATA_TYPE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.DATA_TYPE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DATA_TYPE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.DATA_TYPE___GET_MODEL :
-				return getModel();
-			case UMLPackage.DATA_TYPE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.DATA_TYPE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.DATA_TYPE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.DATA_TYPE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.DATA_TYPE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.DATA_TYPE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.DATA_TYPE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DATA_TYPE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.DATA_TYPE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.DATA_TYPE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.DATA_TYPE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DATA_TYPE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DATA_TYPE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.DATA_TYPE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DATA_TYPE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.DATA_TYPE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.DATA_TYPE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.DATA_TYPE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.DATA_TYPE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.DATA_TYPE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DATA_TYPE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.DATA_TYPE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.DATA_TYPE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.DATA_TYPE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.DATA_TYPE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.DATA_TYPE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.DATA_TYPE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.DATA_TYPE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.DATA_TYPE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.DATA_TYPE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.DATA_TYPE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DATA_TYPE___SEPARATOR :
-				return separator();
-			case UMLPackage.DATA_TYPE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.DATA_TYPE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.DATA_TYPE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.DATA_TYPE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.DATA_TYPE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.DATA_TYPE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.DATA_TYPE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.DATA_TYPE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.DATA_TYPE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.DATA_TYPE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.DATA_TYPE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.DATA_TYPE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.DATA_TYPE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.DATA_TYPE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.DATA_TYPE___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.DATA_TYPE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.DATA_TYPE___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.DATA_TYPE___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.DATA_TYPE___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.DATA_TYPE___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.DATA_TYPE___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DATA_TYPE___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.DATA_TYPE___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.DATA_TYPE___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.DATA_TYPE___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.DATA_TYPE___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.DATA_TYPE___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.DATA_TYPE___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.DATA_TYPE___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.DATA_TYPE___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.DATA_TYPE___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.DATA_TYPE___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.DATA_TYPE___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.DATA_TYPE___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.DATA_TYPE___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.DATA_TYPE___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.DATA_TYPE___PARENTS :
-				return parents();
-			case UMLPackage.DATA_TYPE___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.DATA_TYPE___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.DATA_TYPE___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.DATA_TYPE___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.DATA_TYPE___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.DATA_TYPE___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.DATA_TYPE___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.DATA_TYPE___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.DATA_TYPE___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.DATA_TYPE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.DATA_TYPE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.DATA_TYPE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DATA_TYPE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.DATA_TYPE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.DATA_TYPE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.DATA_TYPE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.DATA_TYPE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.DATA_TYPE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.DATA_TYPE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.DATA_TYPE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DATA_TYPE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.DATA_TYPE___GET_MODEL:
+			return getModel();
+		case UMLPackage.DATA_TYPE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.DATA_TYPE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.DATA_TYPE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.DATA_TYPE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.DATA_TYPE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.DATA_TYPE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.DATA_TYPE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DATA_TYPE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.DATA_TYPE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.DATA_TYPE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.DATA_TYPE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DATA_TYPE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DATA_TYPE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.DATA_TYPE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DATA_TYPE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.DATA_TYPE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.DATA_TYPE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.DATA_TYPE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.DATA_TYPE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.DATA_TYPE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DATA_TYPE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.DATA_TYPE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.DATA_TYPE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.DATA_TYPE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.DATA_TYPE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.DATA_TYPE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.DATA_TYPE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.DATA_TYPE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.DATA_TYPE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.DATA_TYPE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.DATA_TYPE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DATA_TYPE___SEPARATOR:
+			return separator();
+		case UMLPackage.DATA_TYPE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.DATA_TYPE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.DATA_TYPE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.DATA_TYPE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.DATA_TYPE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.DATA_TYPE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.DATA_TYPE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.DATA_TYPE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.DATA_TYPE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.DATA_TYPE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.DATA_TYPE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.DATA_TYPE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.DATA_TYPE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.DATA_TYPE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.DATA_TYPE___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.DATA_TYPE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.DATA_TYPE___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.DATA_TYPE___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.DATA_TYPE___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.DATA_TYPE___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.DATA_TYPE___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DATA_TYPE___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.DATA_TYPE___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.DATA_TYPE___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.DATA_TYPE___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.DATA_TYPE___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.DATA_TYPE___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.DATA_TYPE___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.DATA_TYPE___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.DATA_TYPE___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.DATA_TYPE___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.DATA_TYPE___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.DATA_TYPE___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.DATA_TYPE___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.DATA_TYPE___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.DATA_TYPE___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.DATA_TYPE___PARENTS:
+			return parents();
+		case UMLPackage.DATA_TYPE___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.DATA_TYPE___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.DATA_TYPE___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.DATA_TYPE___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.DATA_TYPE___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.DATA_TYPE___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.DATA_TYPE___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.DATA_TYPE___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.DATA_TYPE___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1224,7 +1061,7 @@
 	@Override
 	public boolean isSetAttributes() {
 		return super.isSetAttributes()
-			|| eIsSet(UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE);
+				|| eIsSet(UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE);
 	}
 
 	/**
@@ -1235,8 +1072,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] ATTRIBUTE_ESUBSETS = new int[]{
-		UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE};
+	protected static final int[] ATTRIBUTE_ESUBSETS = new int[] { UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedMembers() <em>Owned Member</em>}' reference list.
@@ -1246,10 +1082,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.DATA_TYPE__OWNED_RULE, UMLPackage.DATA_TYPE__OWNED_USE_CASE,
-		UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE,
-		UMLPackage.DATA_TYPE__OWNED_OPERATION};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.DATA_TYPE__OWNED_RULE, UMLPackage.DATA_TYPE__OWNED_USE_CASE, UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE, UMLPackage.DATA_TYPE__OWNED_OPERATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1259,8 +1092,8 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE)
-			|| eIsSet(UMLPackage.DATA_TYPE__OWNED_OPERATION);
+				|| eIsSet(UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE)
+				|| eIsSet(UMLPackage.DATA_TYPE__OWNED_OPERATION);
 	}
 
 	/**
@@ -1271,8 +1104,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] FEATURE_ESUBSETS = new int[]{
-		UMLPackage.DATA_TYPE__ATTRIBUTE, UMLPackage.DATA_TYPE__OWNED_OPERATION};
+	protected static final int[] FEATURE_ESUBSETS = new int[] { UMLPackage.DATA_TYPE__ATTRIBUTE, UMLPackage.DATA_TYPE__OWNED_OPERATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1282,7 +1114,7 @@
 	@Override
 	public boolean isSetFeatures() {
 		return super.isSetFeatures()
-			|| eIsSet(UMLPackage.DATA_TYPE__OWNED_OPERATION);
+				|| eIsSet(UMLPackage.DATA_TYPE__OWNED_OPERATION);
 	}
 
 } //DataTypeImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DecisionNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DecisionNodeImpl.java
index 0c975fc..85d237c 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DecisionNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DecisionNodeImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,11 +17,17 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+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;
@@ -85,9 +91,7 @@
 	 * @generated
 	 */
 	public Behavior getDecisionInput() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.DECISION_NODE__DECISION_INPUT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DECISION_NODE__DECISION_INPUT, true, true);
+		return (Behavior) eDynamicGet(UMLPackage.DECISION_NODE__DECISION_INPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DECISION_NODE__DECISION_INPUT, true, true);
 	}
 
 	/**
@@ -96,9 +100,7 @@
 	 * @generated
 	 */
 	public Behavior basicGetDecisionInput() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.DECISION_NODE__DECISION_INPUT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DECISION_NODE__DECISION_INPUT, false, true);
+		return (Behavior) eDynamicGet(UMLPackage.DECISION_NODE__DECISION_INPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DECISION_NODE__DECISION_INPUT, false, true);
 	}
 
 	/**
@@ -107,10 +109,7 @@
 	 * @generated
 	 */
 	public void setDecisionInput(Behavior newDecisionInput) {
-		eDynamicSet(
-			UMLPackage.DECISION_NODE__DECISION_INPUT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DECISION_NODE__DECISION_INPUT,
-			newDecisionInput);
+		eDynamicSet(UMLPackage.DECISION_NODE__DECISION_INPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DECISION_NODE__DECISION_INPUT, newDecisionInput);
 	}
 
 	/**
@@ -119,10 +118,7 @@
 	 * @generated
 	 */
 	public ObjectFlow getDecisionInputFlow() {
-		return (ObjectFlow) eDynamicGet(
-			UMLPackage.DECISION_NODE__DECISION_INPUT_FLOW
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DECISION_NODE__DECISION_INPUT_FLOW, true, true);
+		return (ObjectFlow) eDynamicGet(UMLPackage.DECISION_NODE__DECISION_INPUT_FLOW - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DECISION_NODE__DECISION_INPUT_FLOW, true, true);
 	}
 
 	/**
@@ -131,11 +127,7 @@
 	 * @generated
 	 */
 	public ObjectFlow basicGetDecisionInputFlow() {
-		return (ObjectFlow) eDynamicGet(
-			UMLPackage.DECISION_NODE__DECISION_INPUT_FLOW
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DECISION_NODE__DECISION_INPUT_FLOW, false,
-			true);
+		return (ObjectFlow) eDynamicGet(UMLPackage.DECISION_NODE__DECISION_INPUT_FLOW - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DECISION_NODE__DECISION_INPUT_FLOW, false, true);
 	}
 
 	/**
@@ -144,11 +136,7 @@
 	 * @generated
 	 */
 	public void setDecisionInputFlow(ObjectFlow newDecisionInputFlow) {
-		eDynamicSet(
-			UMLPackage.DECISION_NODE__DECISION_INPUT_FLOW
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DECISION_NODE__DECISION_INPUT_FLOW,
-			newDecisionInputFlow);
+		eDynamicSet(UMLPackage.DECISION_NODE__DECISION_INPUT_FLOW - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DECISION_NODE__DECISION_INPUT_FLOW, newDecisionInputFlow);
 	}
 
 	/**
@@ -158,8 +146,7 @@
 	 */
 	public boolean validateIncomingOutgoingEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return DecisionNodeOperations.validateIncomingOutgoingEdges(this,
-			diagnostics, context);
+		return DecisionNodeOperations.validateIncomingOutgoingEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -179,8 +166,7 @@
 	 */
 	public boolean validateDecisionInputFlowIncoming(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return DecisionNodeOperations.validateDecisionInputFlowIncoming(this,
-			diagnostics, context);
+		return DecisionNodeOperations.validateDecisionInputFlowIncoming(this, diagnostics, context);
 	}
 
 	/**
@@ -190,8 +176,7 @@
 	 */
 	public boolean validateParameters(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return DecisionNodeOperations.validateParameters(this, diagnostics,
-			context);
+		return DecisionNodeOperations.validateParameters(this, diagnostics, context);
 	}
 
 	/**
@@ -201,8 +186,7 @@
 	 */
 	public boolean validateZeroInputParameters(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return DecisionNodeOperations.validateZeroInputParameters(this,
-			diagnostics, context);
+		return DecisionNodeOperations.validateZeroInputParameters(this, diagnostics, context);
 	}
 
 	/**
@@ -212,8 +196,7 @@
 	 */
 	public boolean validateIncomingObjectOneInputParameter(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return DecisionNodeOperations.validateIncomingObjectOneInputParameter(
-			this, diagnostics, context);
+		return DecisionNodeOperations.validateIncomingObjectOneInputParameter(this, diagnostics, context);
 	}
 
 	/**
@@ -223,8 +206,7 @@
 	 */
 	public boolean validateIncomingControlOneInputParameter(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return DecisionNodeOperations.validateIncomingControlOneInputParameter(
-			this, diagnostics, context);
+		return DecisionNodeOperations.validateIncomingControlOneInputParameter(this, diagnostics, context);
 	}
 
 	/**
@@ -234,8 +216,7 @@
 	 */
 	public boolean validateTwoInputParameters(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return DecisionNodeOperations.validateTwoInputParameters(this,
-			diagnostics, context);
+		return DecisionNodeOperations.validateTwoInputParameters(this, diagnostics, context);
 	}
 
 	/**
@@ -246,66 +227,66 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.DECISION_NODE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.DECISION_NODE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.DECISION_NODE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.DECISION_NODE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.DECISION_NODE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.DECISION_NODE__NAME :
-				return getName();
-			case UMLPackage.DECISION_NODE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.DECISION_NODE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.DECISION_NODE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DECISION_NODE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.DECISION_NODE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.DECISION_NODE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.DECISION_NODE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.DECISION_NODE__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.DECISION_NODE__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.DECISION_NODE__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.DECISION_NODE__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.DECISION_NODE__INCOMING :
-				return getIncomings();
-			case UMLPackage.DECISION_NODE__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.DECISION_NODE__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.DECISION_NODE__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.DECISION_NODE__DECISION_INPUT :
-				if (resolve)
-					return getDecisionInput();
-				return basicGetDecisionInput();
-			case UMLPackage.DECISION_NODE__DECISION_INPUT_FLOW :
-				if (resolve)
-					return getDecisionInputFlow();
-				return basicGetDecisionInputFlow();
+		case UMLPackage.DECISION_NODE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.DECISION_NODE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.DECISION_NODE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.DECISION_NODE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.DECISION_NODE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.DECISION_NODE__NAME:
+			return getName();
+		case UMLPackage.DECISION_NODE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.DECISION_NODE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.DECISION_NODE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DECISION_NODE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.DECISION_NODE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.DECISION_NODE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.DECISION_NODE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.DECISION_NODE__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.DECISION_NODE__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.DECISION_NODE__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.DECISION_NODE__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.DECISION_NODE__INCOMING:
+			return getIncomings();
+		case UMLPackage.DECISION_NODE__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.DECISION_NODE__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.DECISION_NODE__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.DECISION_NODE__DECISION_INPUT:
+			if (resolve)
+				return getDecisionInput();
+			return basicGetDecisionInput();
+		case UMLPackage.DECISION_NODE__DECISION_INPUT_FLOW:
+			if (resolve)
+				return getDecisionInputFlow();
+			return basicGetDecisionInputFlow();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -319,65 +300,58 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.DECISION_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.DECISION_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.DECISION_NODE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.DECISION_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.DECISION_NODE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.DECISION_NODE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.DECISION_NODE__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.DECISION_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.DECISION_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.DECISION_NODE__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.DECISION_NODE__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.DECISION_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.DECISION_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.DECISION_NODE__DECISION_INPUT :
-				setDecisionInput((Behavior) newValue);
-				return;
-			case UMLPackage.DECISION_NODE__DECISION_INPUT_FLOW :
-				setDecisionInputFlow((ObjectFlow) newValue);
-				return;
+		case UMLPackage.DECISION_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.DECISION_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.DECISION_NODE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.DECISION_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.DECISION_NODE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.DECISION_NODE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.DECISION_NODE__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.DECISION_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.DECISION_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.DECISION_NODE__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.DECISION_NODE__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.DECISION_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.DECISION_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.DECISION_NODE__DECISION_INPUT:
+			setDecisionInput((Behavior) newValue);
+			return;
+		case UMLPackage.DECISION_NODE__DECISION_INPUT_FLOW:
+			setDecisionInputFlow((ObjectFlow) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -390,51 +364,51 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DECISION_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.DECISION_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.DECISION_NODE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.DECISION_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.DECISION_NODE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.DECISION_NODE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.DECISION_NODE__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.DECISION_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.DECISION_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.DECISION_NODE__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.DECISION_NODE__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.DECISION_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.DECISION_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.DECISION_NODE__DECISION_INPUT :
-				setDecisionInput((Behavior) null);
-				return;
-			case UMLPackage.DECISION_NODE__DECISION_INPUT_FLOW :
-				setDecisionInputFlow((ObjectFlow) null);
-				return;
+		case UMLPackage.DECISION_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.DECISION_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.DECISION_NODE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.DECISION_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.DECISION_NODE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.DECISION_NODE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.DECISION_NODE__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.DECISION_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.DECISION_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.DECISION_NODE__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.DECISION_NODE__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.DECISION_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.DECISION_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.DECISION_NODE__DECISION_INPUT:
+			setDecisionInput((Behavior) null);
+			return;
+		case UMLPackage.DECISION_NODE__DECISION_INPUT_FLOW:
+			setDecisionInputFlow((ObjectFlow) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -447,54 +421,52 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DECISION_NODE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.DECISION_NODE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.DECISION_NODE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.DECISION_NODE__OWNER :
-				return isSetOwner();
-			case UMLPackage.DECISION_NODE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.DECISION_NODE__NAME :
-				return isSetName();
-			case UMLPackage.DECISION_NODE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.DECISION_NODE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.DECISION_NODE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.DECISION_NODE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.DECISION_NODE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.DECISION_NODE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.DECISION_NODE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.DECISION_NODE__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.DECISION_NODE__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.DECISION_NODE__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.DECISION_NODE__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.DECISION_NODE__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.DECISION_NODE__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.DECISION_NODE__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.DECISION_NODE__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.DECISION_NODE__DECISION_INPUT :
-				return basicGetDecisionInput() != null;
-			case UMLPackage.DECISION_NODE__DECISION_INPUT_FLOW :
-				return basicGetDecisionInputFlow() != null;
+		case UMLPackage.DECISION_NODE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.DECISION_NODE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.DECISION_NODE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.DECISION_NODE__OWNER:
+			return isSetOwner();
+		case UMLPackage.DECISION_NODE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.DECISION_NODE__NAME:
+			return isSetName();
+		case UMLPackage.DECISION_NODE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.DECISION_NODE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.DECISION_NODE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.DECISION_NODE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.DECISION_NODE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.DECISION_NODE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.DECISION_NODE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.DECISION_NODE__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.DECISION_NODE__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.DECISION_NODE__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.DECISION_NODE__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.DECISION_NODE__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.DECISION_NODE__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.DECISION_NODE__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.DECISION_NODE__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.DECISION_NODE__DECISION_INPUT:
+			return basicGetDecisionInput() != null;
+		case UMLPackage.DECISION_NODE__DECISION_INPUT_FLOW:
+			return basicGetDecisionInputFlow() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -509,174 +481,138 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.DECISION_NODE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.DECISION_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DECISION_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DECISION_NODE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.DECISION_NODE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DECISION_NODE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.DECISION_NODE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.DECISION_NODE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.DECISION_NODE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.DECISION_NODE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.DECISION_NODE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.DECISION_NODE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.DECISION_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DECISION_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.DECISION_NODE___GET_MODEL :
-				return getModel();
-			case UMLPackage.DECISION_NODE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.DECISION_NODE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.DECISION_NODE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.DECISION_NODE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.DECISION_NODE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.DECISION_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.DECISION_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DECISION_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.DECISION_NODE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.DECISION_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.DECISION_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DECISION_NODE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DECISION_NODE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.DECISION_NODE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DECISION_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.DECISION_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.DECISION_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.DECISION_NODE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.DECISION_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.DECISION_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DECISION_NODE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.DECISION_NODE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.DECISION_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DECISION_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DECISION_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DECISION_NODE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.DECISION_NODE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.DECISION_NODE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.DECISION_NODE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.DECISION_NODE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.DECISION_NODE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.DECISION_NODE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.DECISION_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.DECISION_NODE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DECISION_NODE___SEPARATOR :
-				return separator();
-			case UMLPackage.DECISION_NODE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.DECISION_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DECISION_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DECISION_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DECISION_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.DECISION_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.DECISION_NODE___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.DECISION_NODE___VALIDATE_ZERO_INPUT_PARAMETERS__DIAGNOSTICCHAIN_MAP :
-				return validateZeroInputParameters(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DECISION_NODE___VALIDATE_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DECISION_NODE___VALIDATE_DECISION_INPUT_FLOW_INCOMING__DIAGNOSTICCHAIN_MAP :
-				return validateDecisionInputFlowIncoming(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DECISION_NODE___VALIDATE_TWO_INPUT_PARAMETERS__DIAGNOSTICCHAIN_MAP :
-				return validateTwoInputParameters(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DECISION_NODE___VALIDATE_INCOMING_OUTGOING_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateIncomingOutgoingEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DECISION_NODE___VALIDATE_INCOMING_CONTROL_ONE_INPUT_PARAMETER__DIAGNOSTICCHAIN_MAP :
-				return validateIncomingControlOneInputParameter(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DECISION_NODE___VALIDATE_PARAMETERS__DIAGNOSTICCHAIN_MAP :
-				return validateParameters((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DECISION_NODE___VALIDATE_INCOMING_OBJECT_ONE_INPUT_PARAMETER__DIAGNOSTICCHAIN_MAP :
-				return validateIncomingObjectOneInputParameter(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.DECISION_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.DECISION_NODE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DECISION_NODE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.DECISION_NODE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.DECISION_NODE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.DECISION_NODE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.DECISION_NODE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.DECISION_NODE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.DECISION_NODE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.DECISION_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DECISION_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.DECISION_NODE___GET_MODEL:
+			return getModel();
+		case UMLPackage.DECISION_NODE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.DECISION_NODE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.DECISION_NODE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.DECISION_NODE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.DECISION_NODE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.DECISION_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.DECISION_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DECISION_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.DECISION_NODE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.DECISION_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.DECISION_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DECISION_NODE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DECISION_NODE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.DECISION_NODE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DECISION_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.DECISION_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.DECISION_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.DECISION_NODE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.DECISION_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.DECISION_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DECISION_NODE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.DECISION_NODE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.DECISION_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.DECISION_NODE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.DECISION_NODE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.DECISION_NODE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.DECISION_NODE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.DECISION_NODE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.DECISION_NODE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.DECISION_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.DECISION_NODE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DECISION_NODE___SEPARATOR:
+			return separator();
+		case UMLPackage.DECISION_NODE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.DECISION_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.DECISION_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.DECISION_NODE___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.DECISION_NODE___VALIDATE_ZERO_INPUT_PARAMETERS__DIAGNOSTICCHAIN_MAP:
+			return validateZeroInputParameters((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___VALIDATE_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___VALIDATE_DECISION_INPUT_FLOW_INCOMING__DIAGNOSTICCHAIN_MAP:
+			return validateDecisionInputFlowIncoming((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___VALIDATE_TWO_INPUT_PARAMETERS__DIAGNOSTICCHAIN_MAP:
+			return validateTwoInputParameters((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___VALIDATE_INCOMING_OUTGOING_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateIncomingOutgoingEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___VALIDATE_INCOMING_CONTROL_ONE_INPUT_PARAMETER__DIAGNOSTICCHAIN_MAP:
+			return validateIncomingControlOneInputParameter((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___VALIDATE_PARAMETERS__DIAGNOSTICCHAIN_MAP:
+			return validateParameters((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DECISION_NODE___VALIDATE_INCOMING_OBJECT_ONE_INPUT_PARAMETER__DIAGNOSTICCHAIN_MAP:
+			return validateIncomingObjectOneInputParameter((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DependencyImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DependencyImpl.java
index e936dd7..45ddf9c 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DependencyImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DependencyImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -21,6 +22,8 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
@@ -85,21 +88,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> relatedElements = (EList<Element>) cache.get(
-				eResource, this,
-				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
+			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<Element>(
-						Element.class, this,
-						UMLPackage.DEPENDENCY__RELATED_ELEMENT,
-						RELATED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT, relatedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DEPENDENCY__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.DEPENDENCY__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DEPENDENCY__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -112,19 +107,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> sources = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			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>(
-						Element.class, this, UMLPackage.DEPENDENCY__SOURCE,
-						SOURCE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE, sources = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DEPENDENCY__SOURCE, SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.DEPENDENCY__SOURCE, SOURCE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DEPENDENCY__SOURCE, SOURCE_ESUBSETS);
 	}
 
 	/**
@@ -137,19 +126,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> targets = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			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>(
-						Element.class, this, UMLPackage.DEPENDENCY__TARGET,
-						TARGET_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET, targets = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DEPENDENCY__TARGET, TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.DEPENDENCY__TARGET, TARGET_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DEPENDENCY__TARGET, TARGET_ESUBSETS);
 	}
 
 	/**
@@ -159,9 +142,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<NamedElement> getSuppliers() {
-		return (EList<NamedElement>) eDynamicGet(
-			UMLPackage.DEPENDENCY__SUPPLIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPENDENCY__SUPPLIER, true, true);
+		return (EList<NamedElement>) eDynamicGet(UMLPackage.DEPENDENCY__SUPPLIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPENDENCY__SUPPLIER, true, true);
 	}
 
 	/**
@@ -180,12 +161,10 @@
 	 */
 	public NamedElement getSupplier(String name, boolean ignoreCase,
 			EClass eClass) {
-		supplierLoop : for (NamedElement supplier : getSuppliers()) {
+		supplierLoop: for (NamedElement supplier : getSuppliers()) {
 			if (eClass != null && !eClass.isInstance(supplier))
 				continue supplierLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(supplier.getName())
-				: name.equals(supplier.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(supplier.getName()) : name.equals(supplier.getName())))
 				continue supplierLoop;
 			return supplier;
 		}
@@ -199,9 +178,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<NamedElement> getClients() {
-		return (EList<NamedElement>) eDynamicGet(
-			UMLPackage.DEPENDENCY__CLIENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPENDENCY__CLIENT, true, true);
+		return (EList<NamedElement>) eDynamicGet(UMLPackage.DEPENDENCY__CLIENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPENDENCY__CLIENT, true, true);
 	}
 
 	/**
@@ -220,12 +197,10 @@
 	 */
 	public NamedElement getClient(String name, boolean ignoreCase,
 			EClass eClass) {
-		clientLoop : for (NamedElement client : getClients()) {
+		clientLoop: for (NamedElement client : getClients()) {
 			if (eClass != null && !eClass.isInstance(client))
 				continue clientLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(client.getName())
-				: name.equals(client.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(client.getName()) : name.equals(client.getName())))
 				continue clientLoop;
 			return client;
 		}
@@ -240,50 +215,50 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.DEPENDENCY__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.DEPENDENCY__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.DEPENDENCY__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.DEPENDENCY__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.DEPENDENCY__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.DEPENDENCY__NAME :
-				return getName();
-			case UMLPackage.DEPENDENCY__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.DEPENDENCY__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.DEPENDENCY__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DEPENDENCY__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.DEPENDENCY__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.DEPENDENCY__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.DEPENDENCY__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.DEPENDENCY__SOURCE :
-				return getSources();
-			case UMLPackage.DEPENDENCY__TARGET :
-				return getTargets();
-			case UMLPackage.DEPENDENCY__CLIENT :
-				return getClients();
-			case UMLPackage.DEPENDENCY__SUPPLIER :
-				return getSuppliers();
+		case UMLPackage.DEPENDENCY__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.DEPENDENCY__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.DEPENDENCY__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.DEPENDENCY__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.DEPENDENCY__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.DEPENDENCY__NAME:
+			return getName();
+		case UMLPackage.DEPENDENCY__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.DEPENDENCY__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.DEPENDENCY__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DEPENDENCY__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.DEPENDENCY__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.DEPENDENCY__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.DEPENDENCY__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.DEPENDENCY__SOURCE:
+			return getSources();
+		case UMLPackage.DEPENDENCY__TARGET:
+			return getTargets();
+		case UMLPackage.DEPENDENCY__CLIENT:
+			return getClients();
+		case UMLPackage.DEPENDENCY__SUPPLIER:
+			return getSuppliers();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -297,41 +272,37 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.DEPENDENCY__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.DEPENDENCY__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.DEPENDENCY__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.DEPENDENCY__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.DEPENDENCY__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.DEPENDENCY__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DEPENDENCY__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DEPENDENCY__CLIENT :
-				getClients().clear();
-				getClients()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.DEPENDENCY__SUPPLIER :
-				getSuppliers().clear();
-				getSuppliers()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
+		case UMLPackage.DEPENDENCY__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.DEPENDENCY__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.DEPENDENCY__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.DEPENDENCY__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.DEPENDENCY__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.DEPENDENCY__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DEPENDENCY__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DEPENDENCY__CLIENT:
+			getClients().clear();
+			getClients().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.DEPENDENCY__SUPPLIER:
+			getSuppliers().clear();
+			getSuppliers().addAll((Collection<? extends NamedElement>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -344,33 +315,33 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DEPENDENCY__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.DEPENDENCY__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.DEPENDENCY__NAME :
-				unsetName();
-				return;
-			case UMLPackage.DEPENDENCY__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.DEPENDENCY__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.DEPENDENCY__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DEPENDENCY__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DEPENDENCY__CLIENT :
-				getClients().clear();
-				return;
-			case UMLPackage.DEPENDENCY__SUPPLIER :
-				getSuppliers().clear();
-				return;
+		case UMLPackage.DEPENDENCY__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.DEPENDENCY__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.DEPENDENCY__NAME:
+			unsetName();
+			return;
+		case UMLPackage.DEPENDENCY__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.DEPENDENCY__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.DEPENDENCY__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DEPENDENCY__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DEPENDENCY__CLIENT:
+			getClients().clear();
+			return;
+		case UMLPackage.DEPENDENCY__SUPPLIER:
+			getSuppliers().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -383,42 +354,40 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DEPENDENCY__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.DEPENDENCY__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.DEPENDENCY__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.DEPENDENCY__OWNER :
-				return isSetOwner();
-			case UMLPackage.DEPENDENCY__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.DEPENDENCY__NAME :
-				return isSetName();
-			case UMLPackage.DEPENDENCY__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.DEPENDENCY__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.DEPENDENCY__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.DEPENDENCY__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.DEPENDENCY__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.DEPENDENCY__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.DEPENDENCY__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.DEPENDENCY__SOURCE :
-				return isSetSources();
-			case UMLPackage.DEPENDENCY__TARGET :
-				return isSetTargets();
-			case UMLPackage.DEPENDENCY__CLIENT :
-				return !getClients().isEmpty();
-			case UMLPackage.DEPENDENCY__SUPPLIER :
-				return !getSuppliers().isEmpty();
+		case UMLPackage.DEPENDENCY__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.DEPENDENCY__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.DEPENDENCY__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.DEPENDENCY__OWNER:
+			return isSetOwner();
+		case UMLPackage.DEPENDENCY__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.DEPENDENCY__NAME:
+			return isSetName();
+		case UMLPackage.DEPENDENCY__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.DEPENDENCY__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.DEPENDENCY__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.DEPENDENCY__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.DEPENDENCY__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.DEPENDENCY__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.DEPENDENCY__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.DEPENDENCY__SOURCE:
+			return isSetSources();
+		case UMLPackage.DEPENDENCY__TARGET:
+			return isSetTargets();
+		case UMLPackage.DEPENDENCY__CLIENT:
+			return !getClients().isEmpty();
+		case UMLPackage.DEPENDENCY__SUPPLIER:
+			return !getSuppliers().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -433,20 +402,20 @@
 			Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.DEPENDENCY__RELATED_ELEMENT :
-					return UMLPackage.RELATIONSHIP__RELATED_ELEMENT;
-				default :
-					return -1;
+			case UMLPackage.DEPENDENCY__RELATED_ELEMENT:
+				return UMLPackage.RELATIONSHIP__RELATED_ELEMENT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == DirectedRelationship.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.DEPENDENCY__SOURCE :
-					return UMLPackage.DIRECTED_RELATIONSHIP__SOURCE;
-				case UMLPackage.DEPENDENCY__TARGET :
-					return UMLPackage.DIRECTED_RELATIONSHIP__TARGET;
-				default :
-					return -1;
+			case UMLPackage.DEPENDENCY__SOURCE:
+				return UMLPackage.DIRECTED_RELATIONSHIP__SOURCE;
+			case UMLPackage.DEPENDENCY__TARGET:
+				return UMLPackage.DIRECTED_RELATIONSHIP__TARGET;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -462,20 +431,20 @@
 			Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.RELATIONSHIP__RELATED_ELEMENT :
-					return UMLPackage.DEPENDENCY__RELATED_ELEMENT;
-				default :
-					return -1;
+			case UMLPackage.RELATIONSHIP__RELATED_ELEMENT:
+				return UMLPackage.DEPENDENCY__RELATED_ELEMENT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == DirectedRelationship.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.DIRECTED_RELATIONSHIP__SOURCE :
-					return UMLPackage.DEPENDENCY__SOURCE;
-				case UMLPackage.DIRECTED_RELATIONSHIP__TARGET :
-					return UMLPackage.DEPENDENCY__TARGET;
-				default :
-					return -1;
+			case UMLPackage.DIRECTED_RELATIONSHIP__SOURCE:
+				return UMLPackage.DEPENDENCY__SOURCE;
+			case UMLPackage.DIRECTED_RELATIONSHIP__TARGET:
+				return UMLPackage.DEPENDENCY__TARGET;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -489,8 +458,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] RELATED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.DEPENDENCY__SOURCE, UMLPackage.DEPENDENCY__TARGET};
+	protected static final int[] RELATED_ELEMENT_ESUBSETS = new int[] { UMLPackage.DEPENDENCY__SOURCE, UMLPackage.DEPENDENCY__TARGET };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -498,7 +466,8 @@
 	 * @generated
 	 */
 	public boolean isSetRelatedElements() {
-		return isSetSources() || isSetTargets();
+		return isSetSources()
+				|| isSetTargets();
 	}
 
 	/**
@@ -509,8 +478,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SOURCE_ESUBSETS = new int[]{
-		UMLPackage.DEPENDENCY__CLIENT};
+	protected static final int[] SOURCE_ESUBSETS = new int[] { UMLPackage.DEPENDENCY__CLIENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -529,8 +497,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] TARGET_ESUBSETS = new int[]{
-		UMLPackage.DEPENDENCY__SUPPLIER};
+	protected static final int[] TARGET_ESUBSETS = new int[] { UMLPackage.DEPENDENCY__SUPPLIER };
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeployedArtifactImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeployedArtifactImpl.java
index 828bdf6..6774b2f 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeployedArtifactImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeployedArtifactImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeploymentImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeploymentImpl.java
index 511dbfe..a105395 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeploymentImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeploymentImpl.java
@@ -1,30 +1,43 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Eike Stepper - 540786
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
 
+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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectResolvingEList;
+
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.DeployedArtifact;
 import org.eclipse.uml2.uml.Deployment;
@@ -79,17 +92,9 @@
 		return UMLPackage.Literals.DEPLOYMENT;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.DEPENDENCY__CLIENT) {
 			return createClientsList();
 		}
@@ -116,20 +121,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.DEPLOYMENT__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DEPLOYMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.DEPLOYMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DEPLOYMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -140,15 +138,13 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<NamedElement> getSuppliers() {
-		return (EList<NamedElement>) eDynamicGet(
-			UMLPackage.DEPLOYMENT__SUPPLIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPENDENCY__SUPPLIER, true, true);
+		return (EList<NamedElement>) eDynamicGet(UMLPackage.DEPLOYMENT__SUPPLIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPENDENCY__SUPPLIER, true, true);
 	}
 
 	private EList<NamedElement> createSuppliersList() {
 		return new SubsetSupersetEObjectResolvingEList<NamedElement>(
-			NamedElement.class, this, UMLPackage.DEPLOYMENT__SUPPLIER, null,
-			SUPPLIER_ESUBSETS);
+				NamedElement.class, this, UMLPackage.DEPLOYMENT__SUPPLIER, null,
+				SUPPLIER_ESUBSETS);
 	}
 
 	/**
@@ -159,15 +155,13 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<NamedElement> getClients() {
-		return (EList<NamedElement>) eDynamicGet(
-			UMLPackage.DEPLOYMENT__CLIENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPENDENCY__CLIENT, true, true);
+		return (EList<NamedElement>) eDynamicGet(UMLPackage.DEPLOYMENT__CLIENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPENDENCY__CLIENT, true, true);
 	}
 
 	private EList<NamedElement> createClientsList() {
 		return new SubsetSupersetEObjectResolvingEList<NamedElement>(
-			NamedElement.class, this, UMLPackage.DEPLOYMENT__CLIENT, null,
-			CLIENT_ESUBSETS);
+				NamedElement.class, this, UMLPackage.DEPLOYMENT__CLIENT, null,
+				CLIENT_ESUBSETS);
 	}
 
 	/**
@@ -177,16 +171,14 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<DeployedArtifact> getDeployedArtifacts() {
-		return (EList<DeployedArtifact>) eDynamicGet(
-			UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT__DEPLOYED_ARTIFACT, true, true);
+		return (EList<DeployedArtifact>) eDynamicGet(UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT__DEPLOYED_ARTIFACT, true, true);
 	}
 
 	private EList<DeployedArtifact> createDeployedArtifactsList() {
 		return new SubsetSupersetEObjectResolvingEList<DeployedArtifact>(
-			DeployedArtifact.class, this,
-			UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT,
-			DEPLOYED_ARTIFACT_ESUPERSETS, null);
+				DeployedArtifact.class, this,
+				UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT,
+				DEPLOYED_ARTIFACT_ESUPERSETS, null);
 	}
 
 	/**
@@ -196,9 +188,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<DeploymentSpecification> getConfigurations() {
-		return (EList<DeploymentSpecification>) eDynamicGet(
-			UMLPackage.DEPLOYMENT__CONFIGURATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT__CONFIGURATION, true, true);
+		return (EList<DeploymentSpecification>) eDynamicGet(UMLPackage.DEPLOYMENT__CONFIGURATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT__CONFIGURATION, true, true);
 	}
 
 	/**
@@ -207,8 +197,7 @@
 	 * @generated
 	 */
 	public DeploymentSpecification createConfiguration(String name) {
-		DeploymentSpecification newConfiguration = (DeploymentSpecification) create(
-			UMLPackage.Literals.DEPLOYMENT_SPECIFICATION);
+		DeploymentSpecification newConfiguration = (DeploymentSpecification) create(UMLPackage.Literals.DEPLOYMENT_SPECIFICATION);
 		getConfigurations().add(newConfiguration);
 		if (name != null)
 			newConfiguration.setName(name);
@@ -231,16 +220,12 @@
 	 */
 	public DeploymentSpecification getConfiguration(String name,
 			boolean ignoreCase, boolean createOnDemand) {
-		configurationLoop : for (DeploymentSpecification configuration : getConfigurations()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(configuration.getName())
-				: name.equals(configuration.getName())))
+		configurationLoop: for (DeploymentSpecification configuration : getConfigurations()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(configuration.getName()) : name.equals(configuration.getName())))
 				continue configurationLoop;
 			return configuration;
 		}
-		return createOnDemand
-			? createConfiguration(name)
-			: null;
+		return createOnDemand ? createConfiguration(name) : null;
 	}
 
 	/**
@@ -249,9 +234,7 @@
 	 * @generated
 	 */
 	public DeploymentTarget getLocation() {
-		return (DeploymentTarget) eDynamicGet(
-			UMLPackage.DEPLOYMENT__LOCATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT__LOCATION, true, true);
+		return (DeploymentTarget) eDynamicGet(UMLPackage.DEPLOYMENT__LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT__LOCATION, true, true);
 	}
 
 	/**
@@ -260,9 +243,7 @@
 	 * @generated
 	 */
 	public DeploymentTarget basicGetLocation() {
-		return (DeploymentTarget) eDynamicGet(
-			UMLPackage.DEPLOYMENT__LOCATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT__LOCATION, false, true);
+		return (DeploymentTarget) eDynamicGet(UMLPackage.DEPLOYMENT__LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT__LOCATION, false, true);
 	}
 
 	/**
@@ -272,8 +253,7 @@
 	 */
 	public NotificationChain basicSetLocation(DeploymentTarget newLocation,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newLocation,
-			UMLPackage.DEPLOYMENT__LOCATION, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newLocation, UMLPackage.DEPLOYMENT__LOCATION, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newLocation != null) {
@@ -292,8 +272,7 @@
 	 * @generated
 	 */
 	public void setLocation(DeploymentTarget newLocation) {
-		eDynamicSet(UMLPackage.DEPLOYMENT__LOCATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT__LOCATION, newLocation);
+		eDynamicSet(UMLPackage.DEPLOYMENT__LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT__LOCATION, newLocation);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newLocation != null) {
@@ -315,30 +294,23 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.DEPLOYMENT__CONFIGURATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getConfigurations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT__LOCATION :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetLocation((DeploymentTarget) otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT__CONFIGURATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getConfigurations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT__LOCATION:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetLocation((DeploymentTarget) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -352,23 +324,20 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.DEPLOYMENT__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.DEPLOYMENT__CONFIGURATION :
-				return ((InternalEList<?>) getConfigurations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT__LOCATION :
-				return basicSetLocation(null, msgs);
+		case UMLPackage.DEPLOYMENT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.DEPLOYMENT__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.DEPLOYMENT__CONFIGURATION:
+			return ((InternalEList<?>) getConfigurations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT__LOCATION:
+			return basicSetLocation(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -382,14 +351,10 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
-			case UMLPackage.DEPLOYMENT__LOCATION :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT,
-					DeploymentTarget.class, msgs);
+		case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+		case UMLPackage.DEPLOYMENT__LOCATION:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT, DeploymentTarget.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -402,58 +367,58 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.DEPLOYMENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.DEPLOYMENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.DEPLOYMENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.DEPLOYMENT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.DEPLOYMENT__NAME :
-				return getName();
-			case UMLPackage.DEPLOYMENT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.DEPLOYMENT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.DEPLOYMENT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DEPLOYMENT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.DEPLOYMENT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.DEPLOYMENT__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.DEPLOYMENT__SOURCE :
-				return getSources();
-			case UMLPackage.DEPLOYMENT__TARGET :
-				return getTargets();
-			case UMLPackage.DEPLOYMENT__CLIENT :
-				return getClients();
-			case UMLPackage.DEPLOYMENT__SUPPLIER :
-				return getSuppliers();
-			case UMLPackage.DEPLOYMENT__CONFIGURATION :
-				return getConfigurations();
-			case UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT :
-				return getDeployedArtifacts();
-			case UMLPackage.DEPLOYMENT__LOCATION :
-				if (resolve)
-					return getLocation();
-				return basicGetLocation();
+		case UMLPackage.DEPLOYMENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.DEPLOYMENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.DEPLOYMENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.DEPLOYMENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.DEPLOYMENT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.DEPLOYMENT__NAME:
+			return getName();
+		case UMLPackage.DEPLOYMENT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.DEPLOYMENT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.DEPLOYMENT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DEPLOYMENT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.DEPLOYMENT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.DEPLOYMENT__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.DEPLOYMENT__SOURCE:
+			return getSources();
+		case UMLPackage.DEPLOYMENT__TARGET:
+			return getTargets();
+		case UMLPackage.DEPLOYMENT__CLIENT:
+			return getClients();
+		case UMLPackage.DEPLOYMENT__SUPPLIER:
+			return getSuppliers();
+		case UMLPackage.DEPLOYMENT__CONFIGURATION:
+			return getConfigurations();
+		case UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT:
+			return getDeployedArtifacts();
+		case UMLPackage.DEPLOYMENT__LOCATION:
+			if (resolve)
+				return getLocation();
+			return basicGetLocation();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -467,54 +432,48 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT__CLIENT :
-				getClients().clear();
-				getClients()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT__SUPPLIER :
-				getSuppliers().clear();
-				getSuppliers()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT__CONFIGURATION :
-				getConfigurations().clear();
-				getConfigurations().addAll(
-					(Collection<? extends DeploymentSpecification>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT :
-				getDeployedArtifacts().clear();
-				getDeployedArtifacts()
-					.addAll((Collection<? extends DeployedArtifact>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT__LOCATION :
-				setLocation((DeploymentTarget) newValue);
-				return;
+		case UMLPackage.DEPLOYMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT__CLIENT:
+			getClients().clear();
+			getClients().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT__SUPPLIER:
+			getSuppliers().clear();
+			getSuppliers().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT__CONFIGURATION:
+			getConfigurations().clear();
+			getConfigurations().addAll((Collection<? extends DeploymentSpecification>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT:
+			getDeployedArtifacts().clear();
+			getDeployedArtifacts().addAll((Collection<? extends DeployedArtifact>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT__LOCATION:
+			setLocation((DeploymentTarget) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -527,42 +486,42 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.DEPLOYMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.DEPLOYMENT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.DEPLOYMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.DEPLOYMENT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DEPLOYMENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DEPLOYMENT__CLIENT :
-				getClients().clear();
-				return;
-			case UMLPackage.DEPLOYMENT__SUPPLIER :
-				getSuppliers().clear();
-				return;
-			case UMLPackage.DEPLOYMENT__CONFIGURATION :
-				getConfigurations().clear();
-				return;
-			case UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT :
-				getDeployedArtifacts().clear();
-				return;
-			case UMLPackage.DEPLOYMENT__LOCATION :
-				setLocation((DeploymentTarget) null);
-				return;
+		case UMLPackage.DEPLOYMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.DEPLOYMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.DEPLOYMENT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.DEPLOYMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.DEPLOYMENT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DEPLOYMENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DEPLOYMENT__CLIENT:
+			getClients().clear();
+			return;
+		case UMLPackage.DEPLOYMENT__SUPPLIER:
+			getSuppliers().clear();
+			return;
+		case UMLPackage.DEPLOYMENT__CONFIGURATION:
+			getConfigurations().clear();
+			return;
+		case UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT:
+			getDeployedArtifacts().clear();
+			return;
+		case UMLPackage.DEPLOYMENT__LOCATION:
+			setLocation((DeploymentTarget) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -575,48 +534,46 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.DEPLOYMENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.DEPLOYMENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.DEPLOYMENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.DEPLOYMENT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.DEPLOYMENT__NAME :
-				return isSetName();
-			case UMLPackage.DEPLOYMENT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.DEPLOYMENT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.DEPLOYMENT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.DEPLOYMENT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.DEPLOYMENT__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.DEPLOYMENT__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.DEPLOYMENT__SOURCE :
-				return isSetSources();
-			case UMLPackage.DEPLOYMENT__TARGET :
-				return isSetTargets();
-			case UMLPackage.DEPLOYMENT__CLIENT :
-				return !getClients().isEmpty();
-			case UMLPackage.DEPLOYMENT__SUPPLIER :
-				return !getSuppliers().isEmpty();
-			case UMLPackage.DEPLOYMENT__CONFIGURATION :
-				return !getConfigurations().isEmpty();
-			case UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT :
-				return !getDeployedArtifacts().isEmpty();
-			case UMLPackage.DEPLOYMENT__LOCATION :
-				return basicGetLocation() != null;
+		case UMLPackage.DEPLOYMENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.DEPLOYMENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.DEPLOYMENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.DEPLOYMENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.DEPLOYMENT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.DEPLOYMENT__NAME:
+			return isSetName();
+		case UMLPackage.DEPLOYMENT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.DEPLOYMENT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.DEPLOYMENT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.DEPLOYMENT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.DEPLOYMENT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.DEPLOYMENT__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.DEPLOYMENT__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.DEPLOYMENT__SOURCE:
+			return isSetSources();
+		case UMLPackage.DEPLOYMENT__TARGET:
+			return isSetTargets();
+		case UMLPackage.DEPLOYMENT__CLIENT:
+			return !getClients().isEmpty();
+		case UMLPackage.DEPLOYMENT__SUPPLIER:
+			return !getSuppliers().isEmpty();
+		case UMLPackage.DEPLOYMENT__CONFIGURATION:
+			return !getConfigurations().isEmpty();
+		case UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT:
+			return !getDeployedArtifacts().isEmpty();
+		case UMLPackage.DEPLOYMENT__LOCATION:
+			return basicGetLocation() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -629,10 +586,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.DEPLOYMENT__OWNED_COMMENT,
-		UMLPackage.DEPLOYMENT__NAME_EXPRESSION,
-		UMLPackage.DEPLOYMENT__CONFIGURATION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.DEPLOYMENT__OWNED_COMMENT, UMLPackage.DEPLOYMENT__NAME_EXPRESSION, UMLPackage.DEPLOYMENT__CONFIGURATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -642,9 +596,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -669,8 +621,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SUPPLIER_ESUBSETS = new int[]{
-		UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT};
+	protected static final int[] SUPPLIER_ESUBSETS = new int[] { UMLPackage.DEPLOYMENT__DEPLOYED_ARTIFACT };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getClients() <em>Client</em>}' reference list.
@@ -680,8 +631,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] CLIENT_ESUBSETS = new int[]{
-		UMLPackage.DEPLOYMENT__LOCATION};
+	protected static final int[] CLIENT_ESUBSETS = new int[] { UMLPackage.DEPLOYMENT__LOCATION };
 
 	/**
 	 * The array of superset feature identifiers for the '{@link #getDeployedArtifacts() <em>Deployed Artifact</em>}' reference list.
@@ -691,8 +641,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] DEPLOYED_ARTIFACT_ESUPERSETS = new int[]{
-		UMLPackage.DEPLOYMENT__SUPPLIER};
+	protected static final int[] DEPLOYED_ARTIFACT_ESUPERSETS = new int[] { UMLPackage.DEPLOYMENT__SUPPLIER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -710,12 +659,10 @@
 	 */
 	public DeployedArtifact getDeployedArtifact(String name, boolean ignoreCase,
 			EClass eClass) {
-		deployedArtifactLoop : for (DeployedArtifact deployedArtifact : getDeployedArtifacts()) {
+		deployedArtifactLoop: for (DeployedArtifact deployedArtifact : getDeployedArtifacts()) {
 			if (eClass != null && !eClass.isInstance(deployedArtifact))
 				continue deployedArtifactLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(deployedArtifact.getName())
-				: name.equals(deployedArtifact.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(deployedArtifact.getName()) : name.equals(deployedArtifact.getName())))
 				continue deployedArtifactLoop;
 			return deployedArtifact;
 		}
@@ -730,7 +677,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.DEPLOYMENT__CONFIGURATION);
+				|| eIsSet(UMLPackage.DEPLOYMENT__CONFIGURATION);
 	}
 
 	/**
@@ -740,7 +687,8 @@
 	 */
 	@Override
 	public boolean isSetOwner() {
-		return super.isSetOwner() || eIsSet(UMLPackage.DEPLOYMENT__LOCATION);
+		return super.isSetOwner()
+				|| eIsSet(UMLPackage.DEPLOYMENT__LOCATION);
 	}
 
 } //DeploymentImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeploymentSpecificationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeploymentSpecificationImpl.java
index 66c1df7..1606a2a 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeploymentSpecificationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeploymentSpecificationImpl.java
@@ -1,14 +1,14 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,9 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.AggregationKind;
@@ -130,9 +134,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -155,11 +157,7 @@
 	 * @generated
 	 */
 	public String getDeploymentLocation() {
-		return (String) eDynamicGet(
-			UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION,
-			true, true);
+		return (String) eDynamicGet(UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION, true, true);
 	}
 
 	/**
@@ -168,11 +166,7 @@
 	 * @generated
 	 */
 	public void setDeploymentLocation(String newDeploymentLocation) {
-		eDynamicSet(
-			UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION,
-			newDeploymentLocation);
+		eDynamicSet(UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION, newDeploymentLocation);
 	}
 
 	/**
@@ -181,10 +175,7 @@
 	 * @generated
 	 */
 	public void unsetDeploymentLocation() {
-		eDynamicUnset(
-			UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION);
+		eDynamicUnset(UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION);
 	}
 
 	/**
@@ -193,10 +184,7 @@
 	 * @generated
 	 */
 	public boolean isSetDeploymentLocation() {
-		return eDynamicIsSet(
-			UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION);
+		return eDynamicIsSet(UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION);
 	}
 
 	/**
@@ -205,11 +193,7 @@
 	 * @generated
 	 */
 	public String getExecutionLocation() {
-		return (String) eDynamicGet(
-			UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION,
-			true, true);
+		return (String) eDynamicGet(UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION, true, true);
 	}
 
 	/**
@@ -218,11 +202,7 @@
 	 * @generated
 	 */
 	public void setExecutionLocation(String newExecutionLocation) {
-		eDynamicSet(
-			UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION,
-			newExecutionLocation);
+		eDynamicSet(UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION, newExecutionLocation);
 	}
 
 	/**
@@ -231,10 +211,7 @@
 	 * @generated
 	 */
 	public void unsetExecutionLocation() {
-		eDynamicUnset(
-			UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION);
+		eDynamicUnset(UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION);
 	}
 
 	/**
@@ -243,10 +220,7 @@
 	 * @generated
 	 */
 	public boolean isSetExecutionLocation() {
-		return eDynamicIsSet(
-			UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION);
+		return eDynamicIsSet(UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION);
 	}
 
 	/**
@@ -255,11 +229,7 @@
 	 * @generated
 	 */
 	public Deployment getDeployment() {
-		return (Deployment) eDynamicGet(
-			UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__DEPLOYMENT, true,
-			true);
+		return (Deployment) eDynamicGet(UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__DEPLOYMENT, true, true);
 	}
 
 	/**
@@ -268,11 +238,7 @@
 	 * @generated
 	 */
 	public Deployment basicGetDeployment() {
-		return (Deployment) eDynamicGet(
-			UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__DEPLOYMENT, false,
-			true);
+		return (Deployment) eDynamicGet(UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__DEPLOYMENT, false, true);
 	}
 
 	/**
@@ -282,8 +248,7 @@
 	 */
 	public NotificationChain basicSetDeployment(Deployment newDeployment,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newDeployment,
-			UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newDeployment, UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT, msgs);
 		return msgs;
 	}
 
@@ -293,11 +258,7 @@
 	 * @generated
 	 */
 	public void setDeployment(Deployment newDeployment) {
-		eDynamicSet(
-			UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__DEPLOYMENT,
-			newDeployment);
+		eDynamicSet(UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT_SPECIFICATION__DEPLOYMENT, newDeployment);
 	}
 
 	/**
@@ -307,8 +268,7 @@
 	 */
 	public boolean validateDeployedElements(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return DeploymentSpecificationOperations.validateDeployedElements(this,
-			diagnostics, context);
+		return DeploymentSpecificationOperations.validateDeployedElements(this, diagnostics, context);
 	}
 
 	/**
@@ -318,8 +278,7 @@
 	 */
 	public boolean validateDeploymentTarget(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return DeploymentSpecificationOperations.validateDeploymentTarget(this,
-			diagnostics, context);
+		return DeploymentSpecificationOperations.validateDeploymentTarget(this, diagnostics, context);
 	}
 
 	/**
@@ -332,60 +291,42 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetDeployment((Deployment) otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetDeployment((Deployment) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -399,64 +340,48 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__MANIFESTATION :
-				return ((InternalEList<?>) getManifestations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NESTED_ARTIFACT :
-				return ((InternalEList<?>) getNestedArtifacts())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_OPERATION :
-				return ((InternalEList<?>) getOwnedOperations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT :
-				return basicSetDeployment(null, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__MANIFESTATION:
+			return ((InternalEList<?>) getManifestations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NESTED_ARTIFACT:
+			return ((InternalEList<?>) getNestedArtifacts()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_OPERATION:
+			return ((InternalEList<?>) getOwnedOperations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT:
+			return basicSetDeployment(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -470,14 +395,10 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.DEPLOYMENT__CONFIGURATION, Deployment.class,
-					msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.DEPLOYMENT__CONFIGURATION, Deployment.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -490,116 +411,116 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME :
-				return getName();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__MEMBER :
-				return getMembers();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__FEATURE :
-				return getFeatures();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERAL :
-				return getGenerals();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__USE_CASE :
-				return getUseCases();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__FILE_NAME :
-				return getFileName();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__MANIFESTATION :
-				return getManifestations();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NESTED_ARTIFACT :
-				return getNestedArtifacts();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_OPERATION :
-				return getOwnedOperations();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION :
-				return getDeploymentLocation();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION :
-				return getExecutionLocation();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT :
-				if (resolve)
-					return getDeployment();
-				return basicGetDeployment();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME:
+			return getName();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__MEMBER:
+			return getMembers();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__FEATURE:
+			return getFeatures();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERAL:
+			return getGenerals();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__USE_CASE:
+			return getUseCases();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__FILE_NAME:
+			return getFileName();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__MANIFESTATION:
+			return getManifestations();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NESTED_ARTIFACT:
+			return getNestedArtifacts();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_OPERATION:
+			return getOwnedOperations();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION:
+			return getDeploymentLocation();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION:
+			return getExecutionLocation();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT:
+			if (resolve)
+				return getDeployment();
+			return basicGetDeployment();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -613,140 +534,123 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__FILE_NAME :
-				setFileName((String) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__MANIFESTATION :
-				getManifestations().clear();
-				getManifestations()
-					.addAll((Collection<? extends Manifestation>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NESTED_ARTIFACT :
-				getNestedArtifacts().clear();
-				getNestedArtifacts()
-					.addAll((Collection<? extends Artifact>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION :
-				setDeploymentLocation((String) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION :
-				setExecutionLocation((String) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT :
-				setDeployment((Deployment) newValue);
-				return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__FILE_NAME:
+			setFileName((String) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__MANIFESTATION:
+			getManifestations().clear();
+			getManifestations().addAll((Collection<? extends Manifestation>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NESTED_ARTIFACT:
+			getNestedArtifacts().clear();
+			getNestedArtifacts().addAll((Collection<? extends Artifact>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION:
+			setDeploymentLocation((String) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION:
+			setExecutionLocation((String) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT:
+			setDeployment((Deployment) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -759,105 +663,105 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__FILE_NAME :
-				unsetFileName();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__MANIFESTATION :
-				getManifestations().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NESTED_ARTIFACT :
-				getNestedArtifacts().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION :
-				unsetDeploymentLocation();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION :
-				unsetExecutionLocation();
-				return;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT :
-				setDeployment((Deployment) null);
-				return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__FILE_NAME:
+			unsetFileName();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__MANIFESTATION:
+			getManifestations().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NESTED_ARTIFACT:
+			getNestedArtifacts().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION:
+			unsetDeploymentLocation();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION:
+			unsetExecutionLocation();
+			return;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT:
+			setDeployment((Deployment) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -870,100 +774,98 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME :
-				return isSetName();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__MEMBER :
-				return isSetMembers();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERAL :
-				return !getGenerals().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__FILE_NAME :
-				return isSetFileName();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__MANIFESTATION :
-				return !getManifestations().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__NESTED_ARTIFACT :
-				return !getNestedArtifacts().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ATTRIBUTE :
-				return !getOwnedAttributes().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION :
-				return isSetDeploymentLocation();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION :
-				return isSetExecutionLocation();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT :
-				return basicGetDeployment() != null;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME:
+			return isSetName();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__MEMBER:
+			return isSetMembers();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERAL:
+			return !getGenerals().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__FILE_NAME:
+			return isSetFileName();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__MANIFESTATION:
+			return !getManifestations().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__NESTED_ARTIFACT:
+			return !getNestedArtifacts().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_ATTRIBUTE:
+			return !getOwnedAttributes().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT_LOCATION:
+			return isSetDeploymentLocation();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__EXECUTION_LOCATION:
+			return isSetExecutionLocation();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT:
+			return basicGetDeployment() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -978,288 +880,225 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___SEPARATOR :
-				return separator();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___PARENTS :
-				return parents();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_DEPLOYMENT_TARGET__DIAGNOSTICCHAIN_MAP :
-				return validateDeploymentTarget(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_DEPLOYED_ELEMENTS__DIAGNOSTICCHAIN_MAP :
-				return validateDeployedElements(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___SEPARATOR:
+			return separator();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___PARENTS:
+			return parents();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_DEPLOYMENT_TARGET__DIAGNOSTICCHAIN_MAP:
+			return validateDeploymentTarget((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DEPLOYMENT_SPECIFICATION___VALIDATE_DEPLOYED_ELEMENTS__DIAGNOSTICCHAIN_MAP:
+			return validateDeployedElements((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1272,7 +1111,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT);
+				|| eIsSet(UMLPackage.DEPLOYMENT_SPECIFICATION__DEPLOYMENT);
 	}
 
 } //DeploymentSpecificationImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeploymentTargetImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeploymentTargetImpl.java
index 5d961c8..29623c0 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeploymentTargetImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeploymentTargetImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 323181
+ *   Kenn Hussey - 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
  *
  */
@@ -24,6 +24,7 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -89,21 +90,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.DEPLOYMENT_TARGET__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DEPLOYMENT_TARGET__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.DEPLOYMENT_TARGET__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DEPLOYMENT_TARGET__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -113,9 +106,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Deployment> getDeployments() {
-		return (EList<Deployment>) eDynamicGet(
-			UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYMENT, true, true);
+		return (EList<Deployment>) eDynamicGet(UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYMENT, true, true);
 	}
 
 	/**
@@ -127,14 +118,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<PackageableElement> result = (EList<PackageableElement>) cache
-				.get(this,
-					UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT);
+			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,
-					result = DeploymentTargetOperations
-						.getDeployedElements(this));
+				cache.put(this, UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT, result = DeploymentTargetOperations.getDeployedElements(this));
 			}
 			return result;
 		}
@@ -157,12 +143,10 @@
 	 */
 	public PackageableElement getDeployedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		deployedElementLoop : for (PackageableElement deployedElement : getDeployedElements()) {
+		deployedElementLoop: for (PackageableElement deployedElement : getDeployedElements()) {
 			if (eClass != null && !eClass.isInstance(deployedElement))
 				continue deployedElementLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(deployedElement.getName())
-				: name.equals(deployedElement.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(deployedElement.getName()) : name.equals(deployedElement.getName())))
 				continue deployedElementLoop;
 			return deployedElement;
 		}
@@ -179,12 +163,10 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getDeployments())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getDeployments()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -198,17 +180,14 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_TARGET__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DEPLOYMENT_TARGET__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT :
-				return ((InternalEList<?>) getDeployments())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DEPLOYMENT_TARGET__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).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 eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -221,36 +200,36 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.DEPLOYMENT_TARGET__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.DEPLOYMENT_TARGET__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.DEPLOYMENT_TARGET__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.DEPLOYMENT_TARGET__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.DEPLOYMENT_TARGET__NAME :
-				return getName();
-			case UMLPackage.DEPLOYMENT_TARGET__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.DEPLOYMENT_TARGET__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.DEPLOYMENT_TARGET__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DEPLOYMENT_TARGET__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT :
-				return getDeployedElements();
-			case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT :
-				return getDeployments();
+		case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.DEPLOYMENT_TARGET__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.DEPLOYMENT_TARGET__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.DEPLOYMENT_TARGET__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.DEPLOYMENT_TARGET__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.DEPLOYMENT_TARGET__NAME:
+			return getName();
+		case UMLPackage.DEPLOYMENT_TARGET__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.DEPLOYMENT_TARGET__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.DEPLOYMENT_TARGET__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DEPLOYMENT_TARGET__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT:
+			return getDeployedElements();
+		case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT:
+			return getDeployments();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -264,30 +243,27 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_TARGET__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_TARGET__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_TARGET__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_TARGET__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT :
-				getDeployments().clear();
-				getDeployments()
-					.addAll((Collection<? extends Deployment>) newValue);
-				return;
+		case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_TARGET__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_TARGET__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_TARGET__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_TARGET__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT:
+			getDeployments().clear();
+			getDeployments().addAll((Collection<? extends Deployment>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -300,24 +276,24 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_TARGET__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.DEPLOYMENT_TARGET__NAME :
-				unsetName();
-				return;
-			case UMLPackage.DEPLOYMENT_TARGET__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.DEPLOYMENT_TARGET__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT :
-				getDeployments().clear();
-				return;
+		case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_TARGET__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.DEPLOYMENT_TARGET__NAME:
+			unsetName();
+			return;
+		case UMLPackage.DEPLOYMENT_TARGET__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.DEPLOYMENT_TARGET__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT:
+			getDeployments().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -330,32 +306,30 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.DEPLOYMENT_TARGET__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.DEPLOYMENT_TARGET__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.DEPLOYMENT_TARGET__OWNER :
-				return isSetOwner();
-			case UMLPackage.DEPLOYMENT_TARGET__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.DEPLOYMENT_TARGET__NAME :
-				return isSetName();
-			case UMLPackage.DEPLOYMENT_TARGET__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.DEPLOYMENT_TARGET__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.DEPLOYMENT_TARGET__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.DEPLOYMENT_TARGET__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT :
-				return !getDeployedElements().isEmpty();
-			case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT :
-				return !getDeployments().isEmpty();
+		case UMLPackage.DEPLOYMENT_TARGET__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.DEPLOYMENT_TARGET__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.DEPLOYMENT_TARGET__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.DEPLOYMENT_TARGET__OWNER:
+			return isSetOwner();
+		case UMLPackage.DEPLOYMENT_TARGET__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.DEPLOYMENT_TARGET__NAME:
+			return isSetName();
+		case UMLPackage.DEPLOYMENT_TARGET__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.DEPLOYMENT_TARGET__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.DEPLOYMENT_TARGET__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.DEPLOYMENT_TARGET__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT:
+			return !getDeployedElements().isEmpty();
+		case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT:
+			return !getDeployments().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -368,10 +342,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.DEPLOYMENT_TARGET__OWNED_COMMENT,
-		UMLPackage.DEPLOYMENT_TARGET__NAME_EXPRESSION,
-		UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.DEPLOYMENT_TARGET__OWNED_COMMENT, UMLPackage.DEPLOYMENT_TARGET__NAME_EXPRESSION, UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -379,8 +350,7 @@
 	 * @generated
 	 */
 	public Deployment createDeployment(String name) {
-		Deployment newDeployment = (Deployment) create(
-			UMLPackage.Literals.DEPLOYMENT);
+		Deployment newDeployment = (Deployment) create(UMLPackage.Literals.DEPLOYMENT);
 		getDeployments().add(newDeployment);
 		if (name != null)
 			newDeployment.setName(name);
@@ -403,16 +373,12 @@
 	 */
 	public Deployment getDeployment(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		deploymentLoop : for (Deployment deployment : getDeployments()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(deployment.getName())
-				: name.equals(deployment.getName())))
+		deploymentLoop: for (Deployment deployment : getDeployments()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(deployment.getName()) : name.equals(deployment.getName())))
 				continue deploymentLoop;
 			return deployment;
 		}
-		return createOnDemand
-			? createDeployment(name)
-			: null;
+		return createOnDemand ? createDeployment(name) : null;
 	}
 
 	/**
@@ -423,7 +389,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT);
+				|| eIsSet(UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT);
 	}
 
 } //DeploymentTargetImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DestroyLinkActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DestroyLinkActionImpl.java
index 39d9298..76e63c1 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DestroyLinkActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DestroyLinkActionImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 212765, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -19,6 +20,8 @@
 import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.uml2.uml.Activity;
 import org.eclipse.uml2.uml.ActivityEdge;
@@ -81,9 +84,7 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<LinkEndData> getEndData() {
-		return (EList<LinkEndData>) eDynamicGet(
-			UMLPackage.DESTROY_LINK_ACTION__END_DATA - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_ACTION__END_DATA, true, true);
+		return (EList<LinkEndData>) eDynamicGet(UMLPackage.DESTROY_LINK_ACTION__END_DATA - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_ACTION__END_DATA, true, true);
 	}
 
 	/**
@@ -93,8 +94,7 @@
 	 */
 	@Override
 	public LinkEndData createEndData() {
-		LinkEndDestructionData newEndData = (LinkEndDestructionData) create(
-			UMLPackage.Literals.LINK_END_DESTRUCTION_DATA);
+		LinkEndDestructionData newEndData = (LinkEndDestructionData) create(UMLPackage.Literals.LINK_END_DESTRUCTION_DATA);
 		getEndData().add(newEndData);
 		return newEndData;
 	}
@@ -117,43 +117,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.DESTROY_LINK_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DESTROY_LINK_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DESTROY_LINK_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.DESTROY_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DESTROY_LINK_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.DESTROY_LINK_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.DESTROY_LINK_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.DESTROY_LINK_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DESTROY_LINK_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.DESTROY_LINK_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DESTROY_LINK_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DESTROY_LINK_ACTION__END_DATA :
-				return ((InternalEList<?>) getEndData()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.DESTROY_LINK_ACTION__INPUT_VALUE :
-				return ((InternalEList<?>) getInputValues())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_LINK_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_LINK_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_LINK_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.DESTROY_LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_LINK_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.DESTROY_LINK_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_LINK_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_LINK_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_LINK_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_LINK_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_LINK_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_LINK_ACTION__END_DATA:
+			return ((InternalEList<?>) getEndData()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_LINK_ACTION__INPUT_VALUE:
+			return ((InternalEList<?>) getInputValues()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -166,78 +155,78 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.DESTROY_LINK_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.DESTROY_LINK_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.DESTROY_LINK_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.DESTROY_LINK_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.DESTROY_LINK_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.DESTROY_LINK_ACTION__NAME :
-				return getName();
-			case UMLPackage.DESTROY_LINK_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.DESTROY_LINK_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.DESTROY_LINK_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DESTROY_LINK_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.DESTROY_LINK_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.DESTROY_LINK_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.DESTROY_LINK_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.DESTROY_LINK_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.DESTROY_LINK_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.DESTROY_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.DESTROY_LINK_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.DESTROY_LINK_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.DESTROY_LINK_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.DESTROY_LINK_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.DESTROY_LINK_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.DESTROY_LINK_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.DESTROY_LINK_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.DESTROY_LINK_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.DESTROY_LINK_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.DESTROY_LINK_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.DESTROY_LINK_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.DESTROY_LINK_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.DESTROY_LINK_ACTION__END_DATA :
-				return getEndData();
-			case UMLPackage.DESTROY_LINK_ACTION__INPUT_VALUE :
-				return getInputValues();
+		case UMLPackage.DESTROY_LINK_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.DESTROY_LINK_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.DESTROY_LINK_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.DESTROY_LINK_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.DESTROY_LINK_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.DESTROY_LINK_ACTION__NAME:
+			return getName();
+		case UMLPackage.DESTROY_LINK_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.DESTROY_LINK_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.DESTROY_LINK_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DESTROY_LINK_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.DESTROY_LINK_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.DESTROY_LINK_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.DESTROY_LINK_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.DESTROY_LINK_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.DESTROY_LINK_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.DESTROY_LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.DESTROY_LINK_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.DESTROY_LINK_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.DESTROY_LINK_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.DESTROY_LINK_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.DESTROY_LINK_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.DESTROY_LINK_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.DESTROY_LINK_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.DESTROY_LINK_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.DESTROY_LINK_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.DESTROY_LINK_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.DESTROY_LINK_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.DESTROY_LINK_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.DESTROY_LINK_ACTION__END_DATA:
+			return getEndData();
+		case UMLPackage.DESTROY_LINK_ACTION__INPUT_VALUE:
+			return getInputValues();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -251,87 +240,75 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.DESTROY_LINK_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__END_DATA :
-				getEndData().clear();
-				getEndData()
-					.addAll((Collection<? extends LinkEndData>) newValue);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__INPUT_VALUE :
-				getInputValues().clear();
-				getInputValues()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
+		case UMLPackage.DESTROY_LINK_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__END_DATA:
+			getEndData().clear();
+			getEndData().addAll((Collection<? extends LinkEndData>) newValue);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__INPUT_VALUE:
+			getInputValues().clear();
+			getInputValues().addAll((Collection<? extends InputPin>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -344,63 +321,63 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DESTROY_LINK_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__END_DATA :
-				getEndData().clear();
-				return;
-			case UMLPackage.DESTROY_LINK_ACTION__INPUT_VALUE :
-				getInputValues().clear();
-				return;
+		case UMLPackage.DESTROY_LINK_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__END_DATA:
+			getEndData().clear();
+			return;
+		case UMLPackage.DESTROY_LINK_ACTION__INPUT_VALUE:
+			getInputValues().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -413,68 +390,66 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DESTROY_LINK_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.DESTROY_LINK_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.DESTROY_LINK_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.DESTROY_LINK_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.DESTROY_LINK_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.DESTROY_LINK_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.DESTROY_LINK_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.DESTROY_LINK_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.DESTROY_LINK_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.DESTROY_LINK_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.DESTROY_LINK_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.DESTROY_LINK_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.DESTROY_LINK_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.DESTROY_LINK_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.DESTROY_LINK_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.DESTROY_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.DESTROY_LINK_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.DESTROY_LINK_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.DESTROY_LINK_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.DESTROY_LINK_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.DESTROY_LINK_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.DESTROY_LINK_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.DESTROY_LINK_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.DESTROY_LINK_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.DESTROY_LINK_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.DESTROY_LINK_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.DESTROY_LINK_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.DESTROY_LINK_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.DESTROY_LINK_ACTION__END_DATA :
-				return isSetEndData();
-			case UMLPackage.DESTROY_LINK_ACTION__INPUT_VALUE :
-				return !getInputValues().isEmpty();
+		case UMLPackage.DESTROY_LINK_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.DESTROY_LINK_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.DESTROY_LINK_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.DESTROY_LINK_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.DESTROY_LINK_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.DESTROY_LINK_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.DESTROY_LINK_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.DESTROY_LINK_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.DESTROY_LINK_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.DESTROY_LINK_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.DESTROY_LINK_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.DESTROY_LINK_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.DESTROY_LINK_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.DESTROY_LINK_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.DESTROY_LINK_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.DESTROY_LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.DESTROY_LINK_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.DESTROY_LINK_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.DESTROY_LINK_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.DESTROY_LINK_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.DESTROY_LINK_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.DESTROY_LINK_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.DESTROY_LINK_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.DESTROY_LINK_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.DESTROY_LINK_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.DESTROY_LINK_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.DESTROY_LINK_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.DESTROY_LINK_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.DESTROY_LINK_ACTION__END_DATA:
+			return isSetEndData();
+		case UMLPackage.DESTROY_LINK_ACTION__INPUT_VALUE:
+			return !getInputValues().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DestroyObjectActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DestroyObjectActionImpl.java
index 2620d7d..1d127f8 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DestroyObjectActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DestroyObjectActionImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,6 +29,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -127,19 +130,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.DESTROY_OBJECT_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.DESTROY_OBJECT_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.DESTROY_OBJECT_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.DESTROY_OBJECT_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -148,11 +145,7 @@
 	 * @generated
 	 */
 	public boolean isDestroyLinks() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS, true,
-			true);
+		return (Boolean) eDynamicGet(UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS, true, true);
 	}
 
 	/**
@@ -161,11 +154,7 @@
 	 * @generated
 	 */
 	public void setIsDestroyLinks(boolean newIsDestroyLinks) {
-		eDynamicSet(
-			UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS,
-			newIsDestroyLinks);
+		eDynamicSet(UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS, newIsDestroyLinks);
 	}
 
 	/**
@@ -174,11 +163,7 @@
 	 * @generated
 	 */
 	public boolean isDestroyOwnedObjects() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS,
-			true, true);
+		return (Boolean) eDynamicGet(UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS, true, true);
 	}
 
 	/**
@@ -187,11 +172,7 @@
 	 * @generated
 	 */
 	public void setIsDestroyOwnedObjects(boolean newIsDestroyOwnedObjects) {
-		eDynamicSet(
-			UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS,
-			newIsDestroyOwnedObjects);
+		eDynamicSet(UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS, newIsDestroyOwnedObjects);
 	}
 
 	/**
@@ -200,9 +181,7 @@
 	 * @generated
 	 */
 	public InputPin getTarget() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.DESTROY_OBJECT_ACTION__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DESTROY_OBJECT_ACTION__TARGET, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.DESTROY_OBJECT_ACTION__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DESTROY_OBJECT_ACTION__TARGET, true, true);
 	}
 
 	/**
@@ -211,9 +190,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetTarget() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.DESTROY_OBJECT_ACTION__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DESTROY_OBJECT_ACTION__TARGET, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.DESTROY_OBJECT_ACTION__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DESTROY_OBJECT_ACTION__TARGET, false, true);
 	}
 
 	/**
@@ -223,8 +200,7 @@
 	 */
 	public NotificationChain basicSetTarget(InputPin newTarget,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newTarget,
-			UMLPackage.DESTROY_OBJECT_ACTION__TARGET, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newTarget, UMLPackage.DESTROY_OBJECT_ACTION__TARGET, msgs);
 		return msgs;
 	}
 
@@ -234,9 +210,7 @@
 	 * @generated
 	 */
 	public void setTarget(InputPin newTarget) {
-		eDynamicSet(
-			UMLPackage.DESTROY_OBJECT_ACTION__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DESTROY_OBJECT_ACTION__TARGET, newTarget);
+		eDynamicSet(UMLPackage.DESTROY_OBJECT_ACTION__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DESTROY_OBJECT_ACTION__TARGET, newTarget);
 	}
 
 	/**
@@ -270,8 +244,7 @@
 	 */
 	public boolean validateMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return DestroyObjectActionOperations.validateMultiplicity(this,
-			diagnostics, context);
+		return DestroyObjectActionOperations.validateMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -281,8 +254,7 @@
 	 */
 	public boolean validateNoType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return DestroyObjectActionOperations.validateNoType(this, diagnostics,
-			context);
+		return DestroyObjectActionOperations.validateNoType(this, diagnostics, context);
 	}
 
 	/**
@@ -294,39 +266,30 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.DESTROY_OBJECT_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DESTROY_OBJECT_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.DESTROY_OBJECT_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.DESTROY_OBJECT_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DESTROY_OBJECT_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DESTROY_OBJECT_ACTION__TARGET :
-				return basicSetTarget(null, msgs);
+		case UMLPackage.DESTROY_OBJECT_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_OBJECT_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.DESTROY_OBJECT_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_OBJECT_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_OBJECT_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DESTROY_OBJECT_ACTION__TARGET:
+			return basicSetTarget(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -339,82 +302,82 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.DESTROY_OBJECT_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.DESTROY_OBJECT_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.DESTROY_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.DESTROY_OBJECT_ACTION__NAME :
-				return getName();
-			case UMLPackage.DESTROY_OBJECT_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.DESTROY_OBJECT_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.DESTROY_OBJECT_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DESTROY_OBJECT_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.DESTROY_OBJECT_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.DESTROY_OBJECT_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.DESTROY_OBJECT_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.DESTROY_OBJECT_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.DESTROY_OBJECT_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.DESTROY_OBJECT_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.DESTROY_OBJECT_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS :
-				return isDestroyLinks();
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS :
-				return isDestroyOwnedObjects();
-			case UMLPackage.DESTROY_OBJECT_ACTION__TARGET :
-				if (resolve)
-					return getTarget();
-				return basicGetTarget();
+		case UMLPackage.DESTROY_OBJECT_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.DESTROY_OBJECT_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.DESTROY_OBJECT_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.DESTROY_OBJECT_ACTION__NAME:
+			return getName();
+		case UMLPackage.DESTROY_OBJECT_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.DESTROY_OBJECT_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.DESTROY_OBJECT_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DESTROY_OBJECT_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.DESTROY_OBJECT_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.DESTROY_OBJECT_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.DESTROY_OBJECT_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.DESTROY_OBJECT_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.DESTROY_OBJECT_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.DESTROY_OBJECT_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.DESTROY_OBJECT_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS:
+			return isDestroyLinks();
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS:
+			return isDestroyOwnedObjects();
+		case UMLPackage.DESTROY_OBJECT_ACTION__TARGET:
+			if (resolve)
+				return getTarget();
+			return basicGetTarget();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -428,86 +391,76 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.DESTROY_OBJECT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS :
-				setIsDestroyLinks((Boolean) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS :
-				setIsDestroyOwnedObjects((Boolean) newValue);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__TARGET :
-				setTarget((InputPin) newValue);
-				return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS:
+			setIsDestroyLinks((Boolean) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS:
+			setIsDestroyOwnedObjects((Boolean) newValue);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__TARGET:
+			setTarget((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -520,66 +473,66 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DESTROY_OBJECT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS :
-				setIsDestroyLinks(IS_DESTROY_LINKS_EDEFAULT);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS :
-				setIsDestroyOwnedObjects(IS_DESTROY_OWNED_OBJECTS_EDEFAULT);
-				return;
-			case UMLPackage.DESTROY_OBJECT_ACTION__TARGET :
-				setTarget((InputPin) null);
-				return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS:
+			setIsDestroyLinks(IS_DESTROY_LINKS_EDEFAULT);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS:
+			setIsDestroyOwnedObjects(IS_DESTROY_OWNED_OBJECTS_EDEFAULT);
+			return;
+		case UMLPackage.DESTROY_OBJECT_ACTION__TARGET:
+			setTarget((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -592,70 +545,68 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DESTROY_OBJECT_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.DESTROY_OBJECT_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.DESTROY_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.DESTROY_OBJECT_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.DESTROY_OBJECT_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.DESTROY_OBJECT_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.DESTROY_OBJECT_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.DESTROY_OBJECT_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.DESTROY_OBJECT_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.DESTROY_OBJECT_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.DESTROY_OBJECT_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.DESTROY_OBJECT_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.DESTROY_OBJECT_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.DESTROY_OBJECT_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.DESTROY_OBJECT_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.DESTROY_OBJECT_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS :
-				return isDestroyLinks() != IS_DESTROY_LINKS_EDEFAULT;
-			case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS :
-				return isDestroyOwnedObjects() != IS_DESTROY_OWNED_OBJECTS_EDEFAULT;
-			case UMLPackage.DESTROY_OBJECT_ACTION__TARGET :
-				return basicGetTarget() != null;
+		case UMLPackage.DESTROY_OBJECT_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.DESTROY_OBJECT_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.DESTROY_OBJECT_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.DESTROY_OBJECT_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.DESTROY_OBJECT_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.DESTROY_OBJECT_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.DESTROY_OBJECT_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.DESTROY_OBJECT_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.DESTROY_OBJECT_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.DESTROY_OBJECT_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.DESTROY_OBJECT_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.DESTROY_OBJECT_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.DESTROY_OBJECT_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.DESTROY_OBJECT_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.DESTROY_OBJECT_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.DESTROY_OBJECT_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.DESTROY_OBJECT_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.DESTROY_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.DESTROY_OBJECT_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_LINKS:
+			return isDestroyLinks() != IS_DESTROY_LINKS_EDEFAULT;
+		case UMLPackage.DESTROY_OBJECT_ACTION__IS_DESTROY_OWNED_OBJECTS:
+			return isDestroyOwnedObjects() != IS_DESTROY_OWNED_OBJECTS_EDEFAULT;
+		case UMLPackage.DESTROY_OBJECT_ACTION__TARGET:
+			return basicGetTarget() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -670,158 +621,134 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DESTROY_OBJECT_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DESTROY_OBJECT_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DESTROY_OBJECT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.DESTROY_OBJECT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.DESTROY_OBJECT_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DESTROY_OBJECT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.DESTROY_OBJECT_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.DESTROY_OBJECT_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.DESTROY_OBJECT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DESTROY_OBJECT_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DESTROY_OBJECT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.DESTROY_OBJECT_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.DESTROY_OBJECT_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.DESTROY_OBJECT_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.DESTROY_OBJECT_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.DESTROY_OBJECT_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_NO_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateNoType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTROY_OBJECT_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DESTROY_OBJECT_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DESTROY_OBJECT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.DESTROY_OBJECT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.DESTROY_OBJECT_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTROY_OBJECT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.DESTROY_OBJECT_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.DESTROY_OBJECT_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.DESTROY_OBJECT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DESTROY_OBJECT_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTROY_OBJECT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.DESTROY_OBJECT_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.DESTROY_OBJECT_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.DESTROY_OBJECT_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.DESTROY_OBJECT_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.DESTROY_OBJECT_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTROY_OBJECT_ACTION___VALIDATE_NO_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateNoType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -834,8 +761,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.DESTROY_OBJECT_ACTION__TARGET};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.DESTROY_OBJECT_ACTION__TARGET };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -845,7 +771,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.DESTROY_OBJECT_ACTION__TARGET);
+				|| eIsSet(UMLPackage.DESTROY_OBJECT_ACTION__TARGET);
 	}
 
 } //DestroyObjectActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DestructionOccurrenceSpecificationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DestructionOccurrenceSpecificationImpl.java
index 8e119de..d42a545 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DestructionOccurrenceSpecificationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DestructionOccurrenceSpecificationImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2011, 2016 CEA and others.
+ * Copyright (c) 2011, 2018 CEA and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   Kenn Hussey (CEA) - initial API and implementation
  *   Kenn Hussey (CEA) - 351774, 297216, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -67,9 +68,7 @@
 	 */
 	public boolean validateNoOccurrenceSpecificationsBelow(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return DestructionOccurrenceSpecificationOperations
-			.validateNoOccurrenceSpecificationsBelow(this, diagnostics,
-				context);
+		return DestructionOccurrenceSpecificationOperations.validateNoOccurrenceSpecificationsBelow(this, diagnostics, context);
 	}
 
 	/**
@@ -82,142 +81,125 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___SEPARATOR :
-				return separator();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_COVERED :
-				return getCovered();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___SET_COVERED__LIFELINE :
-				setCovered((Lifeline) arguments.get(0));
-				return null;
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___OPPOSITE_END :
-				return oppositeEnd();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___IS_SEND :
-				return isSend();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___IS_RECEIVE :
-				return isReceive();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___ENCLOSING_FRAGMENT :
-				return enclosingFragment();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___VALIDATE_NO_OCCURRENCE_SPECIFICATIONS_BELOW__DIAGNOSTICCHAIN_MAP :
-				return validateNoOccurrenceSpecificationsBelow(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___SEPARATOR:
+			return separator();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___GET_COVERED:
+			return getCovered();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___SET_COVERED__LIFELINE:
+			setCovered((Lifeline) arguments.get(0));
+			return null;
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___OPPOSITE_END:
+			return oppositeEnd();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___IS_SEND:
+			return isSend();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___IS_RECEIVE:
+			return isReceive();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___ENCLOSING_FRAGMENT:
+			return enclosingFragment();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION___VALIDATE_NO_OCCURRENCE_SPECIFICATIONS_BELOW__DIAGNOSTICCHAIN_MAP:
+			return validateNoOccurrenceSpecificationsBelow((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeviceImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeviceImpl.java
index 4abb969..c35468b 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeviceImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DeviceImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DirectedRelationshipImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DirectedRelationshipImpl.java
index f18fd42..b96da1a 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DirectedRelationshipImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DirectedRelationshipImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -72,19 +73,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> sources = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			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>(
-						Element.class, this,
-						UMLPackage.DIRECTED_RELATIONSHIP__SOURCE, null));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE, sources = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DIRECTED_RELATIONSHIP__SOURCE, null));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.DIRECTED_RELATIONSHIP__SOURCE, null);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DIRECTED_RELATIONSHIP__SOURCE, null);
 	}
 
 	/**
@@ -98,22 +93,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> relatedElements = (EList<Element>) cache.get(
-				eResource, this,
-				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
+			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<Element>(
-						Element.class, this,
-						UMLPackage.DIRECTED_RELATIONSHIP__RELATED_ELEMENT,
-						RELATED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT, relatedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DIRECTED_RELATIONSHIP__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.DIRECTED_RELATIONSHIP__RELATED_ELEMENT,
-			RELATED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DIRECTED_RELATIONSHIP__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -126,19 +112,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> targets = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			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>(
-						Element.class, this,
-						UMLPackage.DIRECTED_RELATIONSHIP__TARGET, null));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET, targets = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DIRECTED_RELATIONSHIP__TARGET, null));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.DIRECTED_RELATIONSHIP__TARGET, null);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DIRECTED_RELATIONSHIP__TARGET, null);
 	}
 
 	/**
@@ -149,22 +129,22 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.DIRECTED_RELATIONSHIP__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.DIRECTED_RELATIONSHIP__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.DIRECTED_RELATIONSHIP__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.DIRECTED_RELATIONSHIP__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.DIRECTED_RELATIONSHIP__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.DIRECTED_RELATIONSHIP__SOURCE :
-				return getSources();
-			case UMLPackage.DIRECTED_RELATIONSHIP__TARGET :
-				return getTargets();
+		case UMLPackage.DIRECTED_RELATIONSHIP__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.DIRECTED_RELATIONSHIP__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.DIRECTED_RELATIONSHIP__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.DIRECTED_RELATIONSHIP__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.DIRECTED_RELATIONSHIP__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.DIRECTED_RELATIONSHIP__SOURCE:
+			return getSources();
+		case UMLPackage.DIRECTED_RELATIONSHIP__TARGET:
+			return getTargets();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -177,20 +157,20 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DIRECTED_RELATIONSHIP__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.DIRECTED_RELATIONSHIP__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.DIRECTED_RELATIONSHIP__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.DIRECTED_RELATIONSHIP__OWNER :
-				return isSetOwner();
-			case UMLPackage.DIRECTED_RELATIONSHIP__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.DIRECTED_RELATIONSHIP__SOURCE :
-				return isSetSources();
-			case UMLPackage.DIRECTED_RELATIONSHIP__TARGET :
-				return isSetTargets();
+		case UMLPackage.DIRECTED_RELATIONSHIP__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.DIRECTED_RELATIONSHIP__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.DIRECTED_RELATIONSHIP__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.DIRECTED_RELATIONSHIP__OWNER:
+			return isSetOwner();
+		case UMLPackage.DIRECTED_RELATIONSHIP__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.DIRECTED_RELATIONSHIP__SOURCE:
+			return isSetSources();
+		case UMLPackage.DIRECTED_RELATIONSHIP__TARGET:
+			return isSetTargets();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -212,9 +192,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] RELATED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.DIRECTED_RELATIONSHIP__SOURCE,
-		UMLPackage.DIRECTED_RELATIONSHIP__TARGET};
+	protected static final int[] RELATED_ELEMENT_ESUBSETS = new int[] { UMLPackage.DIRECTED_RELATIONSHIP__SOURCE, UMLPackage.DIRECTED_RELATIONSHIP__TARGET };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -223,7 +201,9 @@
 	 */
 	@Override
 	public boolean isSetRelatedElements() {
-		return super.isSetRelatedElements() || isSetSources() || isSetTargets();
+		return super.isSetRelatedElements()
+				|| isSetSources()
+				|| isSetTargets();
 	}
 
 	/**
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationConstraintImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationConstraintImpl.java
index aa651d1..a9540bd 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationConstraintImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationConstraintImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 397324, 212765, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -26,6 +27,10 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
+
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.DurationConstraint;
@@ -89,9 +94,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Boolean> getFirstEvents() {
-		return (EList<Boolean>) eDynamicGet(
-			UMLPackage.DURATION_CONSTRAINT__FIRST_EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DURATION_CONSTRAINT__FIRST_EVENT, true, true);
+		return (EList<Boolean>) eDynamicGet(UMLPackage.DURATION_CONSTRAINT__FIRST_EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DURATION_CONSTRAINT__FIRST_EVENT, true, true);
 	}
 
 	/**
@@ -101,10 +104,7 @@
 	 */
 	@Override
 	public ValueSpecification getSpecification() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.DURATION_CONSTRAINT__SPECIFICATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__SPECIFICATION, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.DURATION_CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__SPECIFICATION, true, true);
 	}
 
 	/**
@@ -114,10 +114,7 @@
 	 */
 	@Override
 	public ValueSpecification basicGetSpecification() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.DURATION_CONSTRAINT__SPECIFICATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__SPECIFICATION, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.DURATION_CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__SPECIFICATION, false, true);
 	}
 
 	/**
@@ -128,13 +125,10 @@
 	@Override
 	public NotificationChain basicSetSpecification(
 			ValueSpecification newSpecification, NotificationChain msgs) {
-		if (newSpecification != null
-			&& !(newSpecification instanceof DurationInterval)) {
-			throw new IllegalArgumentException(
-				"newSpecification must be an instance of DurationInterval"); //$NON-NLS-1$
+		if (newSpecification != null && !(newSpecification instanceof DurationInterval)) {
+			throw new IllegalArgumentException("newSpecification must be an instance of DurationInterval"); //$NON-NLS-1$
 		}
-		msgs = eDynamicInverseAdd((InternalEObject) newSpecification,
-			UMLPackage.DURATION_CONSTRAINT__SPECIFICATION, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newSpecification, UMLPackage.DURATION_CONSTRAINT__SPECIFICATION, msgs);
 		return msgs;
 	}
 
@@ -145,15 +139,10 @@
 	 */
 	@Override
 	public void setSpecification(ValueSpecification newSpecification) {
-		if (newSpecification != null
-			&& !(newSpecification instanceof DurationInterval)) {
-			throw new IllegalArgumentException(
-				"newSpecification must be an instance of DurationInterval"); //$NON-NLS-1$
+		if (newSpecification != null && !(newSpecification instanceof DurationInterval)) {
+			throw new IllegalArgumentException("newSpecification must be an instance of DurationInterval"); //$NON-NLS-1$
 		}
-		eDynamicSet(
-			UMLPackage.DURATION_CONSTRAINT__SPECIFICATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__SPECIFICATION, newSpecification);
+		eDynamicSet(UMLPackage.DURATION_CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__SPECIFICATION, newSpecification);
 	}
 
 	/**
@@ -161,11 +150,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public ValueSpecification createSpecification(String name, Type type,
 			EClass eClass) {
-		ValueSpecification newSpecification = (ValueSpecification) create(
-			eClass);
+		ValueSpecification newSpecification = (ValueSpecification) create(eClass);
 		setSpecification(newSpecification);
 		if (name != null)
 			newSpecification.setName(name);
@@ -191,8 +178,7 @@
 	 */
 	public boolean validateFirstEventMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return DurationConstraintOperations.validateFirstEventMultiplicity(this,
-			diagnostics, context);
+		return DurationConstraintOperations.validateFirstEventMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -202,8 +188,7 @@
 	 */
 	public boolean validateHasOneOrTwoConstrainedElements(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return DurationConstraintOperations
-			.validateHasOneOrTwoConstrainedElements(this, diagnostics, context);
+		return DurationConstraintOperations.validateHasOneOrTwoConstrainedElements(this, diagnostics, context);
 	}
 
 	/**
@@ -215,22 +200,20 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.DURATION_CONSTRAINT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DURATION_CONSTRAINT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DURATION_CONSTRAINT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.DURATION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.DURATION_CONSTRAINT__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.DURATION_CONSTRAINT__CONTEXT :
-				return basicSetContext(null, msgs);
-			case UMLPackage.DURATION_CONSTRAINT__SPECIFICATION :
-				return basicSetSpecification(null, msgs);
+		case UMLPackage.DURATION_CONSTRAINT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DURATION_CONSTRAINT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DURATION_CONSTRAINT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.DURATION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.DURATION_CONSTRAINT__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.DURATION_CONSTRAINT__CONTEXT:
+			return basicSetContext(null, msgs);
+		case UMLPackage.DURATION_CONSTRAINT__SPECIFICATION:
+			return basicSetSpecification(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -243,52 +226,52 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.DURATION_CONSTRAINT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.DURATION_CONSTRAINT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.DURATION_CONSTRAINT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.DURATION_CONSTRAINT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.DURATION_CONSTRAINT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.DURATION_CONSTRAINT__NAME :
-				return getName();
-			case UMLPackage.DURATION_CONSTRAINT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.DURATION_CONSTRAINT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.DURATION_CONSTRAINT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DURATION_CONSTRAINT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.DURATION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.DURATION_CONSTRAINT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.DURATION_CONSTRAINT__CONSTRAINED_ELEMENT :
-				return getConstrainedElements();
-			case UMLPackage.DURATION_CONSTRAINT__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.DURATION_CONSTRAINT__SPECIFICATION :
-				if (resolve)
-					return getSpecification();
-				return basicGetSpecification();
-			case UMLPackage.DURATION_CONSTRAINT__FIRST_EVENT :
-				return getFirstEvents();
+		case UMLPackage.DURATION_CONSTRAINT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.DURATION_CONSTRAINT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.DURATION_CONSTRAINT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.DURATION_CONSTRAINT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.DURATION_CONSTRAINT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.DURATION_CONSTRAINT__NAME:
+			return getName();
+		case UMLPackage.DURATION_CONSTRAINT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.DURATION_CONSTRAINT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.DURATION_CONSTRAINT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DURATION_CONSTRAINT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.DURATION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.DURATION_CONSTRAINT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.DURATION_CONSTRAINT__CONSTRAINED_ELEMENT:
+			return getConstrainedElements();
+		case UMLPackage.DURATION_CONSTRAINT__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.DURATION_CONSTRAINT__SPECIFICATION:
+			if (resolve)
+				return getSpecification();
+			return basicGetSpecification();
+		case UMLPackage.DURATION_CONSTRAINT__FIRST_EVENT:
+			return getFirstEvents();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -302,47 +285,43 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.DURATION_CONSTRAINT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__CONSTRAINED_ELEMENT :
-				getConstrainedElements().clear();
-				getConstrainedElements()
-					.addAll((Collection<? extends Element>) newValue);
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__CONTEXT :
-				setContext((Namespace) newValue);
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__SPECIFICATION :
-				setSpecification((ValueSpecification) newValue);
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__FIRST_EVENT :
-				getFirstEvents().clear();
-				getFirstEvents()
-					.addAll((Collection<? extends Boolean>) newValue);
-				return;
+		case UMLPackage.DURATION_CONSTRAINT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__CONSTRAINED_ELEMENT:
+			getConstrainedElements().clear();
+			getConstrainedElements().addAll((Collection<? extends Element>) newValue);
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__CONTEXT:
+			setContext((Namespace) newValue);
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__SPECIFICATION:
+			setSpecification((ValueSpecification) newValue);
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__FIRST_EVENT:
+			getFirstEvents().clear();
+			getFirstEvents().addAll((Collection<? extends Boolean>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -355,39 +334,39 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DURATION_CONSTRAINT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__CONSTRAINED_ELEMENT :
-				getConstrainedElements().clear();
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__CONTEXT :
-				setContext((Namespace) null);
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__SPECIFICATION :
-				setSpecification((ValueSpecification) null);
-				return;
-			case UMLPackage.DURATION_CONSTRAINT__FIRST_EVENT :
-				getFirstEvents().clear();
-				return;
+		case UMLPackage.DURATION_CONSTRAINT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__CONSTRAINED_ELEMENT:
+			getConstrainedElements().clear();
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__CONTEXT:
+			setContext((Namespace) null);
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__SPECIFICATION:
+			setSpecification((ValueSpecification) null);
+			return;
+		case UMLPackage.DURATION_CONSTRAINT__FIRST_EVENT:
+			getFirstEvents().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -400,40 +379,38 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DURATION_CONSTRAINT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.DURATION_CONSTRAINT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.DURATION_CONSTRAINT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.DURATION_CONSTRAINT__OWNER :
-				return isSetOwner();
-			case UMLPackage.DURATION_CONSTRAINT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.DURATION_CONSTRAINT__NAME :
-				return isSetName();
-			case UMLPackage.DURATION_CONSTRAINT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.DURATION_CONSTRAINT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.DURATION_CONSTRAINT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.DURATION_CONSTRAINT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.DURATION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.DURATION_CONSTRAINT__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.DURATION_CONSTRAINT__CONSTRAINED_ELEMENT :
-				return !getConstrainedElements().isEmpty();
-			case UMLPackage.DURATION_CONSTRAINT__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.DURATION_CONSTRAINT__SPECIFICATION :
-				return isSetSpecification();
-			case UMLPackage.DURATION_CONSTRAINT__FIRST_EVENT :
-				return !getFirstEvents().isEmpty();
+		case UMLPackage.DURATION_CONSTRAINT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.DURATION_CONSTRAINT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.DURATION_CONSTRAINT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.DURATION_CONSTRAINT__OWNER:
+			return isSetOwner();
+		case UMLPackage.DURATION_CONSTRAINT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.DURATION_CONSTRAINT__NAME:
+			return isSetName();
+		case UMLPackage.DURATION_CONSTRAINT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.DURATION_CONSTRAINT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.DURATION_CONSTRAINT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.DURATION_CONSTRAINT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.DURATION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.DURATION_CONSTRAINT__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.DURATION_CONSTRAINT__CONSTRAINED_ELEMENT:
+			return !getConstrainedElements().isEmpty();
+		case UMLPackage.DURATION_CONSTRAINT__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.DURATION_CONSTRAINT__SPECIFICATION:
+			return isSetSpecification();
+		case UMLPackage.DURATION_CONSTRAINT__FIRST_EVENT:
+			return !getFirstEvents().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -448,152 +425,126 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.DURATION_CONSTRAINT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_CONSTRAINT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_CONSTRAINT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.DURATION_CONSTRAINT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.DURATION_CONSTRAINT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.DURATION_CONSTRAINT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.DURATION_CONSTRAINT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DURATION_CONSTRAINT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___GET_MODEL :
-				return getModel();
-			case UMLPackage.DURATION_CONSTRAINT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.DURATION_CONSTRAINT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.DURATION_CONSTRAINT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.DURATION_CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.DURATION_CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.DURATION_CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.DURATION_CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DURATION_CONSTRAINT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DURATION_CONSTRAINT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.DURATION_CONSTRAINT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.DURATION_CONSTRAINT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.DURATION_CONSTRAINT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_CONSTRAINT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_CONSTRAINT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_CONSTRAINT___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___GET_LABEL :
-				return getLabel();
-			case UMLPackage.DURATION_CONSTRAINT___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.DURATION_CONSTRAINT___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.DURATION_CONSTRAINT___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.DURATION_CONSTRAINT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.DURATION_CONSTRAINT___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DURATION_CONSTRAINT___SEPARATOR :
-				return separator();
-			case UMLPackage.DURATION_CONSTRAINT___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.DURATION_CONSTRAINT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.DURATION_CONSTRAINT___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.DURATION_CONSTRAINT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_CONSTRAINT___VALIDATE_BOOLEAN_VALUE__DIAGNOSTICCHAIN_MAP :
-				return validateBooleanValue((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_CONSTRAINT___VALIDATE_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateNoSideEffects((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_CONSTRAINT___VALIDATE_NOT_APPLY_TO_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotApplyToSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_CONSTRAINT___VALIDATE_FIRST_EVENT_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateFirstEventMultiplicity(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_CONSTRAINT___VALIDATE_HAS_ONE_OR_TWO_CONSTRAINED_ELEMENTS__DIAGNOSTICCHAIN_MAP :
-				return validateHasOneOrTwoConstrainedElements(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_CONSTRAINT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_CONSTRAINT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_CONSTRAINT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.DURATION_CONSTRAINT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.DURATION_CONSTRAINT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.DURATION_CONSTRAINT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.DURATION_CONSTRAINT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DURATION_CONSTRAINT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___GET_MODEL:
+			return getModel();
+		case UMLPackage.DURATION_CONSTRAINT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.DURATION_CONSTRAINT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.DURATION_CONSTRAINT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.DURATION_CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.DURATION_CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.DURATION_CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.DURATION_CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DURATION_CONSTRAINT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DURATION_CONSTRAINT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.DURATION_CONSTRAINT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.DURATION_CONSTRAINT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.DURATION_CONSTRAINT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_CONSTRAINT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_CONSTRAINT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_CONSTRAINT___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___GET_LABEL:
+			return getLabel();
+		case UMLPackage.DURATION_CONSTRAINT___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.DURATION_CONSTRAINT___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.DURATION_CONSTRAINT___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.DURATION_CONSTRAINT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.DURATION_CONSTRAINT___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DURATION_CONSTRAINT___SEPARATOR:
+			return separator();
+		case UMLPackage.DURATION_CONSTRAINT___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.DURATION_CONSTRAINT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.DURATION_CONSTRAINT___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.DURATION_CONSTRAINT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_CONSTRAINT___VALIDATE_BOOLEAN_VALUE__DIAGNOSTICCHAIN_MAP:
+			return validateBooleanValue((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_CONSTRAINT___VALIDATE_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_CONSTRAINT___VALIDATE_NOT_APPLY_TO_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotApplyToSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_CONSTRAINT___VALIDATE_FIRST_EVENT_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateFirstEventMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_CONSTRAINT___VALIDATE_HAS_ONE_OR_TWO_CONSTRAINED_ELEMENTS__DIAGNOSTICCHAIN_MAP:
+			return validateHasOneOrTwoConstrainedElements((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationImpl.java
index 8556ddd..ecbe154 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -16,6 +16,8 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
+
 import org.eclipse.emf.common.notify.NotificationChain;
 import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EList;
@@ -24,7 +26,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
@@ -94,19 +100,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.DURATION__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DURATION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.DURATION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.DURATION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -117,9 +117,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.DURATION__OWNED_COMMENT,
-		UMLPackage.DURATION__NAME_EXPRESSION, UMLPackage.DURATION__EXPR};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.DURATION__OWNED_COMMENT, UMLPackage.DURATION__NAME_EXPRESSION, UMLPackage.DURATION__EXPR };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -127,9 +125,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getExpr() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.DURATION__EXPR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DURATION__EXPR, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.DURATION__EXPR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DURATION__EXPR, true, true);
 	}
 
 	/**
@@ -138,9 +134,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetExpr() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.DURATION__EXPR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DURATION__EXPR, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.DURATION__EXPR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DURATION__EXPR, false, true);
 	}
 
 	/**
@@ -150,8 +144,7 @@
 	 */
 	public NotificationChain basicSetExpr(ValueSpecification newExpr,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newExpr,
-			UMLPackage.DURATION__EXPR, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newExpr, UMLPackage.DURATION__EXPR, msgs);
 		return msgs;
 	}
 
@@ -161,8 +154,7 @@
 	 * @generated
 	 */
 	public void setExpr(ValueSpecification newExpr) {
-		eDynamicSet(UMLPackage.DURATION__EXPR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DURATION__EXPR, newExpr);
+		eDynamicSet(UMLPackage.DURATION__EXPR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DURATION__EXPR, newExpr);
 	}
 
 	/**
@@ -188,9 +180,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Observation> getObservations() {
-		return (EList<Observation>) eDynamicGet(
-			UMLPackage.DURATION__OBSERVATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DURATION__OBSERVATION, true, true);
+		return (EList<Observation>) eDynamicGet(UMLPackage.DURATION__OBSERVATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DURATION__OBSERVATION, true, true);
 	}
 
 	/**
@@ -209,12 +199,10 @@
 	 */
 	public Observation getObservation(String name, boolean ignoreCase,
 			EClass eClass) {
-		observationLoop : for (Observation observation : getObservations()) {
+		observationLoop: for (Observation observation : getObservations()) {
 			if (eClass != null && !eClass.isInstance(observation))
 				continue observationLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(observation.getName())
-				: name.equals(observation.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(observation.getName()) : name.equals(observation.getName())))
 				continue observationLoop;
 			return observation;
 		}
@@ -228,8 +216,7 @@
 	 */
 	public boolean validateNoExprRequiresObservation(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return DurationOperations.validateNoExprRequiresObservation(this,
-			diagnostics, context);
+		return DurationOperations.validateNoExprRequiresObservation(this, diagnostics, context);
 	}
 
 	/**
@@ -251,20 +238,18 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.DURATION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DURATION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.DURATION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.DURATION__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.DURATION__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.DURATION__EXPR :
-				return basicSetExpr(null, msgs);
+		case UMLPackage.DURATION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DURATION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.DURATION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.DURATION__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.DURATION__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.DURATION__EXPR:
+			return basicSetExpr(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -277,50 +262,50 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.DURATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.DURATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.DURATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.DURATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.DURATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.DURATION__NAME :
-				return getName();
-			case UMLPackage.DURATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.DURATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.DURATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DURATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.DURATION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.DURATION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.DURATION__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.DURATION__EXPR :
-				if (resolve)
-					return getExpr();
-				return basicGetExpr();
-			case UMLPackage.DURATION__OBSERVATION :
-				return getObservations();
+		case UMLPackage.DURATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.DURATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.DURATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.DURATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.DURATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.DURATION__NAME:
+			return getName();
+		case UMLPackage.DURATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.DURATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.DURATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DURATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.DURATION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.DURATION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.DURATION__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.DURATION__EXPR:
+			if (resolve)
+				return getExpr();
+			return basicGetExpr();
+		case UMLPackage.DURATION__OBSERVATION:
+			return getObservations();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -334,42 +319,39 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.DURATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.DURATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.DURATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.DURATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.DURATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.DURATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DURATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DURATION__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.DURATION__EXPR :
-				setExpr((ValueSpecification) newValue);
-				return;
-			case UMLPackage.DURATION__OBSERVATION :
-				getObservations().clear();
-				getObservations()
-					.addAll((Collection<? extends Observation>) newValue);
-				return;
+		case UMLPackage.DURATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.DURATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.DURATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.DURATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.DURATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.DURATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DURATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DURATION__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.DURATION__EXPR:
+			setExpr((ValueSpecification) newValue);
+			return;
+		case UMLPackage.DURATION__OBSERVATION:
+			getObservations().clear();
+			getObservations().addAll((Collection<? extends Observation>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -382,36 +364,36 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DURATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.DURATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.DURATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.DURATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.DURATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.DURATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DURATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DURATION__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.DURATION__EXPR :
-				setExpr((ValueSpecification) null);
-				return;
-			case UMLPackage.DURATION__OBSERVATION :
-				getObservations().clear();
-				return;
+		case UMLPackage.DURATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.DURATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.DURATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.DURATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.DURATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.DURATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DURATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DURATION__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.DURATION__EXPR:
+			setExpr((ValueSpecification) null);
+			return;
+		case UMLPackage.DURATION__OBSERVATION:
+			getObservations().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -424,38 +406,36 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DURATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.DURATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.DURATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.DURATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.DURATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.DURATION__NAME :
-				return isSetName();
-			case UMLPackage.DURATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.DURATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.DURATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.DURATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.DURATION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.DURATION__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.DURATION__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.DURATION__EXPR :
-				return basicGetExpr() != null;
-			case UMLPackage.DURATION__OBSERVATION :
-				return !getObservations().isEmpty();
+		case UMLPackage.DURATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.DURATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.DURATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.DURATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.DURATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.DURATION__NAME:
+			return isSetName();
+		case UMLPackage.DURATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.DURATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.DURATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.DURATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.DURATION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.DURATION__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.DURATION__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.DURATION__EXPR:
+			return basicGetExpr() != null;
+		case UMLPackage.DURATION__OBSERVATION:
+			return !getObservations().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -470,152 +450,132 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.DURATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.DURATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.DURATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.DURATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.DURATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.DURATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.DURATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.DURATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.DURATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.DURATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DURATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.DURATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.DURATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.DURATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.DURATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.DURATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.DURATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.DURATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DURATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.DURATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.DURATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DURATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DURATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.DURATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DURATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.DURATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.DURATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.DURATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.DURATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.DURATION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.DURATION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.DURATION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.DURATION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.DURATION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.DURATION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.DURATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.DURATION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DURATION___SEPARATOR :
-				return separator();
-			case UMLPackage.DURATION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.DURATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.DURATION___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.DURATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION___BOOLEAN_VALUE :
-				return booleanValue();
-			case UMLPackage.DURATION___INTEGER_VALUE :
-				return integerValue();
-			case UMLPackage.DURATION___IS_COMPUTABLE :
-				return isComputable();
-			case UMLPackage.DURATION___IS_NULL :
-				return isNull();
-			case UMLPackage.DURATION___REAL_VALUE :
-				return realValue();
-			case UMLPackage.DURATION___STRING_VALUE :
-				return stringValue();
-			case UMLPackage.DURATION___UNLIMITED_VALUE :
-				return unlimitedValue();
-			case UMLPackage.DURATION___VALIDATE_NO_EXPR_REQUIRES_OBSERVATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoExprRequiresObservation(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.DURATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.DURATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.DURATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.DURATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.DURATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.DURATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.DURATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.DURATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.DURATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DURATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.DURATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.DURATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.DURATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.DURATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.DURATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.DURATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.DURATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DURATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.DURATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.DURATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DURATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DURATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.DURATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DURATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.DURATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.DURATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.DURATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.DURATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.DURATION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.DURATION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.DURATION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.DURATION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.DURATION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.DURATION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.DURATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.DURATION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DURATION___SEPARATOR:
+			return separator();
+		case UMLPackage.DURATION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.DURATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.DURATION___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.DURATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION___BOOLEAN_VALUE:
+			return booleanValue();
+		case UMLPackage.DURATION___INTEGER_VALUE:
+			return integerValue();
+		case UMLPackage.DURATION___IS_COMPUTABLE:
+			return isComputable();
+		case UMLPackage.DURATION___IS_NULL:
+			return isNull();
+		case UMLPackage.DURATION___REAL_VALUE:
+			return realValue();
+		case UMLPackage.DURATION___STRING_VALUE:
+			return stringValue();
+		case UMLPackage.DURATION___UNLIMITED_VALUE:
+			return unlimitedValue();
+		case UMLPackage.DURATION___VALIDATE_NO_EXPR_REQUIRES_OBSERVATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoExprRequiresObservation((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -627,7 +587,8 @@
 	 */
 	@Override
 	public boolean isSetOwnedElements() {
-		return super.isSetOwnedElements() || eIsSet(UMLPackage.DURATION__EXPR);
+		return super.isSetOwnedElements()
+				|| eIsSet(UMLPackage.DURATION__EXPR);
 	}
 
 } //DurationImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationIntervalImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationIntervalImpl.java
index fc39b97..c878bd9 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationIntervalImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationIntervalImpl.java
@@ -1,20 +1,27 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 212765, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.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.Duration;
 import org.eclipse.uml2.uml.DurationInterval;
@@ -69,9 +76,7 @@
 	 */
 	@Override
 	public ValueSpecification getMin() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.DURATION_INTERVAL__MIN - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MIN, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.DURATION_INTERVAL__MIN - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MIN, true, true);
 	}
 
 	/**
@@ -81,9 +86,7 @@
 	 */
 	@Override
 	public ValueSpecification basicGetMin() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.DURATION_INTERVAL__MIN - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MIN, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.DURATION_INTERVAL__MIN - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MIN, false, true);
 	}
 
 	/**
@@ -94,11 +97,9 @@
 	@Override
 	public void setMin(ValueSpecification newMin) {
 		if (newMin != null && !(newMin instanceof Duration)) {
-			throw new IllegalArgumentException(
-				"newMin must be an instance of Duration"); //$NON-NLS-1$
+			throw new IllegalArgumentException("newMin must be an instance of Duration"); //$NON-NLS-1$
 		}
-		eDynamicSet(UMLPackage.DURATION_INTERVAL__MIN - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MIN, newMin);
+		eDynamicSet(UMLPackage.DURATION_INTERVAL__MIN - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MIN, newMin);
 	}
 
 	/**
@@ -118,52 +119,52 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.DURATION_INTERVAL__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.DURATION_INTERVAL__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.DURATION_INTERVAL__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.DURATION_INTERVAL__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.DURATION_INTERVAL__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.DURATION_INTERVAL__NAME :
-				return getName();
-			case UMLPackage.DURATION_INTERVAL__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.DURATION_INTERVAL__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.DURATION_INTERVAL__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DURATION_INTERVAL__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.DURATION_INTERVAL__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.DURATION_INTERVAL__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.DURATION_INTERVAL__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.DURATION_INTERVAL__MAX :
-				if (resolve)
-					return getMax();
-				return basicGetMax();
-			case UMLPackage.DURATION_INTERVAL__MIN :
-				if (resolve)
-					return getMin();
-				return basicGetMin();
+		case UMLPackage.DURATION_INTERVAL__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.DURATION_INTERVAL__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.DURATION_INTERVAL__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.DURATION_INTERVAL__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.DURATION_INTERVAL__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.DURATION_INTERVAL__NAME:
+			return getName();
+		case UMLPackage.DURATION_INTERVAL__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.DURATION_INTERVAL__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.DURATION_INTERVAL__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DURATION_INTERVAL__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.DURATION_INTERVAL__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.DURATION_INTERVAL__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.DURATION_INTERVAL__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.DURATION_INTERVAL__MAX:
+			if (resolve)
+				return getMax();
+			return basicGetMax();
+		case UMLPackage.DURATION_INTERVAL__MIN:
+			if (resolve)
+				return getMin();
+			return basicGetMin();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -177,40 +178,38 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.DURATION_INTERVAL__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.DURATION_INTERVAL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.DURATION_INTERVAL__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.DURATION_INTERVAL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.DURATION_INTERVAL__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.DURATION_INTERVAL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DURATION_INTERVAL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DURATION_INTERVAL__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.DURATION_INTERVAL__MAX :
-				setMax((ValueSpecification) newValue);
-				return;
-			case UMLPackage.DURATION_INTERVAL__MIN :
-				setMin((ValueSpecification) newValue);
-				return;
+		case UMLPackage.DURATION_INTERVAL__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.DURATION_INTERVAL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.DURATION_INTERVAL__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.DURATION_INTERVAL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.DURATION_INTERVAL__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.DURATION_INTERVAL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DURATION_INTERVAL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DURATION_INTERVAL__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.DURATION_INTERVAL__MAX:
+			setMax((ValueSpecification) newValue);
+			return;
+		case UMLPackage.DURATION_INTERVAL__MIN:
+			setMin((ValueSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -223,36 +222,36 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DURATION_INTERVAL__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.DURATION_INTERVAL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.DURATION_INTERVAL__NAME :
-				unsetName();
-				return;
-			case UMLPackage.DURATION_INTERVAL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.DURATION_INTERVAL__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.DURATION_INTERVAL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DURATION_INTERVAL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DURATION_INTERVAL__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.DURATION_INTERVAL__MAX :
-				setMax((ValueSpecification) null);
-				return;
-			case UMLPackage.DURATION_INTERVAL__MIN :
-				setMin((ValueSpecification) null);
-				return;
+		case UMLPackage.DURATION_INTERVAL__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.DURATION_INTERVAL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.DURATION_INTERVAL__NAME:
+			unsetName();
+			return;
+		case UMLPackage.DURATION_INTERVAL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.DURATION_INTERVAL__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.DURATION_INTERVAL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DURATION_INTERVAL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DURATION_INTERVAL__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.DURATION_INTERVAL__MAX:
+			setMax((ValueSpecification) null);
+			return;
+		case UMLPackage.DURATION_INTERVAL__MIN:
+			setMin((ValueSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -265,38 +264,36 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DURATION_INTERVAL__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.DURATION_INTERVAL__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.DURATION_INTERVAL__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.DURATION_INTERVAL__OWNER :
-				return isSetOwner();
-			case UMLPackage.DURATION_INTERVAL__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.DURATION_INTERVAL__NAME :
-				return isSetName();
-			case UMLPackage.DURATION_INTERVAL__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.DURATION_INTERVAL__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.DURATION_INTERVAL__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.DURATION_INTERVAL__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.DURATION_INTERVAL__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.DURATION_INTERVAL__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.DURATION_INTERVAL__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.DURATION_INTERVAL__MAX :
-				return isSetMax();
-			case UMLPackage.DURATION_INTERVAL__MIN :
-				return isSetMin();
+		case UMLPackage.DURATION_INTERVAL__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.DURATION_INTERVAL__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.DURATION_INTERVAL__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.DURATION_INTERVAL__OWNER:
+			return isSetOwner();
+		case UMLPackage.DURATION_INTERVAL__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.DURATION_INTERVAL__NAME:
+			return isSetName();
+		case UMLPackage.DURATION_INTERVAL__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.DURATION_INTERVAL__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.DURATION_INTERVAL__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.DURATION_INTERVAL__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.DURATION_INTERVAL__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.DURATION_INTERVAL__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.DURATION_INTERVAL__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.DURATION_INTERVAL__MAX:
+			return isSetMax();
+		case UMLPackage.DURATION_INTERVAL__MIN:
+			return isSetMin();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -308,9 +305,7 @@
 	 */
 	@Override
 	public ValueSpecification getMax() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.DURATION_INTERVAL__MAX - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MAX, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.DURATION_INTERVAL__MAX - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MAX, true, true);
 	}
 
 	/**
@@ -320,9 +315,7 @@
 	 */
 	@Override
 	public ValueSpecification basicGetMax() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.DURATION_INTERVAL__MAX - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MAX, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.DURATION_INTERVAL__MAX - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MAX, false, true);
 	}
 
 	/**
@@ -333,11 +326,9 @@
 	@Override
 	public void setMax(ValueSpecification newMax) {
 		if (newMax != null && !(newMax instanceof Duration)) {
-			throw new IllegalArgumentException(
-				"newMax must be an instance of Duration"); //$NON-NLS-1$
+			throw new IllegalArgumentException("newMax must be an instance of Duration"); //$NON-NLS-1$
 		}
-		eDynamicSet(UMLPackage.DURATION_INTERVAL__MAX - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MAX, newMax);
+		eDynamicSet(UMLPackage.DURATION_INTERVAL__MAX - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MAX, newMax);
 	}
 
 	/**
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationObservationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationObservationImpl.java
index c938ff6..676195d 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationObservationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/DurationObservationImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 397324, 418466, 451350, 485756
  *
  */
@@ -23,6 +23,9 @@
 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.DurationObservation;
 import org.eclipse.uml2.uml.NamedElement;
@@ -80,9 +83,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<NamedElement> getEvents() {
-		return (EList<NamedElement>) eDynamicGet(
-			UMLPackage.DURATION_OBSERVATION__EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DURATION_OBSERVATION__EVENT, true, true);
+		return (EList<NamedElement>) eDynamicGet(UMLPackage.DURATION_OBSERVATION__EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DURATION_OBSERVATION__EVENT, true, true);
 	}
 
 	/**
@@ -101,12 +102,10 @@
 	 */
 	public NamedElement getEvent(String name, boolean ignoreCase,
 			EClass eClass) {
-		eventLoop : for (NamedElement event : getEvents()) {
+		eventLoop: for (NamedElement event : getEvents()) {
 			if (eClass != null && !eClass.isInstance(event))
 				continue eventLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(event.getName())
-				: name.equals(event.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(event.getName()) : name.equals(event.getName())))
 				continue eventLoop;
 			return event;
 		}
@@ -120,10 +119,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Boolean> getFirstEvents() {
-		return (EList<Boolean>) eDynamicGet(
-			UMLPackage.DURATION_OBSERVATION__FIRST_EVENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DURATION_OBSERVATION__FIRST_EVENT, true, true);
+		return (EList<Boolean>) eDynamicGet(UMLPackage.DURATION_OBSERVATION__FIRST_EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DURATION_OBSERVATION__FIRST_EVENT, true, true);
 	}
 
 	/**
@@ -133,8 +129,7 @@
 	 */
 	public boolean validateFirstEventMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return DurationObservationOperations
-			.validateFirstEventMultiplicity(this, diagnostics, context);
+		return DurationObservationOperations.validateFirstEventMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -145,44 +140,44 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.DURATION_OBSERVATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.DURATION_OBSERVATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.DURATION_OBSERVATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.DURATION_OBSERVATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.DURATION_OBSERVATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.DURATION_OBSERVATION__NAME :
-				return getName();
-			case UMLPackage.DURATION_OBSERVATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.DURATION_OBSERVATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.DURATION_OBSERVATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DURATION_OBSERVATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.DURATION_OBSERVATION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.DURATION_OBSERVATION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.DURATION_OBSERVATION__EVENT :
-				return getEvents();
-			case UMLPackage.DURATION_OBSERVATION__FIRST_EVENT :
-				return getFirstEvents();
+		case UMLPackage.DURATION_OBSERVATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.DURATION_OBSERVATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.DURATION_OBSERVATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.DURATION_OBSERVATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.DURATION_OBSERVATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.DURATION_OBSERVATION__NAME:
+			return getName();
+		case UMLPackage.DURATION_OBSERVATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.DURATION_OBSERVATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.DURATION_OBSERVATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DURATION_OBSERVATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.DURATION_OBSERVATION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.DURATION_OBSERVATION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.DURATION_OBSERVATION__EVENT:
+			return getEvents();
+		case UMLPackage.DURATION_OBSERVATION__FIRST_EVENT:
+			return getFirstEvents();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -196,41 +191,37 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.DURATION_OBSERVATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.DURATION_OBSERVATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.DURATION_OBSERVATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.DURATION_OBSERVATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.DURATION_OBSERVATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.DURATION_OBSERVATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DURATION_OBSERVATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.DURATION_OBSERVATION__EVENT :
-				getEvents().clear();
-				getEvents()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.DURATION_OBSERVATION__FIRST_EVENT :
-				getFirstEvents().clear();
-				getFirstEvents()
-					.addAll((Collection<? extends Boolean>) newValue);
-				return;
+		case UMLPackage.DURATION_OBSERVATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.DURATION_OBSERVATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.DURATION_OBSERVATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.DURATION_OBSERVATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.DURATION_OBSERVATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.DURATION_OBSERVATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DURATION_OBSERVATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.DURATION_OBSERVATION__EVENT:
+			getEvents().clear();
+			getEvents().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.DURATION_OBSERVATION__FIRST_EVENT:
+			getFirstEvents().clear();
+			getFirstEvents().addAll((Collection<? extends Boolean>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -243,33 +234,33 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DURATION_OBSERVATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.DURATION_OBSERVATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.DURATION_OBSERVATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.DURATION_OBSERVATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.DURATION_OBSERVATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.DURATION_OBSERVATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DURATION_OBSERVATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.DURATION_OBSERVATION__EVENT :
-				getEvents().clear();
-				return;
-			case UMLPackage.DURATION_OBSERVATION__FIRST_EVENT :
-				getFirstEvents().clear();
-				return;
+		case UMLPackage.DURATION_OBSERVATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.DURATION_OBSERVATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.DURATION_OBSERVATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.DURATION_OBSERVATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.DURATION_OBSERVATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.DURATION_OBSERVATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DURATION_OBSERVATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.DURATION_OBSERVATION__EVENT:
+			getEvents().clear();
+			return;
+		case UMLPackage.DURATION_OBSERVATION__FIRST_EVENT:
+			getFirstEvents().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -282,36 +273,34 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.DURATION_OBSERVATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.DURATION_OBSERVATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.DURATION_OBSERVATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.DURATION_OBSERVATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.DURATION_OBSERVATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.DURATION_OBSERVATION__NAME :
-				return isSetName();
-			case UMLPackage.DURATION_OBSERVATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.DURATION_OBSERVATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.DURATION_OBSERVATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.DURATION_OBSERVATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.DURATION_OBSERVATION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.DURATION_OBSERVATION__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.DURATION_OBSERVATION__EVENT :
-				return !getEvents().isEmpty();
-			case UMLPackage.DURATION_OBSERVATION__FIRST_EVENT :
-				return !getFirstEvents().isEmpty();
+		case UMLPackage.DURATION_OBSERVATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.DURATION_OBSERVATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.DURATION_OBSERVATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.DURATION_OBSERVATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.DURATION_OBSERVATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.DURATION_OBSERVATION__NAME:
+			return isSetName();
+		case UMLPackage.DURATION_OBSERVATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.DURATION_OBSERVATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.DURATION_OBSERVATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.DURATION_OBSERVATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.DURATION_OBSERVATION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.DURATION_OBSERVATION__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.DURATION_OBSERVATION__EVENT:
+			return !getEvents().isEmpty();
+		case UMLPackage.DURATION_OBSERVATION__FIRST_EVENT:
+			return !getFirstEvents().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -326,138 +315,118 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.DURATION_OBSERVATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_OBSERVATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_OBSERVATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.DURATION_OBSERVATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.DURATION_OBSERVATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.DURATION_OBSERVATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.DURATION_OBSERVATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DURATION_OBSERVATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.DURATION_OBSERVATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.DURATION_OBSERVATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.DURATION_OBSERVATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.DURATION_OBSERVATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.DURATION_OBSERVATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.DURATION_OBSERVATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.DURATION_OBSERVATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DURATION_OBSERVATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.DURATION_OBSERVATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.DURATION_OBSERVATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.DURATION_OBSERVATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.DURATION_OBSERVATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_OBSERVATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_OBSERVATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_OBSERVATION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.DURATION_OBSERVATION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.DURATION_OBSERVATION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.DURATION_OBSERVATION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.DURATION_OBSERVATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.DURATION_OBSERVATION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.DURATION_OBSERVATION___SEPARATOR :
-				return separator();
-			case UMLPackage.DURATION_OBSERVATION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.DURATION_OBSERVATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.DURATION_OBSERVATION___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.DURATION_OBSERVATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.DURATION_OBSERVATION___VALIDATE_FIRST_EVENT_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateFirstEventMultiplicity(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_OBSERVATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_OBSERVATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_OBSERVATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.DURATION_OBSERVATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.DURATION_OBSERVATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.DURATION_OBSERVATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.DURATION_OBSERVATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DURATION_OBSERVATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.DURATION_OBSERVATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.DURATION_OBSERVATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.DURATION_OBSERVATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.DURATION_OBSERVATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.DURATION_OBSERVATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.DURATION_OBSERVATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.DURATION_OBSERVATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DURATION_OBSERVATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.DURATION_OBSERVATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.DURATION_OBSERVATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.DURATION_OBSERVATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.DURATION_OBSERVATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_OBSERVATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_OBSERVATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_OBSERVATION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.DURATION_OBSERVATION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.DURATION_OBSERVATION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.DURATION_OBSERVATION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.DURATION_OBSERVATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.DURATION_OBSERVATION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.DURATION_OBSERVATION___SEPARATOR:
+			return separator();
+		case UMLPackage.DURATION_OBSERVATION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.DURATION_OBSERVATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.DURATION_OBSERVATION___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.DURATION_OBSERVATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.DURATION_OBSERVATION___VALIDATE_FIRST_EVENT_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateFirstEventMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ElementImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ElementImpl.java
index 01c273e..23ca989 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ElementImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ElementImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181, 335125
+ *   Kenn Hussey - 286329, 323181, 335125, 541314, 535301
  *   Kenn Hussey (CEA) - 327039, 424895, 451350, 485756
  *
  */
@@ -31,9 +31,11 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.EModelElementImpl;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
@@ -115,19 +117,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.ELEMENT__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ELEMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.ELEMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ELEMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -137,9 +133,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Comment> getOwnedComments() {
-		return (EList<Comment>) eDynamicGet(
-			UMLPackage.ELEMENT__OWNED_COMMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ELEMENT__OWNED_COMMENT, true, true);
+		return (EList<Comment>) eDynamicGet(UMLPackage.ELEMENT__OWNED_COMMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ELEMENT__OWNED_COMMENT, true, true);
 	}
 
 	/**
@@ -182,12 +176,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<EObject> result = (EList<EObject>) cache.get(this,
-				UMLPackage.Literals.ELEMENT___GET_STEREOTYPE_APPLICATIONS);
+			EList<EObject> result = (EList<EObject>) cache.get(this, UMLPackage.Literals.ELEMENT___GET_STEREOTYPE_APPLICATIONS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.ELEMENT___GET_STEREOTYPE_APPLICATIONS,
-					result = ElementOperations.getStereotypeApplications(this));
+				cache.put(this, UMLPackage.Literals.ELEMENT___GET_STEREOTYPE_APPLICATIONS, result = ElementOperations.getStereotypeApplications(this));
 			}
 			return result;
 		}
@@ -212,12 +203,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Stereotype> result = (EList<Stereotype>) cache.get(this,
-				UMLPackage.Literals.ELEMENT___GET_REQUIRED_STEREOTYPES);
+			EList<Stereotype> result = (EList<Stereotype>) cache.get(this, UMLPackage.Literals.ELEMENT___GET_REQUIRED_STEREOTYPES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.ELEMENT___GET_REQUIRED_STEREOTYPES,
-					result = ElementOperations.getRequiredStereotypes(this));
+				cache.put(this, UMLPackage.Literals.ELEMENT___GET_REQUIRED_STEREOTYPES, result = ElementOperations.getRequiredStereotypes(this));
 			}
 			return result;
 		}
@@ -242,12 +230,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Stereotype> result = (EList<Stereotype>) cache.get(this,
-				UMLPackage.Literals.ELEMENT___GET_APPLIED_STEREOTYPES);
+			EList<Stereotype> result = (EList<Stereotype>) cache.get(this, UMLPackage.Literals.ELEMENT___GET_APPLIED_STEREOTYPES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.ELEMENT___GET_APPLIED_STEREOTYPES,
-					result = ElementOperations.getAppliedStereotypes(this));
+				cache.put(this, UMLPackage.Literals.ELEMENT___GET_APPLIED_STEREOTYPES, result = ElementOperations.getAppliedStereotypes(this));
 			}
 			return result;
 		}
@@ -279,8 +264,7 @@
 	 */
 	public Stereotype getAppliedSubstereotype(Stereotype stereotype,
 			String qualifiedName) {
-		return ElementOperations.getAppliedSubstereotype(this, stereotype,
-			qualifiedName);
+		return ElementOperations.getAppliedSubstereotype(this, stereotype, qualifiedName);
 	}
 
 	/**
@@ -329,11 +313,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Relationship> result = (EList<Relationship>) cache.get(this,
-				UMLPackage.Literals.ELEMENT___GET_RELATIONSHIPS);
+			EList<Relationship> result = (EList<Relationship>) cache.get(this, UMLPackage.Literals.ELEMENT___GET_RELATIONSHIPS);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.ELEMENT___GET_RELATIONSHIPS,
-					result = ElementOperations.getRelationships(this));
+				cache.put(this, UMLPackage.Literals.ELEMENT___GET_RELATIONSHIPS, result = ElementOperations.getRelationships(this));
 			}
 			return result;
 		}
@@ -358,14 +340,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<DirectedRelationship> result = (EList<DirectedRelationship>) cache
-				.get(this,
-					UMLPackage.Literals.ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS);
+			EList<DirectedRelationship> result = (EList<DirectedRelationship>) cache.get(this, UMLPackage.Literals.ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS,
-					result = ElementOperations
-						.getSourceDirectedRelationships(this));
+				cache.put(this, UMLPackage.Literals.ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS, result = ElementOperations.getSourceDirectedRelationships(this));
 			}
 			return result;
 		}
@@ -391,14 +368,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<DirectedRelationship> result = (EList<DirectedRelationship>) cache
-				.get(this,
-					UMLPackage.Literals.ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS);
+			EList<DirectedRelationship> result = (EList<DirectedRelationship>) cache.get(this, UMLPackage.Literals.ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS,
-					result = ElementOperations
-						.getTargetDirectedRelationships(this));
+				cache.put(this, UMLPackage.Literals.ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS, result = ElementOperations.getTargetDirectedRelationships(this));
 			}
 			return result;
 		}
@@ -424,12 +396,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<String> result = (EList<String>) cache.get(eResource(), this,
-				UMLPackage.Literals.ELEMENT___GET_KEYWORDS);
+			EList<String> result = (EList<String>) cache.get(eResource(), this, UMLPackage.Literals.ELEMENT___GET_KEYWORDS);
 			if (result == null) {
-				cache.put(eResource(), this,
-					UMLPackage.Literals.ELEMENT___GET_KEYWORDS,
-					result = ElementOperations.getKeywords(this));
+				cache.put(eResource(), this, UMLPackage.Literals.ELEMENT___GET_KEYWORDS, result = ElementOperations.getKeywords(this));
 			}
 			return result;
 		}
@@ -526,12 +495,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Stereotype> result = (EList<Stereotype>) cache.get(this,
-				UMLPackage.Literals.ELEMENT___GET_APPLICABLE_STEREOTYPES);
+			EList<Stereotype> result = (EList<Stereotype>) cache.get(this, UMLPackage.Literals.ELEMENT___GET_APPLICABLE_STEREOTYPES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.ELEMENT___GET_APPLICABLE_STEREOTYPES,
-					result = ElementOperations.getApplicableStereotypes(this));
+				cache.put(this, UMLPackage.Literals.ELEMENT___GET_APPLICABLE_STEREOTYPES, result = ElementOperations.getApplicableStereotypes(this));
 			}
 			return result;
 		}
@@ -574,12 +540,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Element> result = (EList<Element>) cache.get(this,
-				UMLPackage.Literals.ELEMENT___ALL_OWNED_ELEMENTS);
+			EList<Element> result = (EList<Element>) cache.get(this, UMLPackage.Literals.ELEMENT___ALL_OWNED_ELEMENTS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.ELEMENT___ALL_OWNED_ELEMENTS,
-					result = ElementOperations.allOwnedElements(this));
+				cache.put(this, UMLPackage.Literals.ELEMENT___ALL_OWNED_ELEMENTS, result = ElementOperations.allOwnedElements(this));
 			}
 			return result;
 		}
@@ -604,12 +567,10 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ELEMENT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ELEMENT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.ELEMENT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ELEMENT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -622,16 +583,16 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ELEMENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ELEMENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ELEMENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ELEMENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
+		case UMLPackage.ELEMENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ELEMENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ELEMENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ELEMENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -645,16 +606,14 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
+		case UMLPackage.ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -667,12 +626,12 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
+		case UMLPackage.ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -685,14 +644,14 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ELEMENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ELEMENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ELEMENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ELEMENT__OWNER :
-				return isSetOwner();
+		case UMLPackage.ELEMENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ELEMENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ELEMENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ELEMENT__OWNER:
+			return isSetOwner();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -707,90 +666,82 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ELEMENT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ELEMENT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ELEMENT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ELEMENT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ELEMENT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ELEMENT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ELEMENT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ELEMENT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ELEMENT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ELEMENT___GET_MODEL :
-				return getModel();
-			case UMLPackage.ELEMENT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ELEMENT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ELEMENT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ELEMENT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ELEMENT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ELEMENT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ELEMENT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ELEMENT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ELEMENT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ELEMENT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ELEMENT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ELEMENT___MUST_BE_OWNED :
-				return mustBeOwned();
+		case UMLPackage.ELEMENT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ELEMENT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ELEMENT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ELEMENT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ELEMENT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ELEMENT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ELEMENT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ELEMENT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ELEMENT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ELEMENT___GET_MODEL:
+			return getModel();
+		case UMLPackage.ELEMENT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ELEMENT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ELEMENT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ELEMENT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ELEMENT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ELEMENT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ELEMENT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ELEMENT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ELEMENT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ELEMENT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ELEMENT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ELEMENT___MUST_BE_OWNED:
+			return mustBeOwned();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -812,9 +763,8 @@
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @return The cache adapter for this '<em><b>Element</b></em>'.
-	 * @generated NOT
+	 * @generated
 	 */
-	@Override
 	protected CacheAdapter getCacheAdapter() {
 		return CacheAdapter.getInstance();
 	}
@@ -827,8 +777,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.ELEMENT__OWNED_COMMENT};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.ELEMENT__OWNED_COMMENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -851,8 +800,8 @@
 	public Element basicGetOwner() {
 		InternalEObject eInternalContainer = eInternalContainer();
 		return eInternalContainer instanceof Element
-			? (Element) eInternalContainer
-			: basicGetOwnerGen();
+				? (Element) eInternalContainer
+				: basicGetOwnerGen();
 	}
 
 	/**
@@ -862,9 +811,7 @@
 	 */
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -887,8 +834,8 @@
 
 		try {
 			changeDescriptionClass = CommonPlugin.loadClass(
-				"org.eclipse.emf.ecore.change", //$NON-NLS-1$
-				"org.eclipse.emf.ecore.change.ChangeDescription"); //$NON-NLS-1$
+					"org.eclipse.emf.ecore.change", //$NON-NLS-1$
+					"org.eclipse.emf.ecore.change.ChangeDescription"); //$NON-NLS-1$
 		} catch (Throwable throwable) {
 			// ignore
 		}
@@ -901,8 +848,8 @@
 			int newContainerFeatureID, NotificationChain msgs) {
 
 		if (eDirectResource() != null && newContainer != null
-			&& eContainmentFeature(this, newContainer,
-				newContainerFeatureID) == null) {
+				&& eContainmentFeature(this, newContainer,
+						newContainerFeatureID) == null) {
 
 			InternalEObject oldContainer = eInternalContainer();
 			int oldContainerFeatureID = eContainerFeatureID();
@@ -912,11 +859,11 @@
 			if (eNotificationRequired()) {
 
 				if (oldContainer != null && oldContainerFeatureID >= 0
-					&& oldContainerFeatureID != newContainerFeatureID) {
+						&& oldContainerFeatureID != newContainerFeatureID) {
 
 					ENotificationImpl notification = new ENotificationImpl(this,
-						Notification.SET, oldContainerFeatureID, oldContainer,
-						null);
+							Notification.SET, oldContainerFeatureID, oldContainer,
+							null);
 
 					if (msgs == null) {
 						msgs = notification;
@@ -926,11 +873,11 @@
 				}
 				if (newContainerFeatureID >= 0) {
 					ENotificationImpl notification = new ENotificationImpl(this,
-						Notification.SET, newContainerFeatureID,
-						oldContainerFeatureID == newContainerFeatureID
-							? oldContainer
-							: null,
-						newContainer);
+							Notification.SET, newContainerFeatureID,
+							oldContainerFeatureID == newContainerFeatureID
+									? oldContainer
+									: null,
+							newContainer);
 
 					if (msgs == null) {
 						msgs = notification;
@@ -941,17 +888,17 @@
 			}
 		} else {
 			msgs = super.eBasicSetContainer(newContainer, newContainerFeatureID,
-				msgs);
+					msgs);
 		}
 
 		if (newContainer != null && (CHANGE_DESCRIPTION_CLASS == null
-			|| !(CHANGE_DESCRIPTION_CLASS.isInstance(newContainer)))) {
+				|| !(CHANGE_DESCRIPTION_CLASS.isInstance(newContainer)))) {
 
 			Resource.Internal eInternalResource = eInternalResource();
 
 			if (eInternalResource == null || !eInternalResource.isLoading()) {
 				ElementOperations.unapplyAllNonApplicableStereotypes(this,
-					false);
+						false);
 				ElementOperations.applyAllRequiredStereotypes(this, false);
 			}
 		}
@@ -965,7 +912,7 @@
 	public EList<Adapter> eAdapters() {
 
 		if (!adapting && !eBasicHasAdapters()) {
-			adapting = true;
+			adapting = true; org.eclipse.emf.spi.cdo.InternalCDOView view = cdoView(); if (view != null && !view.isClosed()) {
 
 			CacheAdapter cacheAdapter = getCacheAdapter();
 
@@ -973,7 +920,7 @@
 				cacheAdapter.adapt(this);
 			}
 
-			adapting = false;
+			adapting = false; }
 		}
 
 		return super.eAdapters();
@@ -996,8 +943,8 @@
 	@Override
 	public boolean eNotificationRequired() {
 		return getCacheAdapter() == null
-			? super.eNotificationRequired()
-			: eDeliver();
+				? super.eNotificationRequired()
+				: eDeliver();
 	}
 
 	@Override
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ElementImportImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ElementImportImpl.java
index 1f1958d..8568c6f 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ElementImportImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ElementImportImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,8 +29,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -119,19 +123,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> targets = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			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>(
-						Element.class, this, UMLPackage.ELEMENT_IMPORT__TARGET,
-						TARGET_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET, targets = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ELEMENT_IMPORT__TARGET, TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.ELEMENT_IMPORT__TARGET, TARGET_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ELEMENT_IMPORT__TARGET, TARGET_ESUBSETS);
 	}
 
 	/**
@@ -145,19 +143,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> sources = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			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>(
-						Element.class, this, UMLPackage.ELEMENT_IMPORT__SOURCE,
-						SOURCE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE, sources = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ELEMENT_IMPORT__SOURCE, SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.ELEMENT_IMPORT__SOURCE, SOURCE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.ELEMENT_IMPORT__SOURCE, SOURCE_ESUBSETS);
 	}
 
 	/**
@@ -166,9 +158,7 @@
 	 * @generated
 	 */
 	public VisibilityKind getVisibility() {
-		return (VisibilityKind) eDynamicGet(
-			UMLPackage.ELEMENT_IMPORT__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ELEMENT_IMPORT__VISIBILITY, true, true);
+		return (VisibilityKind) eDynamicGet(UMLPackage.ELEMENT_IMPORT__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ELEMENT_IMPORT__VISIBILITY, true, true);
 	}
 
 	/**
@@ -177,9 +167,7 @@
 	 * @generated
 	 */
 	public void setVisibility(VisibilityKind newVisibility) {
-		eDynamicSet(
-			UMLPackage.ELEMENT_IMPORT__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ELEMENT_IMPORT__VISIBILITY, newVisibility);
+		eDynamicSet(UMLPackage.ELEMENT_IMPORT__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ELEMENT_IMPORT__VISIBILITY, newVisibility);
 	}
 
 	/**
@@ -188,9 +176,7 @@
 	 * @generated
 	 */
 	public String getAlias() {
-		return (String) eDynamicGet(
-			UMLPackage.ELEMENT_IMPORT__ALIAS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ELEMENT_IMPORT__ALIAS, true, true);
+		return (String) eDynamicGet(UMLPackage.ELEMENT_IMPORT__ALIAS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ELEMENT_IMPORT__ALIAS, true, true);
 	}
 
 	/**
@@ -199,8 +185,7 @@
 	 * @generated
 	 */
 	public void setAlias(String newAlias) {
-		eDynamicSet(UMLPackage.ELEMENT_IMPORT__ALIAS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ELEMENT_IMPORT__ALIAS, newAlias);
+		eDynamicSet(UMLPackage.ELEMENT_IMPORT__ALIAS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ELEMENT_IMPORT__ALIAS, newAlias);
 	}
 
 	/**
@@ -209,8 +194,7 @@
 	 * @generated
 	 */
 	public void unsetAlias() {
-		eDynamicUnset(UMLPackage.ELEMENT_IMPORT__ALIAS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ELEMENT_IMPORT__ALIAS);
+		eDynamicUnset(UMLPackage.ELEMENT_IMPORT__ALIAS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ELEMENT_IMPORT__ALIAS);
 	}
 
 	/**
@@ -219,9 +203,7 @@
 	 * @generated
 	 */
 	public boolean isSetAlias() {
-		return eDynamicIsSet(
-			UMLPackage.ELEMENT_IMPORT__ALIAS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ELEMENT_IMPORT__ALIAS);
+		return eDynamicIsSet(UMLPackage.ELEMENT_IMPORT__ALIAS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ELEMENT_IMPORT__ALIAS);
 	}
 
 	/**
@@ -230,9 +212,7 @@
 	 * @generated
 	 */
 	public PackageableElement getImportedElement() {
-		return (PackageableElement) eDynamicGet(
-			UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ELEMENT_IMPORT__IMPORTED_ELEMENT, true, true);
+		return (PackageableElement) eDynamicGet(UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ELEMENT_IMPORT__IMPORTED_ELEMENT, true, true);
 	}
 
 	/**
@@ -241,9 +221,7 @@
 	 * @generated
 	 */
 	public PackageableElement basicGetImportedElement() {
-		return (PackageableElement) eDynamicGet(
-			UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ELEMENT_IMPORT__IMPORTED_ELEMENT, false, true);
+		return (PackageableElement) eDynamicGet(UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ELEMENT_IMPORT__IMPORTED_ELEMENT, false, true);
 	}
 
 	/**
@@ -252,10 +230,7 @@
 	 * @generated
 	 */
 	public void setImportedElement(PackageableElement newImportedElement) {
-		eDynamicSet(
-			UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ELEMENT_IMPORT__IMPORTED_ELEMENT,
-			newImportedElement);
+		eDynamicSet(UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ELEMENT_IMPORT__IMPORTED_ELEMENT, newImportedElement);
 	}
 
 	/**
@@ -264,11 +239,7 @@
 	 * @generated
 	 */
 	public Namespace getImportingNamespace() {
-		return (Namespace) eDynamicGet(
-			UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ELEMENT_IMPORT__IMPORTING_NAMESPACE, true,
-			true);
+		return (Namespace) eDynamicGet(UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ELEMENT_IMPORT__IMPORTING_NAMESPACE, true, true);
 	}
 
 	/**
@@ -277,11 +248,7 @@
 	 * @generated
 	 */
 	public Namespace basicGetImportingNamespace() {
-		return (Namespace) eDynamicGet(
-			UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ELEMENT_IMPORT__IMPORTING_NAMESPACE, false,
-			true);
+		return (Namespace) eDynamicGet(UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ELEMENT_IMPORT__IMPORTING_NAMESPACE, false, true);
 	}
 
 	/**
@@ -291,8 +258,7 @@
 	 */
 	public NotificationChain basicSetImportingNamespace(
 			Namespace newImportingNamespace, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newImportingNamespace,
-			UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newImportingNamespace, UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE, msgs);
 		return msgs;
 	}
 
@@ -302,11 +268,7 @@
 	 * @generated
 	 */
 	public void setImportingNamespace(Namespace newImportingNamespace) {
-		eDynamicSet(
-			UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ELEMENT_IMPORT__IMPORTING_NAMESPACE,
-			newImportingNamespace);
+		eDynamicSet(UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ELEMENT_IMPORT__IMPORTING_NAMESPACE, newImportingNamespace);
 	}
 
 	/**
@@ -316,8 +278,7 @@
 	 */
 	public boolean validateVisibilityPublicOrPrivate(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return ElementImportOperations.validateVisibilityPublicOrPrivate(this,
-			diagnostics, context);
+		return ElementImportOperations.validateVisibilityPublicOrPrivate(this, diagnostics, context);
 	}
 
 	/**
@@ -327,8 +288,7 @@
 	 */
 	public boolean validateImportedElementIsPublic(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ElementImportOperations.validateImportedElementIsPublic(this,
-			diagnostics, context);
+		return ElementImportOperations.validateImportedElementIsPublic(this, diagnostics, context);
 	}
 
 	/**
@@ -350,13 +310,12 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetImportingNamespace((Namespace) otherEnd, msgs);
+		case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetImportingNamespace((Namespace) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -370,14 +329,12 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ELEMENT_IMPORT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE :
-				return basicSetImportingNamespace(null, msgs);
+		case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ELEMENT_IMPORT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE:
+			return basicSetImportingNamespace(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -391,10 +348,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.NAMESPACE__ELEMENT_IMPORT, Namespace.class,
-					msgs);
+		case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.NAMESPACE__ELEMENT_IMPORT, Namespace.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -407,34 +362,34 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ELEMENT_IMPORT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ELEMENT_IMPORT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ELEMENT_IMPORT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ELEMENT_IMPORT__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.ELEMENT_IMPORT__SOURCE :
-				return getSources();
-			case UMLPackage.ELEMENT_IMPORT__TARGET :
-				return getTargets();
-			case UMLPackage.ELEMENT_IMPORT__ALIAS :
-				return getAlias();
-			case UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT :
-				if (resolve)
-					return getImportedElement();
-				return basicGetImportedElement();
-			case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE :
-				if (resolve)
-					return getImportingNamespace();
-				return basicGetImportingNamespace();
-			case UMLPackage.ELEMENT_IMPORT__VISIBILITY :
-				return getVisibility();
+		case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ELEMENT_IMPORT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ELEMENT_IMPORT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ELEMENT_IMPORT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ELEMENT_IMPORT__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.ELEMENT_IMPORT__SOURCE:
+			return getSources();
+		case UMLPackage.ELEMENT_IMPORT__TARGET:
+			return getTargets();
+		case UMLPackage.ELEMENT_IMPORT__ALIAS:
+			return getAlias();
+		case UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT:
+			if (resolve)
+				return getImportedElement();
+			return basicGetImportedElement();
+		case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE:
+			if (resolve)
+				return getImportingNamespace();
+			return basicGetImportingNamespace();
+		case UMLPackage.ELEMENT_IMPORT__VISIBILITY:
+			return getVisibility();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -448,28 +403,26 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ELEMENT_IMPORT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ELEMENT_IMPORT__ALIAS :
-				setAlias((String) newValue);
-				return;
-			case UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT :
-				setImportedElement((PackageableElement) newValue);
-				return;
-			case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE :
-				setImportingNamespace((Namespace) newValue);
-				return;
-			case UMLPackage.ELEMENT_IMPORT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
+		case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ELEMENT_IMPORT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ELEMENT_IMPORT__ALIAS:
+			setAlias((String) newValue);
+			return;
+		case UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT:
+			setImportedElement((PackageableElement) newValue);
+			return;
+		case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE:
+			setImportingNamespace((Namespace) newValue);
+			return;
+		case UMLPackage.ELEMENT_IMPORT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -482,24 +435,24 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ELEMENT_IMPORT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ELEMENT_IMPORT__ALIAS :
-				unsetAlias();
-				return;
-			case UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT :
-				setImportedElement((PackageableElement) null);
-				return;
-			case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE :
-				setImportingNamespace((Namespace) null);
-				return;
-			case UMLPackage.ELEMENT_IMPORT__VISIBILITY :
-				setVisibility(VISIBILITY_EDEFAULT);
-				return;
+		case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ELEMENT_IMPORT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ELEMENT_IMPORT__ALIAS:
+			unsetAlias();
+			return;
+		case UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT:
+			setImportedElement((PackageableElement) null);
+			return;
+		case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE:
+			setImportingNamespace((Namespace) null);
+			return;
+		case UMLPackage.ELEMENT_IMPORT__VISIBILITY:
+			setVisibility(VISIBILITY_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -512,28 +465,28 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ELEMENT_IMPORT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ELEMENT_IMPORT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ELEMENT_IMPORT__OWNER :
-				return isSetOwner();
-			case UMLPackage.ELEMENT_IMPORT__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.ELEMENT_IMPORT__SOURCE :
-				return isSetSources();
-			case UMLPackage.ELEMENT_IMPORT__TARGET :
-				return isSetTargets();
-			case UMLPackage.ELEMENT_IMPORT__ALIAS :
-				return isSetAlias();
-			case UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT :
-				return basicGetImportedElement() != null;
-			case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE :
-				return basicGetImportingNamespace() != null;
-			case UMLPackage.ELEMENT_IMPORT__VISIBILITY :
-				return getVisibility() != VISIBILITY_EDEFAULT;
+		case UMLPackage.ELEMENT_IMPORT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ELEMENT_IMPORT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ELEMENT_IMPORT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ELEMENT_IMPORT__OWNER:
+			return isSetOwner();
+		case UMLPackage.ELEMENT_IMPORT__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.ELEMENT_IMPORT__SOURCE:
+			return isSetSources();
+		case UMLPackage.ELEMENT_IMPORT__TARGET:
+			return isSetTargets();
+		case UMLPackage.ELEMENT_IMPORT__ALIAS:
+			return isSetAlias();
+		case UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT:
+			return basicGetImportedElement() != null;
+		case UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE:
+			return basicGetImportingNamespace() != null;
+		case UMLPackage.ELEMENT_IMPORT__VISIBILITY:
+			return getVisibility() != VISIBILITY_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -548,100 +501,88 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ELEMENT_IMPORT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ELEMENT_IMPORT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ELEMENT_IMPORT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ELEMENT_IMPORT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ELEMENT_IMPORT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ELEMENT_IMPORT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ELEMENT_IMPORT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ELEMENT_IMPORT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___GET_MODEL :
-				return getModel();
-			case UMLPackage.ELEMENT_IMPORT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ELEMENT_IMPORT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ELEMENT_IMPORT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ELEMENT_IMPORT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ELEMENT_IMPORT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ELEMENT_IMPORT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ELEMENT_IMPORT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ELEMENT_IMPORT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ELEMENT_IMPORT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ELEMENT_IMPORT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ELEMENT_IMPORT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ELEMENT_IMPORT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ELEMENT_IMPORT___VALIDATE_IMPORTED_ELEMENT_IS_PUBLIC__DIAGNOSTICCHAIN_MAP :
-				return validateImportedElementIsPublic(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ELEMENT_IMPORT___VALIDATE_VISIBILITY_PUBLIC_OR_PRIVATE__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityPublicOrPrivate(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ELEMENT_IMPORT___GET_NAME :
-				return getName();
+		case UMLPackage.ELEMENT_IMPORT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ELEMENT_IMPORT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ELEMENT_IMPORT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ELEMENT_IMPORT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ELEMENT_IMPORT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ELEMENT_IMPORT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ELEMENT_IMPORT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ELEMENT_IMPORT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___GET_MODEL:
+			return getModel();
+		case UMLPackage.ELEMENT_IMPORT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ELEMENT_IMPORT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ELEMENT_IMPORT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ELEMENT_IMPORT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ELEMENT_IMPORT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ELEMENT_IMPORT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ELEMENT_IMPORT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ELEMENT_IMPORT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ELEMENT_IMPORT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ELEMENT_IMPORT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ELEMENT_IMPORT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ELEMENT_IMPORT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ELEMENT_IMPORT___VALIDATE_IMPORTED_ELEMENT_IS_PUBLIC__DIAGNOSTICCHAIN_MAP:
+			return validateImportedElementIsPublic((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ELEMENT_IMPORT___VALIDATE_VISIBILITY_PUBLIC_OR_PRIVATE__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityPublicOrPrivate((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ELEMENT_IMPORT___GET_NAME:
+			return getName();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -654,8 +595,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] TARGET_ESUBSETS = new int[]{
-		UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT};
+	protected static final int[] TARGET_ESUBSETS = new int[] { UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -665,7 +605,7 @@
 	@Override
 	public boolean isSetTargets() {
 		return super.isSetTargets()
-			|| eIsSet(UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT);
+				|| eIsSet(UMLPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT);
 	}
 
 	/**
@@ -676,8 +616,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SOURCE_ESUBSETS = new int[]{
-		UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE};
+	protected static final int[] SOURCE_ESUBSETS = new int[] { UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -687,9 +626,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -700,7 +637,7 @@
 	@Override
 	public boolean isSetSources() {
 		return super.isSetSources()
-			|| eIsSet(UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE);
+				|| eIsSet(UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE);
 	}
 
 	/**
@@ -725,7 +662,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE);
+				|| eIsSet(UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE);
 	}
 
 } //ElementImportImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EncapsulatedClassifierImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EncapsulatedClassifierImpl.java
index deaf4be..8e4e24f 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EncapsulatedClassifierImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EncapsulatedClassifierImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -22,6 +23,7 @@
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Classifier;
@@ -76,8 +78,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_PORT_ESUPERSETS = new int[]{
-		UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE};
+	protected static final int[] OWNED_PORT_ESUPERSETS = new int[] { UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -124,11 +125,7 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Property> getOwnedAttributes() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE, true,
-			true);
+		return (EList<Property>) eDynamicGet(UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE, true, true);
 	}
 
 	/**
@@ -142,19 +139,19 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<Port> ownedPorts = (EList<Port>) cache.get(eResource, this,
-				UMLPackage.Literals.ENCAPSULATED_CLASSIFIER__OWNED_PORT);
+					UMLPackage.Literals.ENCAPSULATED_CLASSIFIER__OWNED_PORT);
 			if (ownedPorts == null) {
 				cache.put(eResource, this,
-					UMLPackage.Literals.ENCAPSULATED_CLASSIFIER__OWNED_PORT,
-					ownedPorts = new DerivedSubsetEObjectEList<Port>(Port.class,
-						this, UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_PORT,
-						OWNED_PORT_ESUPERSETS));
+						UMLPackage.Literals.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>(Port.class, this,
-			UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_PORT,
-			OWNED_PORT_ESUPERSETS);
+				UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_PORT,
+				OWNED_PORT_ESUPERSETS);
 	}
 
 	/**
@@ -179,18 +176,18 @@
 	 */
 	public Port getOwnedPort(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedPortLoop : for (Port ownedPort : getOwnedPorts()) {
+		ownedPortLoop: for (Port ownedPort : getOwnedPorts()) {
 			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedPort.getName())
-				: name.equals(ownedPort.getName())))
+					? name.equalsIgnoreCase(ownedPort.getName())
+					: name.equals(ownedPort.getName())))
 				continue ownedPortLoop;
 			if (type != null && !type.equals(ownedPort.getType()))
 				continue ownedPortLoop;
 			return ownedPort;
 		}
 		return createOnDemand
-			? createOwnedPort(name, type)
-			: null;
+				? createOwnedPort(name, type)
+				: null;
 	}
 
 	/**
@@ -202,56 +199,42 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_CONNECTOR :
-				return ((InternalEList<?>) getOwnedConnectors())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_CONNECTOR:
+			return ((InternalEList<?>) getOwnedConnectors()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -264,108 +247,108 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME :
-				return getName();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__MEMBER :
-				return getMembers();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__FEATURE :
-				return getFeatures();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERAL :
-				return getGenerals();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__USE_CASE :
-				return getUseCases();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_CONNECTOR :
-				return getOwnedConnectors();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__PART :
-				return getParts();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__ROLE :
-				return getRoles();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_PORT :
-				return getOwnedPorts();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME:
+			return getName();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__MEMBER:
+			return getMembers();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__FEATURE:
+			return getFeatures();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERAL:
+			return getGenerals();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__USE_CASE:
+			return getUseCases();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_CONNECTOR:
+			return getOwnedConnectors();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__PART:
+			return getParts();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__ROLE:
+			return getRoles();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_PORT:
+			return getOwnedPorts();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -379,118 +362,103 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				getOwnedConnectors()
-					.addAll((Collection<? extends Connector>) newValue);
-				return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			getOwnedConnectors().addAll((Collection<? extends Connector>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -503,87 +471,87 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -596,94 +564,92 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNER :
-				return isSetOwner();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME :
-				return isSetName();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__MEMBER :
-				return isSetMembers();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERAL :
-				return !getGenerals().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE :
-				return !getOwnedAttributes().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_CONNECTOR :
-				return !getOwnedConnectors().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__PART :
-				return !getParts().isEmpty();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__ROLE :
-				return isSetRoles();
-			case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_PORT :
-				return !getOwnedPorts().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNER:
+			return isSetOwner();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME:
+			return isSetName();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__MEMBER:
+			return isSetMembers();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERAL:
+			return !getGenerals().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_ATTRIBUTE:
+			return !getOwnedAttributes().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_CONNECTOR:
+			return !getOwnedConnectors().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__PART:
+			return !getParts().isEmpty();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__ROLE:
+			return isSetRoles();
+		case UMLPackage.ENCAPSULATED_CLASSIFIER__OWNED_PORT:
+			return !getOwnedPorts().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EnumerationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EnumerationImpl.java
index 867f654..9751a84 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EnumerationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EnumerationImpl.java
@@ -1,13 +1,14 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -26,6 +27,7 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -109,20 +111,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.ENUMERATION__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.ENUMERATION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.ENUMERATION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.ENUMERATION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -132,9 +127,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<EnumerationLiteral> getOwnedLiterals() {
-		return (EList<EnumerationLiteral>) eDynamicGet(
-			UMLPackage.ENUMERATION__OWNED_LITERAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ENUMERATION__OWNED_LITERAL, true, true);
+		return (EList<EnumerationLiteral>) eDynamicGet(UMLPackage.ENUMERATION__OWNED_LITERAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ENUMERATION__OWNED_LITERAL, true, true);
 	}
 
 	/**
@@ -143,8 +136,7 @@
 	 * @generated
 	 */
 	public EnumerationLiteral createOwnedLiteral(String name) {
-		EnumerationLiteral newOwnedLiteral = (EnumerationLiteral) create(
-			UMLPackage.Literals.ENUMERATION_LITERAL);
+		EnumerationLiteral newOwnedLiteral = (EnumerationLiteral) create(UMLPackage.Literals.ENUMERATION_LITERAL);
 		getOwnedLiterals().add(newOwnedLiteral);
 		if (name != null)
 			newOwnedLiteral.setName(name);
@@ -167,16 +159,12 @@
 	 */
 	public EnumerationLiteral getOwnedLiteral(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedLiteralLoop : for (EnumerationLiteral ownedLiteral : getOwnedLiterals()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedLiteral.getName())
-				: name.equals(ownedLiteral.getName())))
+		ownedLiteralLoop: for (EnumerationLiteral ownedLiteral : getOwnedLiterals()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedLiteral.getName()) : name.equals(ownedLiteral.getName())))
 				continue ownedLiteralLoop;
 			return ownedLiteral;
 		}
-		return createOnDemand
-			? createOwnedLiteral(name)
-			: null;
+		return createOnDemand ? createOwnedLiteral(name) : null;
 	}
 
 	/**
@@ -186,8 +174,7 @@
 	 */
 	public boolean validateImmutable(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return EnumerationOperations.validateImmutable(this, diagnostics,
-			context);
+		return EnumerationOperations.validateImmutable(this, diagnostics, context);
 	}
 
 	/**
@@ -200,65 +187,44 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ENUMERATION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.ENUMERATION__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.ENUMERATION__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.ENUMERATION__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__OWNED_ATTRIBUTE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedAttributes())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__OWNED_OPERATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__OWNED_LITERAL :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedLiterals())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.ENUMERATION__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.ENUMERATION__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.ENUMERATION__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__OWNED_ATTRIBUTE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedAttributes()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__OWNED_OPERATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__OWNED_LITERAL:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedLiterals()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -272,59 +238,44 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ENUMERATION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ENUMERATION__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.ENUMERATION__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.ENUMERATION__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__OWNED_OPERATION :
-				return ((InternalEList<?>) getOwnedOperations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENUMERATION__OWNED_LITERAL :
-				return ((InternalEList<?>) getOwnedLiterals())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ENUMERATION__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.ENUMERATION__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__OWNED_OPERATION:
+			return ((InternalEList<?>) getOwnedOperations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENUMERATION__OWNED_LITERAL:
+			return ((InternalEList<?>) getOwnedLiterals()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -337,104 +288,104 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ENUMERATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ENUMERATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ENUMERATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ENUMERATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ENUMERATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ENUMERATION__NAME :
-				return getName();
-			case UMLPackage.ENUMERATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ENUMERATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ENUMERATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ENUMERATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ENUMERATION__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.ENUMERATION__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.ENUMERATION__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.ENUMERATION__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.ENUMERATION__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.ENUMERATION__MEMBER :
-				return getMembers();
-			case UMLPackage.ENUMERATION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.ENUMERATION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.ENUMERATION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.ENUMERATION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.ENUMERATION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.ENUMERATION__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.ENUMERATION__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.ENUMERATION__FEATURE :
-				return getFeatures();
-			case UMLPackage.ENUMERATION__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.ENUMERATION__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.ENUMERATION__GENERAL :
-				return getGenerals();
-			case UMLPackage.ENUMERATION__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.ENUMERATION__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.ENUMERATION__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.ENUMERATION__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.ENUMERATION__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.ENUMERATION__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.ENUMERATION__USE_CASE :
-				return getUseCases();
-			case UMLPackage.ENUMERATION__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.ENUMERATION__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.ENUMERATION__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.ENUMERATION__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.ENUMERATION__OWNED_OPERATION :
-				return getOwnedOperations();
-			case UMLPackage.ENUMERATION__OWNED_LITERAL :
-				return getOwnedLiterals();
+		case UMLPackage.ENUMERATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ENUMERATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ENUMERATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ENUMERATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ENUMERATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ENUMERATION__NAME:
+			return getName();
+		case UMLPackage.ENUMERATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ENUMERATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ENUMERATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ENUMERATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ENUMERATION__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.ENUMERATION__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.ENUMERATION__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.ENUMERATION__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.ENUMERATION__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.ENUMERATION__MEMBER:
+			return getMembers();
+		case UMLPackage.ENUMERATION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.ENUMERATION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.ENUMERATION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.ENUMERATION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.ENUMERATION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.ENUMERATION__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.ENUMERATION__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.ENUMERATION__FEATURE:
+			return getFeatures();
+		case UMLPackage.ENUMERATION__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.ENUMERATION__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.ENUMERATION__GENERAL:
+			return getGenerals();
+		case UMLPackage.ENUMERATION__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.ENUMERATION__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.ENUMERATION__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.ENUMERATION__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.ENUMERATION__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.ENUMERATION__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.ENUMERATION__USE_CASE:
+			return getUseCases();
+		case UMLPackage.ENUMERATION__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.ENUMERATION__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.ENUMERATION__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.ENUMERATION__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.ENUMERATION__OWNED_OPERATION:
+			return getOwnedOperations();
+		case UMLPackage.ENUMERATION__OWNED_LITERAL:
+			return getOwnedLiterals();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -448,123 +399,107 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ENUMERATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ENUMERATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ENUMERATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ENUMERATION__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.ENUMERATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ENUMERATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ENUMERATION__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.ENUMERATION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.ENUMERATION__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.ENUMERATION__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.ENUMERATION__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.ENUMERATION__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
-			case UMLPackage.ENUMERATION__OWNED_LITERAL :
-				getOwnedLiterals().clear();
-				getOwnedLiterals().addAll(
-					(Collection<? extends EnumerationLiteral>) newValue);
-				return;
+		case UMLPackage.ENUMERATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ENUMERATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ENUMERATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ENUMERATION__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.ENUMERATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ENUMERATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ENUMERATION__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.ENUMERATION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.ENUMERATION__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.ENUMERATION__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.ENUMERATION__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.ENUMERATION__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
+		case UMLPackage.ENUMERATION__OWNED_LITERAL:
+			getOwnedLiterals().clear();
+			getOwnedLiterals().addAll((Collection<? extends EnumerationLiteral>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -577,90 +512,90 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ENUMERATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ENUMERATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ENUMERATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ENUMERATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ENUMERATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ENUMERATION__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.ENUMERATION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.ENUMERATION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.ENUMERATION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.ENUMERATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ENUMERATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ENUMERATION__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.ENUMERATION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.ENUMERATION__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.ENUMERATION__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.ENUMERATION__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.ENUMERATION__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.ENUMERATION__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.ENUMERATION__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.ENUMERATION__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.ENUMERATION__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.ENUMERATION__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.ENUMERATION__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.ENUMERATION__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.ENUMERATION__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.ENUMERATION__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
-			case UMLPackage.ENUMERATION__OWNED_LITERAL :
-				getOwnedLiterals().clear();
-				return;
+		case UMLPackage.ENUMERATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ENUMERATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ENUMERATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ENUMERATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ENUMERATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ENUMERATION__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.ENUMERATION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.ENUMERATION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.ENUMERATION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.ENUMERATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ENUMERATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ENUMERATION__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.ENUMERATION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.ENUMERATION__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.ENUMERATION__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.ENUMERATION__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.ENUMERATION__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.ENUMERATION__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.ENUMERATION__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.ENUMERATION__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.ENUMERATION__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.ENUMERATION__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.ENUMERATION__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.ENUMERATION__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.ENUMERATION__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.ENUMERATION__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
+		case UMLPackage.ENUMERATION__OWNED_LITERAL:
+			getOwnedLiterals().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -673,90 +608,88 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ENUMERATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ENUMERATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ENUMERATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ENUMERATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.ENUMERATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ENUMERATION__NAME :
-				return isSetName();
-			case UMLPackage.ENUMERATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ENUMERATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ENUMERATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ENUMERATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ENUMERATION__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.ENUMERATION__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.ENUMERATION__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.ENUMERATION__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.ENUMERATION__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.ENUMERATION__MEMBER :
-				return isSetMembers();
-			case UMLPackage.ENUMERATION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.ENUMERATION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.ENUMERATION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.ENUMERATION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.ENUMERATION__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.ENUMERATION__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.ENUMERATION__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.ENUMERATION__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.ENUMERATION__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.ENUMERATION__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.ENUMERATION__GENERAL :
-				return !getGenerals().isEmpty();
-			case UMLPackage.ENUMERATION__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.ENUMERATION__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.ENUMERATION__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.ENUMERATION__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.ENUMERATION__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.ENUMERATION__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.ENUMERATION__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.ENUMERATION__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.ENUMERATION__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.ENUMERATION__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.ENUMERATION__OWNED_ATTRIBUTE :
-				return !getOwnedAttributes().isEmpty();
-			case UMLPackage.ENUMERATION__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
-			case UMLPackage.ENUMERATION__OWNED_LITERAL :
-				return !getOwnedLiterals().isEmpty();
+		case UMLPackage.ENUMERATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ENUMERATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ENUMERATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ENUMERATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.ENUMERATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ENUMERATION__NAME:
+			return isSetName();
+		case UMLPackage.ENUMERATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ENUMERATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ENUMERATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ENUMERATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ENUMERATION__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.ENUMERATION__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.ENUMERATION__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.ENUMERATION__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.ENUMERATION__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.ENUMERATION__MEMBER:
+			return isSetMembers();
+		case UMLPackage.ENUMERATION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.ENUMERATION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.ENUMERATION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.ENUMERATION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.ENUMERATION__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.ENUMERATION__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.ENUMERATION__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.ENUMERATION__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.ENUMERATION__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.ENUMERATION__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.ENUMERATION__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.ENUMERATION__GENERAL:
+			return !getGenerals().isEmpty();
+		case UMLPackage.ENUMERATION__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.ENUMERATION__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.ENUMERATION__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.ENUMERATION__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.ENUMERATION__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.ENUMERATION__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.ENUMERATION__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.ENUMERATION__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.ENUMERATION__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.ENUMERATION__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.ENUMERATION__OWNED_ATTRIBUTE:
+			return !getOwnedAttributes().isEmpty();
+		case UMLPackage.ENUMERATION__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
+		case UMLPackage.ENUMERATION__OWNED_LITERAL:
+			return !getOwnedLiterals().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -771,283 +704,223 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ENUMERATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ENUMERATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ENUMERATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ENUMERATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ENUMERATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ENUMERATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ENUMERATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ENUMERATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ENUMERATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ENUMERATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ENUMERATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ENUMERATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ENUMERATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.ENUMERATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ENUMERATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ENUMERATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ENUMERATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ENUMERATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ENUMERATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ENUMERATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ENUMERATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ENUMERATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ENUMERATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ENUMERATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ENUMERATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ENUMERATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ENUMERATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ENUMERATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ENUMERATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ENUMERATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ENUMERATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ENUMERATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ENUMERATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ENUMERATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ENUMERATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ENUMERATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ENUMERATION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ENUMERATION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ENUMERATION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ENUMERATION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ENUMERATION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ENUMERATION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ENUMERATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ENUMERATION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ENUMERATION___SEPARATOR :
-				return separator();
-			case UMLPackage.ENUMERATION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ENUMERATION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.ENUMERATION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.ENUMERATION___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.ENUMERATION___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.ENUMERATION___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.ENUMERATION___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.ENUMERATION___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.ENUMERATION___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.ENUMERATION___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.ENUMERATION___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.ENUMERATION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.ENUMERATION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.ENUMERATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.ENUMERATION___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.ENUMERATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.ENUMERATION___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.ENUMERATION___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.ENUMERATION___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.ENUMERATION___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.ENUMERATION___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.ENUMERATION___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.ENUMERATION___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.ENUMERATION___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.ENUMERATION___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.ENUMERATION___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.ENUMERATION___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.ENUMERATION___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.ENUMERATION___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.ENUMERATION___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.ENUMERATION___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.ENUMERATION___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.ENUMERATION___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.ENUMERATION___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.ENUMERATION___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.ENUMERATION___PARENTS :
-				return parents();
-			case UMLPackage.ENUMERATION___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.ENUMERATION___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.ENUMERATION___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.ENUMERATION___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.ENUMERATION___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.ENUMERATION___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.ENUMERATION___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.ENUMERATION___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.ENUMERATION___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
-			case UMLPackage.ENUMERATION___VALIDATE_IMMUTABLE__DIAGNOSTICCHAIN_MAP :
-				return validateImmutable((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ENUMERATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ENUMERATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ENUMERATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ENUMERATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ENUMERATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ENUMERATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ENUMERATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ENUMERATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ENUMERATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ENUMERATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ENUMERATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ENUMERATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.ENUMERATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ENUMERATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ENUMERATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ENUMERATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ENUMERATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ENUMERATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ENUMERATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ENUMERATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ENUMERATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ENUMERATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ENUMERATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ENUMERATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ENUMERATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ENUMERATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ENUMERATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ENUMERATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ENUMERATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ENUMERATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ENUMERATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ENUMERATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ENUMERATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ENUMERATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ENUMERATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ENUMERATION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ENUMERATION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ENUMERATION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ENUMERATION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ENUMERATION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ENUMERATION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ENUMERATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ENUMERATION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ENUMERATION___SEPARATOR:
+			return separator();
+		case UMLPackage.ENUMERATION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ENUMERATION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.ENUMERATION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.ENUMERATION___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.ENUMERATION___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.ENUMERATION___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.ENUMERATION___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.ENUMERATION___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.ENUMERATION___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.ENUMERATION___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.ENUMERATION___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.ENUMERATION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.ENUMERATION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.ENUMERATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.ENUMERATION___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.ENUMERATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.ENUMERATION___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.ENUMERATION___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.ENUMERATION___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.ENUMERATION___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.ENUMERATION___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.ENUMERATION___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.ENUMERATION___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.ENUMERATION___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.ENUMERATION___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.ENUMERATION___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.ENUMERATION___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.ENUMERATION___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.ENUMERATION___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.ENUMERATION___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.ENUMERATION___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.ENUMERATION___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.ENUMERATION___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.ENUMERATION___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.ENUMERATION___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.ENUMERATION___PARENTS:
+			return parents();
+		case UMLPackage.ENUMERATION___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.ENUMERATION___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.ENUMERATION___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.ENUMERATION___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.ENUMERATION___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.ENUMERATION___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.ENUMERATION___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.ENUMERATION___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.ENUMERATION___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.ENUMERATION___VALIDATE_IMMUTABLE__DIAGNOSTICCHAIN_MAP:
+			return validateImmutable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1060,12 +933,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.ENUMERATION__OWNED_RULE,
-		UMLPackage.ENUMERATION__OWNED_USE_CASE,
-		UMLPackage.ENUMERATION__OWNED_ATTRIBUTE,
-		UMLPackage.ENUMERATION__OWNED_OPERATION,
-		UMLPackage.ENUMERATION__OWNED_LITERAL};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.ENUMERATION__OWNED_RULE, UMLPackage.ENUMERATION__OWNED_USE_CASE, UMLPackage.ENUMERATION__OWNED_ATTRIBUTE, UMLPackage.ENUMERATION__OWNED_OPERATION,
+			UMLPackage.ENUMERATION__OWNED_LITERAL };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1075,7 +944,7 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.ENUMERATION__OWNED_LITERAL);
+				|| eIsSet(UMLPackage.ENUMERATION__OWNED_LITERAL);
 	}
 
 } //EnumerationImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EnumerationLiteralImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EnumerationLiteralImpl.java
index a1b2ca6..8ba9a70 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EnumerationLiteralImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EnumerationLiteralImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -15,6 +16,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -23,6 +25,9 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -89,9 +94,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -100,9 +103,7 @@
 	 * @generated
 	 */
 	public Enumeration getEnumeration() {
-		return (Enumeration) eDynamicGet(
-			UMLPackage.ENUMERATION_LITERAL__ENUMERATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ENUMERATION_LITERAL__ENUMERATION, true, true);
+		return (Enumeration) eDynamicGet(UMLPackage.ENUMERATION_LITERAL__ENUMERATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ENUMERATION_LITERAL__ENUMERATION, true, true);
 	}
 
 	/**
@@ -111,9 +112,7 @@
 	 * @generated
 	 */
 	public Enumeration basicGetEnumeration() {
-		return (Enumeration) eDynamicGet(
-			UMLPackage.ENUMERATION_LITERAL__ENUMERATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ENUMERATION_LITERAL__ENUMERATION, false, true);
+		return (Enumeration) eDynamicGet(UMLPackage.ENUMERATION_LITERAL__ENUMERATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ENUMERATION_LITERAL__ENUMERATION, false, true);
 	}
 
 	/**
@@ -123,8 +122,7 @@
 	 */
 	public NotificationChain basicSetEnumeration(Enumeration newEnumeration,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newEnumeration,
-			UMLPackage.ENUMERATION_LITERAL__ENUMERATION, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newEnumeration, UMLPackage.ENUMERATION_LITERAL__ENUMERATION, msgs);
 		return msgs;
 	}
 
@@ -134,10 +132,7 @@
 	 * @generated
 	 */
 	public void setEnumeration(Enumeration newEnumeration) {
-		eDynamicSet(
-			UMLPackage.ENUMERATION_LITERAL__ENUMERATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ENUMERATION_LITERAL__ENUMERATION,
-			newEnumeration);
+		eDynamicSet(UMLPackage.ENUMERATION_LITERAL__ENUMERATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ENUMERATION_LITERAL__ENUMERATION, newEnumeration);
 	}
 
 	/**
@@ -150,12 +145,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Classifier> result = (EList<Classifier>) cache.get(this,
-				UMLPackage.Literals.INSTANCE_SPECIFICATION__CLASSIFIER);
+			EList<Classifier> result = (EList<Classifier>) cache.get(this, UMLPackage.Literals.INSTANCE_SPECIFICATION__CLASSIFIER);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.INSTANCE_SPECIFICATION__CLASSIFIER,
-					result = EnumerationLiteralOperations.getClassifiers(this));
+				cache.put(this, UMLPackage.Literals.INSTANCE_SPECIFICATION__CLASSIFIER, result = EnumerationLiteralOperations.getClassifiers(this));
 			}
 			return result;
 		}
@@ -167,7 +159,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Classifier getClassifier(String name) {
 		return getClassifier(name, false);
 	}
@@ -178,10 +169,8 @@
 	 * @generated
 	 */
 	public Classifier getClassifier(String name, boolean ignoreCase) {
-		classifierLoop : for (Classifier classifier : getClassifiers()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(classifier.getName())
-				: name.equals(classifier.getName())))
+		classifierLoop: for (Classifier classifier : getClassifiers()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(classifier.getName()) : name.equals(classifier.getName())))
 				continue classifierLoop;
 			return classifier;
 		}
@@ -216,33 +205,25 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ENUMERATION_LITERAL__DEPLOYMENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getDeployments())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ENUMERATION_LITERAL__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.ENUMERATION_LITERAL__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.ENUMERATION_LITERAL__SLOT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSlots())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.ENUMERATION_LITERAL__ENUMERATION :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetEnumeration((Enumeration) otherEnd, msgs);
+		case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ENUMERATION_LITERAL__DEPLOYMENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getDeployments()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ENUMERATION_LITERAL__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.ENUMERATION_LITERAL__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.ENUMERATION_LITERAL__SLOT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSlots()).basicAdd(otherEnd, msgs);
+		case UMLPackage.ENUMERATION_LITERAL__ENUMERATION:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetEnumeration((Enumeration) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -256,28 +237,24 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENUMERATION_LITERAL__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.ENUMERATION_LITERAL__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.ENUMERATION_LITERAL__DEPLOYMENT :
-				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);
-			case UMLPackage.ENUMERATION_LITERAL__SPECIFICATION :
-				return basicSetSpecification(null, msgs);
-			case UMLPackage.ENUMERATION_LITERAL__ENUMERATION :
-				return basicSetEnumeration(null, msgs);
+		case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENUMERATION_LITERAL__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.ENUMERATION_LITERAL__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.ENUMERATION_LITERAL__DEPLOYMENT:
+			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);
+		case UMLPackage.ENUMERATION_LITERAL__SPECIFICATION:
+			return basicSetSpecification(null, msgs);
+		case UMLPackage.ENUMERATION_LITERAL__ENUMERATION:
+			return basicSetEnumeration(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -291,14 +268,10 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.ENUMERATION_LITERAL__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
-			case UMLPackage.ENUMERATION_LITERAL__ENUMERATION :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.ENUMERATION__OWNED_LITERAL, Enumeration.class,
-					msgs);
+		case UMLPackage.ENUMERATION_LITERAL__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+		case UMLPackage.ENUMERATION_LITERAL__ENUMERATION:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.ENUMERATION__OWNED_LITERAL, Enumeration.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -311,56 +284,56 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.ENUMERATION_LITERAL__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.ENUMERATION_LITERAL__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.ENUMERATION_LITERAL__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.ENUMERATION_LITERAL__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.ENUMERATION_LITERAL__NAME :
-				return getName();
-			case UMLPackage.ENUMERATION_LITERAL__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.ENUMERATION_LITERAL__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.ENUMERATION_LITERAL__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ENUMERATION_LITERAL__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.ENUMERATION_LITERAL__DEPLOYED_ELEMENT :
-				return getDeployedElements();
-			case UMLPackage.ENUMERATION_LITERAL__DEPLOYMENT :
-				return getDeployments();
-			case UMLPackage.ENUMERATION_LITERAL__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.ENUMERATION_LITERAL__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.ENUMERATION_LITERAL__CLASSIFIER :
-				return getClassifiers();
-			case UMLPackage.ENUMERATION_LITERAL__SLOT :
-				return getSlots();
-			case UMLPackage.ENUMERATION_LITERAL__SPECIFICATION :
-				if (resolve)
-					return getSpecification();
-				return basicGetSpecification();
-			case UMLPackage.ENUMERATION_LITERAL__ENUMERATION :
-				if (resolve)
-					return getEnumeration();
-				return basicGetEnumeration();
+		case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.ENUMERATION_LITERAL__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.ENUMERATION_LITERAL__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.ENUMERATION_LITERAL__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.ENUMERATION_LITERAL__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.ENUMERATION_LITERAL__NAME:
+			return getName();
+		case UMLPackage.ENUMERATION_LITERAL__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.ENUMERATION_LITERAL__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.ENUMERATION_LITERAL__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ENUMERATION_LITERAL__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.ENUMERATION_LITERAL__DEPLOYED_ELEMENT:
+			return getDeployedElements();
+		case UMLPackage.ENUMERATION_LITERAL__DEPLOYMENT:
+			return getDeployments();
+		case UMLPackage.ENUMERATION_LITERAL__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.ENUMERATION_LITERAL__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.ENUMERATION_LITERAL__CLASSIFIER:
+			return getClassifiers();
+		case UMLPackage.ENUMERATION_LITERAL__SLOT:
+			return getSlots();
+		case UMLPackage.ENUMERATION_LITERAL__SPECIFICATION:
+			if (resolve)
+				return getSpecification();
+			return basicGetSpecification();
+		case UMLPackage.ENUMERATION_LITERAL__ENUMERATION:
+			if (resolve)
+				return getEnumeration();
+			return basicGetEnumeration();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -374,51 +347,47 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__DEPLOYMENT :
-				getDeployments().clear();
-				getDeployments()
-					.addAll((Collection<? extends Deployment>) newValue);
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__CLASSIFIER :
-				getClassifiers().clear();
-				getClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__SLOT :
-				getSlots().clear();
-				getSlots().addAll((Collection<? extends Slot>) newValue);
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__SPECIFICATION :
-				setSpecification((ValueSpecification) newValue);
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__ENUMERATION :
-				setEnumeration((Enumeration) newValue);
-				return;
+		case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__DEPLOYMENT:
+			getDeployments().clear();
+			getDeployments().addAll((Collection<? extends Deployment>) newValue);
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__CLASSIFIER:
+			getClassifiers().clear();
+			getClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__SLOT:
+			getSlots().clear();
+			getSlots().addAll((Collection<? extends Slot>) newValue);
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__SPECIFICATION:
+			setSpecification((ValueSpecification) newValue);
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__ENUMERATION:
+			setEnumeration((Enumeration) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -431,42 +400,42 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__NAME :
-				unsetName();
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__DEPLOYMENT :
-				getDeployments().clear();
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__CLASSIFIER :
-				getClassifiers().clear();
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__SLOT :
-				getSlots().clear();
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__SPECIFICATION :
-				setSpecification((ValueSpecification) null);
-				return;
-			case UMLPackage.ENUMERATION_LITERAL__ENUMERATION :
-				setEnumeration((Enumeration) null);
-				return;
+		case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__NAME:
+			unsetName();
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__DEPLOYMENT:
+			getDeployments().clear();
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__CLASSIFIER:
+			getClassifiers().clear();
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__SLOT:
+			getSlots().clear();
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__SPECIFICATION:
+			setSpecification((ValueSpecification) null);
+			return;
+		case UMLPackage.ENUMERATION_LITERAL__ENUMERATION:
+			setEnumeration((Enumeration) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -479,44 +448,42 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.ENUMERATION_LITERAL__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.ENUMERATION_LITERAL__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.ENUMERATION_LITERAL__OWNER :
-				return isSetOwner();
-			case UMLPackage.ENUMERATION_LITERAL__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.ENUMERATION_LITERAL__NAME :
-				return isSetName();
-			case UMLPackage.ENUMERATION_LITERAL__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.ENUMERATION_LITERAL__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.ENUMERATION_LITERAL__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.ENUMERATION_LITERAL__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.ENUMERATION_LITERAL__DEPLOYED_ELEMENT :
-				return !getDeployedElements().isEmpty();
-			case UMLPackage.ENUMERATION_LITERAL__DEPLOYMENT :
-				return !getDeployments().isEmpty();
-			case UMLPackage.ENUMERATION_LITERAL__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.ENUMERATION_LITERAL__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.ENUMERATION_LITERAL__CLASSIFIER :
-				return isSetClassifiers();
-			case UMLPackage.ENUMERATION_LITERAL__SLOT :
-				return !getSlots().isEmpty();
-			case UMLPackage.ENUMERATION_LITERAL__SPECIFICATION :
-				return basicGetSpecification() != null;
-			case UMLPackage.ENUMERATION_LITERAL__ENUMERATION :
-				return basicGetEnumeration() != null;
+		case UMLPackage.ENUMERATION_LITERAL__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.ENUMERATION_LITERAL__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.ENUMERATION_LITERAL__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.ENUMERATION_LITERAL__OWNER:
+			return isSetOwner();
+		case UMLPackage.ENUMERATION_LITERAL__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.ENUMERATION_LITERAL__NAME:
+			return isSetName();
+		case UMLPackage.ENUMERATION_LITERAL__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.ENUMERATION_LITERAL__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.ENUMERATION_LITERAL__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.ENUMERATION_LITERAL__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.ENUMERATION_LITERAL__DEPLOYED_ELEMENT:
+			return !getDeployedElements().isEmpty();
+		case UMLPackage.ENUMERATION_LITERAL__DEPLOYMENT:
+			return !getDeployments().isEmpty();
+		case UMLPackage.ENUMERATION_LITERAL__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.ENUMERATION_LITERAL__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.ENUMERATION_LITERAL__CLASSIFIER:
+			return isSetClassifiers();
+		case UMLPackage.ENUMERATION_LITERAL__SLOT:
+			return !getSlots().isEmpty();
+		case UMLPackage.ENUMERATION_LITERAL__SPECIFICATION:
+			return basicGetSpecification() != null;
+		case UMLPackage.ENUMERATION_LITERAL__ENUMERATION:
+			return basicGetEnumeration() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -531,156 +498,130 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.ENUMERATION_LITERAL___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION_LITERAL___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION_LITERAL___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.ENUMERATION_LITERAL___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.ENUMERATION_LITERAL___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.ENUMERATION_LITERAL___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.ENUMERATION_LITERAL___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ENUMERATION_LITERAL___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___GET_MODEL :
-				return getModel();
-			case UMLPackage.ENUMERATION_LITERAL___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.ENUMERATION_LITERAL___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.ENUMERATION_LITERAL___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.ENUMERATION_LITERAL___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.ENUMERATION_LITERAL___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.ENUMERATION_LITERAL___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.ENUMERATION_LITERAL___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ENUMERATION_LITERAL___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.ENUMERATION_LITERAL___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.ENUMERATION_LITERAL___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.ENUMERATION_LITERAL___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.ENUMERATION_LITERAL___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION_LITERAL___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION_LITERAL___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION_LITERAL___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___GET_LABEL :
-				return getLabel();
-			case UMLPackage.ENUMERATION_LITERAL___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.ENUMERATION_LITERAL___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.ENUMERATION_LITERAL___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.ENUMERATION_LITERAL___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.ENUMERATION_LITERAL___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.ENUMERATION_LITERAL___SEPARATOR :
-				return separator();
-			case UMLPackage.ENUMERATION_LITERAL___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.ENUMERATION_LITERAL___GET_DEPLOYED_ELEMENTS :
-				return getDeployedElements();
-			case UMLPackage.ENUMERATION_LITERAL___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.ENUMERATION_LITERAL___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.ENUMERATION_LITERAL___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION_LITERAL___VALIDATE_DEPLOYMENT_ARTIFACT__DIAGNOSTICCHAIN_MAP :
-				return validateDeploymentArtifact(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION_LITERAL___VALIDATE_STRUCTURAL_FEATURE__DIAGNOSTICCHAIN_MAP :
-				return validateStructuralFeature(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION_LITERAL___VALIDATE_DEFINING_FEATURE__DIAGNOSTICCHAIN_MAP :
-				return validateDefiningFeature(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION_LITERAL___VALIDATE_DEPLOYMENT_TARGET__DIAGNOSTICCHAIN_MAP :
-				return validateDeploymentTarget(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.ENUMERATION_LITERAL___GET_CLASSIFIERS :
-				return getClassifiers();
-			case UMLPackage.ENUMERATION_LITERAL___GET_CLASSIFIER :
-				return getClassifier();
+		case UMLPackage.ENUMERATION_LITERAL___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION_LITERAL___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION_LITERAL___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.ENUMERATION_LITERAL___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.ENUMERATION_LITERAL___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.ENUMERATION_LITERAL___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.ENUMERATION_LITERAL___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ENUMERATION_LITERAL___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___GET_MODEL:
+			return getModel();
+		case UMLPackage.ENUMERATION_LITERAL___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.ENUMERATION_LITERAL___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.ENUMERATION_LITERAL___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.ENUMERATION_LITERAL___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.ENUMERATION_LITERAL___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.ENUMERATION_LITERAL___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.ENUMERATION_LITERAL___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ENUMERATION_LITERAL___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.ENUMERATION_LITERAL___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.ENUMERATION_LITERAL___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.ENUMERATION_LITERAL___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.ENUMERATION_LITERAL___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION_LITERAL___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION_LITERAL___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION_LITERAL___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___GET_LABEL:
+			return getLabel();
+		case UMLPackage.ENUMERATION_LITERAL___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.ENUMERATION_LITERAL___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.ENUMERATION_LITERAL___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.ENUMERATION_LITERAL___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.ENUMERATION_LITERAL___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.ENUMERATION_LITERAL___SEPARATOR:
+			return separator();
+		case UMLPackage.ENUMERATION_LITERAL___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.ENUMERATION_LITERAL___GET_DEPLOYED_ELEMENTS:
+			return getDeployedElements();
+		case UMLPackage.ENUMERATION_LITERAL___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.ENUMERATION_LITERAL___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.ENUMERATION_LITERAL___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION_LITERAL___VALIDATE_DEPLOYMENT_ARTIFACT__DIAGNOSTICCHAIN_MAP:
+			return validateDeploymentArtifact((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION_LITERAL___VALIDATE_STRUCTURAL_FEATURE__DIAGNOSTICCHAIN_MAP:
+			return validateStructuralFeature((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION_LITERAL___VALIDATE_DEFINING_FEATURE__DIAGNOSTICCHAIN_MAP:
+			return validateDefiningFeature((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION_LITERAL___VALIDATE_DEPLOYMENT_TARGET__DIAGNOSTICCHAIN_MAP:
+			return validateDeploymentTarget((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.ENUMERATION_LITERAL___GET_CLASSIFIERS:
+			return getClassifiers();
+		case UMLPackage.ENUMERATION_LITERAL___GET_CLASSIFIER:
+			return getClassifier();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -707,7 +648,7 @@
 	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
-			|| eIsSet(UMLPackage.ENUMERATION_LITERAL__ENUMERATION);
+				|| eIsSet(UMLPackage.ENUMERATION_LITERAL__ENUMERATION);
 	}
 
 } //EnumerationLiteralImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EventImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EventImpl.java
index c2adff6..614b301 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EventImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/EventImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExceptionHandlerImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExceptionHandlerImpl.java
index d9db1eb..2851eef 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExceptionHandlerImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExceptionHandlerImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,10 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Classifier;
@@ -88,9 +93,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -99,9 +102,7 @@
 	 * @generated
 	 */
 	public ExecutableNode getHandlerBody() {
-		return (ExecutableNode) eDynamicGet(
-			UMLPackage.EXCEPTION_HANDLER__HANDLER_BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXCEPTION_HANDLER__HANDLER_BODY, true, true);
+		return (ExecutableNode) eDynamicGet(UMLPackage.EXCEPTION_HANDLER__HANDLER_BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXCEPTION_HANDLER__HANDLER_BODY, true, true);
 	}
 
 	/**
@@ -110,9 +111,7 @@
 	 * @generated
 	 */
 	public ExecutableNode basicGetHandlerBody() {
-		return (ExecutableNode) eDynamicGet(
-			UMLPackage.EXCEPTION_HANDLER__HANDLER_BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXCEPTION_HANDLER__HANDLER_BODY, false, true);
+		return (ExecutableNode) eDynamicGet(UMLPackage.EXCEPTION_HANDLER__HANDLER_BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXCEPTION_HANDLER__HANDLER_BODY, false, true);
 	}
 
 	/**
@@ -121,10 +120,7 @@
 	 * @generated
 	 */
 	public void setHandlerBody(ExecutableNode newHandlerBody) {
-		eDynamicSet(
-			UMLPackage.EXCEPTION_HANDLER__HANDLER_BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXCEPTION_HANDLER__HANDLER_BODY,
-			newHandlerBody);
+		eDynamicSet(UMLPackage.EXCEPTION_HANDLER__HANDLER_BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXCEPTION_HANDLER__HANDLER_BODY, newHandlerBody);
 	}
 
 	/**
@@ -133,10 +129,7 @@
 	 * @generated
 	 */
 	public ObjectNode getExceptionInput() {
-		return (ObjectNode) eDynamicGet(
-			UMLPackage.EXCEPTION_HANDLER__EXCEPTION_INPUT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXCEPTION_HANDLER__EXCEPTION_INPUT, true, true);
+		return (ObjectNode) eDynamicGet(UMLPackage.EXCEPTION_HANDLER__EXCEPTION_INPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXCEPTION_HANDLER__EXCEPTION_INPUT, true, true);
 	}
 
 	/**
@@ -145,11 +138,7 @@
 	 * @generated
 	 */
 	public ObjectNode basicGetExceptionInput() {
-		return (ObjectNode) eDynamicGet(
-			UMLPackage.EXCEPTION_HANDLER__EXCEPTION_INPUT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXCEPTION_HANDLER__EXCEPTION_INPUT, false,
-			true);
+		return (ObjectNode) eDynamicGet(UMLPackage.EXCEPTION_HANDLER__EXCEPTION_INPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXCEPTION_HANDLER__EXCEPTION_INPUT, false, true);
 	}
 
 	/**
@@ -158,11 +147,7 @@
 	 * @generated
 	 */
 	public void setExceptionInput(ObjectNode newExceptionInput) {
-		eDynamicSet(
-			UMLPackage.EXCEPTION_HANDLER__EXCEPTION_INPUT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXCEPTION_HANDLER__EXCEPTION_INPUT,
-			newExceptionInput);
+		eDynamicSet(UMLPackage.EXCEPTION_HANDLER__EXCEPTION_INPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXCEPTION_HANDLER__EXCEPTION_INPUT, newExceptionInput);
 	}
 
 	/**
@@ -172,10 +157,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Classifier> getExceptionTypes() {
-		return (EList<Classifier>) eDynamicGet(
-			UMLPackage.EXCEPTION_HANDLER__EXCEPTION_TYPE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXCEPTION_HANDLER__EXCEPTION_TYPE, true, true);
+		return (EList<Classifier>) eDynamicGet(UMLPackage.EXCEPTION_HANDLER__EXCEPTION_TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXCEPTION_HANDLER__EXCEPTION_TYPE, true, true);
 	}
 
 	/**
@@ -194,12 +176,10 @@
 	 */
 	public Classifier getExceptionType(String name, boolean ignoreCase,
 			EClass eClass) {
-		exceptionTypeLoop : for (Classifier exceptionType : getExceptionTypes()) {
+		exceptionTypeLoop: for (Classifier exceptionType : getExceptionTypes()) {
 			if (eClass != null && !eClass.isInstance(exceptionType))
 				continue exceptionTypeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(exceptionType.getName())
-				: name.equals(exceptionType.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(exceptionType.getName()) : name.equals(exceptionType.getName())))
 				continue exceptionTypeLoop;
 			return exceptionType;
 		}
@@ -212,10 +192,7 @@
 	 * @generated
 	 */
 	public ExecutableNode getProtectedNode() {
-		return (ExecutableNode) eDynamicGet(
-			UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXCEPTION_HANDLER__PROTECTED_NODE, true, true);
+		return (ExecutableNode) eDynamicGet(UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXCEPTION_HANDLER__PROTECTED_NODE, true, true);
 	}
 
 	/**
@@ -224,10 +201,7 @@
 	 * @generated
 	 */
 	public ExecutableNode basicGetProtectedNode() {
-		return (ExecutableNode) eDynamicGet(
-			UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXCEPTION_HANDLER__PROTECTED_NODE, false, true);
+		return (ExecutableNode) eDynamicGet(UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXCEPTION_HANDLER__PROTECTED_NODE, false, true);
 	}
 
 	/**
@@ -237,8 +211,7 @@
 	 */
 	public NotificationChain basicSetProtectedNode(
 			ExecutableNode newProtectedNode, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newProtectedNode,
-			UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newProtectedNode, UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE, msgs);
 		return msgs;
 	}
 
@@ -248,11 +221,7 @@
 	 * @generated
 	 */
 	public void setProtectedNode(ExecutableNode newProtectedNode) {
-		eDynamicSet(
-			UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXCEPTION_HANDLER__PROTECTED_NODE,
-			newProtectedNode);
+		eDynamicSet(UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXCEPTION_HANDLER__PROTECTED_NODE, newProtectedNode);
 	}
 
 	/**
@@ -262,8 +231,7 @@
 	 */
 	public boolean validateHandlerBodyEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ExceptionHandlerOperations.validateHandlerBodyEdges(this,
-			diagnostics, context);
+		return ExceptionHandlerOperations.validateHandlerBodyEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -273,8 +241,7 @@
 	 */
 	public boolean validateOutputPins(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ExceptionHandlerOperations.validateOutputPins(this, diagnostics,
-			context);
+		return ExceptionHandlerOperations.validateOutputPins(this, diagnostics, context);
 	}
 
 	/**
@@ -284,8 +251,7 @@
 	 */
 	public boolean validateOneInput(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ExceptionHandlerOperations.validateOneInput(this, diagnostics,
-			context);
+		return ExceptionHandlerOperations.validateOneInput(this, diagnostics, context);
 	}
 
 	/**
@@ -295,8 +261,7 @@
 	 */
 	public boolean validateEdgeSourceTarget(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ExceptionHandlerOperations.validateEdgeSourceTarget(this,
-			diagnostics, context);
+		return ExceptionHandlerOperations.validateEdgeSourceTarget(this, diagnostics, context);
 	}
 
 	/**
@@ -306,8 +271,7 @@
 	 */
 	public boolean validateHandlerBodyOwner(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ExceptionHandlerOperations.validateHandlerBodyOwner(this,
-			diagnostics, context);
+		return ExceptionHandlerOperations.validateHandlerBodyOwner(this, diagnostics, context);
 	}
 
 	/**
@@ -317,8 +281,7 @@
 	 */
 	public boolean validateExceptionInputType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ExceptionHandlerOperations.validateExceptionInputType(this,
-			diagnostics, context);
+		return ExceptionHandlerOperations.validateExceptionInputType(this, diagnostics, context);
 	}
 
 	/**
@@ -331,13 +294,12 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetProtectedNode((ExecutableNode) otherEnd, msgs);
+		case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetProtectedNode((ExecutableNode) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -351,14 +313,12 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXCEPTION_HANDLER__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE :
-				return basicSetProtectedNode(null, msgs);
+		case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXCEPTION_HANDLER__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE:
+			return basicSetProtectedNode(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -372,10 +332,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.EXECUTABLE_NODE__HANDLER, ExecutableNode.class,
-					msgs);
+		case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.EXECUTABLE_NODE__HANDLER, ExecutableNode.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -388,30 +346,30 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.EXCEPTION_HANDLER__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.EXCEPTION_HANDLER__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.EXCEPTION_HANDLER__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_INPUT :
-				if (resolve)
-					return getExceptionInput();
-				return basicGetExceptionInput();
-			case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_TYPE :
-				return getExceptionTypes();
-			case UMLPackage.EXCEPTION_HANDLER__HANDLER_BODY :
-				if (resolve)
-					return getHandlerBody();
-				return basicGetHandlerBody();
-			case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE :
-				if (resolve)
-					return getProtectedNode();
-				return basicGetProtectedNode();
+		case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.EXCEPTION_HANDLER__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.EXCEPTION_HANDLER__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.EXCEPTION_HANDLER__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_INPUT:
+			if (resolve)
+				return getExceptionInput();
+			return basicGetExceptionInput();
+		case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_TYPE:
+			return getExceptionTypes();
+		case UMLPackage.EXCEPTION_HANDLER__HANDLER_BODY:
+			if (resolve)
+				return getHandlerBody();
+			return basicGetHandlerBody();
+		case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE:
+			if (resolve)
+				return getProtectedNode();
+			return basicGetProtectedNode();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -425,30 +383,27 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.EXCEPTION_HANDLER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_INPUT :
-				setExceptionInput((ObjectNode) newValue);
-				return;
-			case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_TYPE :
-				getExceptionTypes().clear();
-				getExceptionTypes()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.EXCEPTION_HANDLER__HANDLER_BODY :
-				setHandlerBody((ExecutableNode) newValue);
-				return;
-			case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE :
-				setProtectedNode((ExecutableNode) newValue);
-				return;
+		case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.EXCEPTION_HANDLER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_INPUT:
+			setExceptionInput((ObjectNode) newValue);
+			return;
+		case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_TYPE:
+			getExceptionTypes().clear();
+			getExceptionTypes().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.EXCEPTION_HANDLER__HANDLER_BODY:
+			setHandlerBody((ExecutableNode) newValue);
+			return;
+		case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE:
+			setProtectedNode((ExecutableNode) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -461,24 +416,24 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.EXCEPTION_HANDLER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_INPUT :
-				setExceptionInput((ObjectNode) null);
-				return;
-			case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_TYPE :
-				getExceptionTypes().clear();
-				return;
-			case UMLPackage.EXCEPTION_HANDLER__HANDLER_BODY :
-				setHandlerBody((ExecutableNode) null);
-				return;
-			case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE :
-				setProtectedNode((ExecutableNode) null);
-				return;
+		case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.EXCEPTION_HANDLER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_INPUT:
+			setExceptionInput((ObjectNode) null);
+			return;
+		case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_TYPE:
+			getExceptionTypes().clear();
+			return;
+		case UMLPackage.EXCEPTION_HANDLER__HANDLER_BODY:
+			setHandlerBody((ExecutableNode) null);
+			return;
+		case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE:
+			setProtectedNode((ExecutableNode) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -491,22 +446,22 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.EXCEPTION_HANDLER__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.EXCEPTION_HANDLER__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.EXCEPTION_HANDLER__OWNER :
-				return isSetOwner();
-			case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_INPUT :
-				return basicGetExceptionInput() != null;
-			case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_TYPE :
-				return !getExceptionTypes().isEmpty();
-			case UMLPackage.EXCEPTION_HANDLER__HANDLER_BODY :
-				return basicGetHandlerBody() != null;
-			case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE :
-				return basicGetProtectedNode() != null;
+		case UMLPackage.EXCEPTION_HANDLER__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.EXCEPTION_HANDLER__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.EXCEPTION_HANDLER__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.EXCEPTION_HANDLER__OWNER:
+			return isSetOwner();
+		case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_INPUT:
+			return basicGetExceptionInput() != null;
+		case UMLPackage.EXCEPTION_HANDLER__EXCEPTION_TYPE:
+			return !getExceptionTypes().isEmpty();
+		case UMLPackage.EXCEPTION_HANDLER__HANDLER_BODY:
+			return basicGetHandlerBody() != null;
+		case UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE:
+			return basicGetProtectedNode() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -521,112 +476,94 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.EXCEPTION_HANDLER___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXCEPTION_HANDLER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXCEPTION_HANDLER___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.EXCEPTION_HANDLER___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.EXCEPTION_HANDLER___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.EXCEPTION_HANDLER___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.EXCEPTION_HANDLER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXCEPTION_HANDLER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___GET_MODEL :
-				return getModel();
-			case UMLPackage.EXCEPTION_HANDLER___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.EXCEPTION_HANDLER___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.EXCEPTION_HANDLER___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.EXCEPTION_HANDLER___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.EXCEPTION_HANDLER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.EXCEPTION_HANDLER___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.EXCEPTION_HANDLER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXCEPTION_HANDLER___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXCEPTION_HANDLER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.EXCEPTION_HANDLER___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.EXCEPTION_HANDLER___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.EXCEPTION_HANDLER___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.EXCEPTION_HANDLER___VALIDATE_HANDLER_BODY_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateHandlerBodyEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXCEPTION_HANDLER___VALIDATE_OUTPUT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateOutputPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXCEPTION_HANDLER___VALIDATE_ONE_INPUT__DIAGNOSTICCHAIN_MAP :
-				return validateOneInput((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXCEPTION_HANDLER___VALIDATE_EDGE_SOURCE_TARGET__DIAGNOSTICCHAIN_MAP :
-				return validateEdgeSourceTarget(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXCEPTION_HANDLER___VALIDATE_HANDLER_BODY_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHandlerBodyOwner(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXCEPTION_HANDLER___VALIDATE_EXCEPTION_INPUT_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateExceptionInputType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXCEPTION_HANDLER___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXCEPTION_HANDLER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXCEPTION_HANDLER___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.EXCEPTION_HANDLER___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.EXCEPTION_HANDLER___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.EXCEPTION_HANDLER___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.EXCEPTION_HANDLER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXCEPTION_HANDLER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___GET_MODEL:
+			return getModel();
+		case UMLPackage.EXCEPTION_HANDLER___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.EXCEPTION_HANDLER___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.EXCEPTION_HANDLER___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.EXCEPTION_HANDLER___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.EXCEPTION_HANDLER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.EXCEPTION_HANDLER___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.EXCEPTION_HANDLER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXCEPTION_HANDLER___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXCEPTION_HANDLER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.EXCEPTION_HANDLER___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.EXCEPTION_HANDLER___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.EXCEPTION_HANDLER___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.EXCEPTION_HANDLER___VALIDATE_HANDLER_BODY_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateHandlerBodyEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXCEPTION_HANDLER___VALIDATE_OUTPUT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateOutputPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXCEPTION_HANDLER___VALIDATE_ONE_INPUT__DIAGNOSTICCHAIN_MAP:
+			return validateOneInput((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXCEPTION_HANDLER___VALIDATE_EDGE_SOURCE_TARGET__DIAGNOSTICCHAIN_MAP:
+			return validateEdgeSourceTarget((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXCEPTION_HANDLER___VALIDATE_HANDLER_BODY_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHandlerBodyOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXCEPTION_HANDLER___VALIDATE_EXCEPTION_INPUT_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateExceptionInputType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -653,7 +590,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE);
+				|| eIsSet(UMLPackage.EXCEPTION_HANDLER__PROTECTED_NODE);
 	}
 
 } //ExceptionHandlerImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutableNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutableNodeImpl.java
index 5c6f31c..158f61f 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutableNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutableNodeImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -23,6 +24,7 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -90,20 +92,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.EXECUTABLE_NODE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.EXECUTABLE_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.EXECUTABLE_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.EXECUTABLE_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -113,9 +108,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ExceptionHandler> getHandlers() {
-		return (EList<ExceptionHandler>) eDynamicGet(
-			UMLPackage.EXECUTABLE_NODE__HANDLER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXECUTABLE_NODE__HANDLER, true, true);
+		return (EList<ExceptionHandler>) eDynamicGet(UMLPackage.EXECUTABLE_NODE__HANDLER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXECUTABLE_NODE__HANDLER, true, true);
 	}
 
 	/**
@@ -124,8 +117,7 @@
 	 * @generated
 	 */
 	public ExceptionHandler createHandler() {
-		ExceptionHandler newHandler = (ExceptionHandler) create(
-			UMLPackage.Literals.EXCEPTION_HANDLER);
+		ExceptionHandler newHandler = (ExceptionHandler) create(UMLPackage.Literals.EXCEPTION_HANDLER);
 		getHandlers().add(newHandler);
 		return newHandler;
 	}
@@ -140,29 +132,22 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXECUTABLE_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXECUTABLE_NODE__IN_STRUCTURED_NODE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetInStructuredNode(
-					(StructuredActivityNode) otherEnd, msgs);
-			case UMLPackage.EXECUTABLE_NODE__INCOMING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXECUTABLE_NODE__OUTGOING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXECUTABLE_NODE__IN_PARTITION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXECUTABLE_NODE__HANDLER :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getHandlers())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXECUTABLE_NODE__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXECUTABLE_NODE__IN_STRUCTURED_NODE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetInStructuredNode((StructuredActivityNode) otherEnd, msgs);
+		case UMLPackage.EXECUTABLE_NODE__INCOMING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXECUTABLE_NODE__OUTGOING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXECUTABLE_NODE__IN_PARTITION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXECUTABLE_NODE__HANDLER:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getHandlers()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -176,31 +161,24 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXECUTABLE_NODE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXECUTABLE_NODE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.EXECUTABLE_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXECUTABLE_NODE__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.EXECUTABLE_NODE__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.EXECUTABLE_NODE__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.EXECUTABLE_NODE__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXECUTABLE_NODE__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXECUTABLE_NODE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXECUTABLE_NODE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.EXECUTABLE_NODE__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXECUTABLE_NODE__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.EXECUTABLE_NODE__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXECUTABLE_NODE__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXECUTABLE_NODE__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXECUTABLE_NODE__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -213,60 +191,60 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.EXECUTABLE_NODE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.EXECUTABLE_NODE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.EXECUTABLE_NODE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.EXECUTABLE_NODE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.EXECUTABLE_NODE__NAME :
-				return getName();
-			case UMLPackage.EXECUTABLE_NODE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.EXECUTABLE_NODE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.EXECUTABLE_NODE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXECUTABLE_NODE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.EXECUTABLE_NODE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.EXECUTABLE_NODE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.EXECUTABLE_NODE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.EXECUTABLE_NODE__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.EXECUTABLE_NODE__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.EXECUTABLE_NODE__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.EXECUTABLE_NODE__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.EXECUTABLE_NODE__INCOMING :
-				return getIncomings();
-			case UMLPackage.EXECUTABLE_NODE__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.EXECUTABLE_NODE__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.EXECUTABLE_NODE__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.EXECUTABLE_NODE__HANDLER :
-				return getHandlers();
+		case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.EXECUTABLE_NODE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.EXECUTABLE_NODE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.EXECUTABLE_NODE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.EXECUTABLE_NODE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.EXECUTABLE_NODE__NAME:
+			return getName();
+		case UMLPackage.EXECUTABLE_NODE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.EXECUTABLE_NODE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.EXECUTABLE_NODE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXECUTABLE_NODE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.EXECUTABLE_NODE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.EXECUTABLE_NODE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.EXECUTABLE_NODE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.EXECUTABLE_NODE__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.EXECUTABLE_NODE__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.EXECUTABLE_NODE__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.EXECUTABLE_NODE__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.EXECUTABLE_NODE__INCOMING:
+			return getIncomings();
+		case UMLPackage.EXECUTABLE_NODE__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.EXECUTABLE_NODE__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.EXECUTABLE_NODE__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.EXECUTABLE_NODE__HANDLER:
+			return getHandlers();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -280,64 +258,56 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
+		case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -350,48 +320,48 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.EXECUTABLE_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.EXECUTABLE_NODE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.EXECUTABLE_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.EXECUTABLE_NODE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.EXECUTABLE_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.EXECUTABLE_NODE__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.EXECUTABLE_NODE__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.EXECUTABLE_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.EXECUTABLE_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.EXECUTABLE_NODE__HANDLER :
-				getHandlers().clear();
-				return;
+		case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.EXECUTABLE_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.EXECUTABLE_NODE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.EXECUTABLE_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.EXECUTABLE_NODE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.EXECUTABLE_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.EXECUTABLE_NODE__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.EXECUTABLE_NODE__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.EXECUTABLE_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.EXECUTABLE_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.EXECUTABLE_NODE__HANDLER:
+			getHandlers().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -404,52 +374,50 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.EXECUTABLE_NODE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.EXECUTABLE_NODE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.EXECUTABLE_NODE__OWNER :
-				return isSetOwner();
-			case UMLPackage.EXECUTABLE_NODE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.EXECUTABLE_NODE__NAME :
-				return isSetName();
-			case UMLPackage.EXECUTABLE_NODE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.EXECUTABLE_NODE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.EXECUTABLE_NODE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.EXECUTABLE_NODE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.EXECUTABLE_NODE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.EXECUTABLE_NODE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.EXECUTABLE_NODE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.EXECUTABLE_NODE__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.EXECUTABLE_NODE__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.EXECUTABLE_NODE__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.EXECUTABLE_NODE__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.EXECUTABLE_NODE__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.EXECUTABLE_NODE__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.EXECUTABLE_NODE__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.EXECUTABLE_NODE__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.EXECUTABLE_NODE__HANDLER :
-				return !getHandlers().isEmpty();
+		case UMLPackage.EXECUTABLE_NODE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.EXECUTABLE_NODE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.EXECUTABLE_NODE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.EXECUTABLE_NODE__OWNER:
+			return isSetOwner();
+		case UMLPackage.EXECUTABLE_NODE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.EXECUTABLE_NODE__NAME:
+			return isSetName();
+		case UMLPackage.EXECUTABLE_NODE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.EXECUTABLE_NODE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.EXECUTABLE_NODE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.EXECUTABLE_NODE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.EXECUTABLE_NODE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.EXECUTABLE_NODE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.EXECUTABLE_NODE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.EXECUTABLE_NODE__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.EXECUTABLE_NODE__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.EXECUTABLE_NODE__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.EXECUTABLE_NODE__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.EXECUTABLE_NODE__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.EXECUTABLE_NODE__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.EXECUTABLE_NODE__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.EXECUTABLE_NODE__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.EXECUTABLE_NODE__HANDLER:
+			return !getHandlers().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -462,10 +430,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.EXECUTABLE_NODE__OWNED_COMMENT,
-		UMLPackage.EXECUTABLE_NODE__NAME_EXPRESSION,
-		UMLPackage.EXECUTABLE_NODE__HANDLER};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.EXECUTABLE_NODE__OWNED_COMMENT, UMLPackage.EXECUTABLE_NODE__NAME_EXPRESSION, UMLPackage.EXECUTABLE_NODE__HANDLER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -475,7 +440,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.EXECUTABLE_NODE__HANDLER);
+				|| eIsSet(UMLPackage.EXECUTABLE_NODE__HANDLER);
 	}
 
 } //ExecutableNodeImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutionEnvironmentImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutionEnvironmentImpl.java
index cde0496..9563d60 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutionEnvironmentImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutionEnvironmentImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutionOccurrenceSpecificationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutionOccurrenceSpecificationImpl.java
index f36464d..b715fbd 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutionOccurrenceSpecificationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutionOccurrenceSpecificationImpl.java
@@ -1,20 +1,27 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.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.ExecutionOccurrenceSpecification;
 import org.eclipse.uml2.uml.ExecutionSpecification;
@@ -68,11 +75,7 @@
 	 * @generated
 	 */
 	public ExecutionSpecification getExecution() {
-		return (ExecutionSpecification) eDynamicGet(
-			UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION,
-			true, true);
+		return (ExecutionSpecification) eDynamicGet(UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION, true, true);
 	}
 
 	/**
@@ -81,11 +84,7 @@
 	 * @generated
 	 */
 	public ExecutionSpecification basicGetExecution() {
-		return (ExecutionSpecification) eDynamicGet(
-			UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION,
-			false, true);
+		return (ExecutionSpecification) eDynamicGet(UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION, false, true);
 	}
 
 	/**
@@ -94,11 +93,7 @@
 	 * @generated
 	 */
 	public void setExecution(ExecutionSpecification newExecution) {
-		eDynamicSet(
-			UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION,
-			newExecution);
+		eDynamicSet(UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION, newExecution);
 	}
 
 	/**
@@ -109,52 +104,52 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME :
-				return getName();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__COVERED :
-				return getCovereds();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND :
-				if (resolve)
-					return getEnclosingOperand();
-				return basicGetEnclosingOperand();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
-				if (resolve)
-					return getEnclosingInteraction();
-				return basicGetEnclosingInteraction();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
-				return getGeneralOrderings();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_AFTER :
-				return getToAfters();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				return getToBefores();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION :
-				if (resolve)
-					return getExecution();
-				return basicGetExecution();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME:
+			return getName();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__COVERED:
+			return getCovereds();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND:
+			if (resolve)
+				return getEnclosingOperand();
+			return basicGetEnclosingOperand();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION:
+			if (resolve)
+				return getEnclosingInteraction();
+			return basicGetEnclosingInteraction();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING:
+			return getGeneralOrderings();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_AFTER:
+			return getToAfters();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_BEFORE:
+			return getToBefores();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION:
+			if (resolve)
+				return getExecution();
+			return basicGetExecution();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -168,53 +163,48 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__COVERED :
-				getCovereds().clear();
-				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) newValue);
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				getGeneralOrderings()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_AFTER :
-				getToAfters().clear();
-				getToAfters()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				getToBefores().clear();
-				getToBefores()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION :
-				setExecution((ExecutionSpecification) newValue);
-				return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__COVERED:
+			getCovereds().clear();
+			getCovereds().addAll((Collection<? extends Lifeline>) newValue);
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) newValue);
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			getGeneralOrderings().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_AFTER:
+			getToAfters().clear();
+			getToAfters().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_BEFORE:
+			getToBefores().clear();
+			getToBefores().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION:
+			setExecution((ExecutionSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -227,42 +217,42 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__COVERED :
-				getCovereds().clear();
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) null);
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) null);
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_AFTER :
-				getToAfters().clear();
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				getToBefores().clear();
-				return;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION :
-				setExecution((ExecutionSpecification) null);
-				return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__COVERED:
+			getCovereds().clear();
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) null);
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) null);
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_AFTER:
+			getToAfters().clear();
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_BEFORE:
+			getToBefores().clear();
+			return;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION:
+			setExecution((ExecutionSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -275,42 +265,40 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME :
-				return isSetName();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__COVERED :
-				return isSetCovereds();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND :
-				return basicGetEnclosingOperand() != null;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
-				return basicGetEnclosingInteraction() != null;
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
-				return !getGeneralOrderings().isEmpty();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_AFTER :
-				return !getToAfters().isEmpty();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				return !getToBefores().isEmpty();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION :
-				return basicGetExecution() != null;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME:
+			return isSetName();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__COVERED:
+			return isSetCovereds();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND:
+			return basicGetEnclosingOperand() != null;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION:
+			return basicGetEnclosingInteraction() != null;
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING:
+			return !getGeneralOrderings().isEmpty();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_AFTER:
+			return !getToAfters().isEmpty();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__TO_BEFORE:
+			return !getToBefores().isEmpty();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION__EXECUTION:
+			return basicGetExecution() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutionSpecificationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutionSpecificationImpl.java
index e635fe5..3664b88 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutionSpecificationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExecutionSpecificationImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,11 +17,17 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.ExecutionSpecification;
 import org.eclipse.uml2.uml.GeneralOrdering;
@@ -81,9 +87,7 @@
 	 * @generated
 	 */
 	public OccurrenceSpecification getStart() {
-		return (OccurrenceSpecification) eDynamicGet(
-			UMLPackage.EXECUTION_SPECIFICATION__START - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXECUTION_SPECIFICATION__START, true, true);
+		return (OccurrenceSpecification) eDynamicGet(UMLPackage.EXECUTION_SPECIFICATION__START - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXECUTION_SPECIFICATION__START, true, true);
 	}
 
 	/**
@@ -92,9 +96,7 @@
 	 * @generated
 	 */
 	public OccurrenceSpecification basicGetStart() {
-		return (OccurrenceSpecification) eDynamicGet(
-			UMLPackage.EXECUTION_SPECIFICATION__START - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXECUTION_SPECIFICATION__START, false, true);
+		return (OccurrenceSpecification) eDynamicGet(UMLPackage.EXECUTION_SPECIFICATION__START - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXECUTION_SPECIFICATION__START, false, true);
 	}
 
 	/**
@@ -103,9 +105,7 @@
 	 * @generated
 	 */
 	public void setStart(OccurrenceSpecification newStart) {
-		eDynamicSet(
-			UMLPackage.EXECUTION_SPECIFICATION__START - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXECUTION_SPECIFICATION__START, newStart);
+		eDynamicSet(UMLPackage.EXECUTION_SPECIFICATION__START - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXECUTION_SPECIFICATION__START, newStart);
 	}
 
 	/**
@@ -114,9 +114,7 @@
 	 * @generated
 	 */
 	public OccurrenceSpecification getFinish() {
-		return (OccurrenceSpecification) eDynamicGet(
-			UMLPackage.EXECUTION_SPECIFICATION__FINISH - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXECUTION_SPECIFICATION__FINISH, true, true);
+		return (OccurrenceSpecification) eDynamicGet(UMLPackage.EXECUTION_SPECIFICATION__FINISH - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXECUTION_SPECIFICATION__FINISH, true, true);
 	}
 
 	/**
@@ -125,9 +123,7 @@
 	 * @generated
 	 */
 	public OccurrenceSpecification basicGetFinish() {
-		return (OccurrenceSpecification) eDynamicGet(
-			UMLPackage.EXECUTION_SPECIFICATION__FINISH - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXECUTION_SPECIFICATION__FINISH, false, true);
+		return (OccurrenceSpecification) eDynamicGet(UMLPackage.EXECUTION_SPECIFICATION__FINISH - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXECUTION_SPECIFICATION__FINISH, false, true);
 	}
 
 	/**
@@ -136,9 +132,7 @@
 	 * @generated
 	 */
 	public void setFinish(OccurrenceSpecification newFinish) {
-		eDynamicSet(
-			UMLPackage.EXECUTION_SPECIFICATION__FINISH - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXECUTION_SPECIFICATION__FINISH, newFinish);
+		eDynamicSet(UMLPackage.EXECUTION_SPECIFICATION__FINISH - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXECUTION_SPECIFICATION__FINISH, newFinish);
 	}
 
 	/**
@@ -148,8 +142,7 @@
 	 */
 	public boolean validateSameLifeline(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ExecutionSpecificationOperations.validateSameLifeline(this,
-			diagnostics, context);
+		return ExecutionSpecificationOperations.validateSameLifeline(this, diagnostics, context);
 	}
 
 	/**
@@ -160,52 +153,52 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.EXECUTION_SPECIFICATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.EXECUTION_SPECIFICATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.EXECUTION_SPECIFICATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.EXECUTION_SPECIFICATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.EXECUTION_SPECIFICATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.EXECUTION_SPECIFICATION__NAME :
-				return getName();
-			case UMLPackage.EXECUTION_SPECIFICATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.EXECUTION_SPECIFICATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.EXECUTION_SPECIFICATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXECUTION_SPECIFICATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.EXECUTION_SPECIFICATION__COVERED :
-				return getCovereds();
-			case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_OPERAND :
-				if (resolve)
-					return getEnclosingOperand();
-				return basicGetEnclosingOperand();
-			case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION :
-				if (resolve)
-					return getEnclosingInteraction();
-				return basicGetEnclosingInteraction();
-			case UMLPackage.EXECUTION_SPECIFICATION__GENERAL_ORDERING :
-				return getGeneralOrderings();
-			case UMLPackage.EXECUTION_SPECIFICATION__FINISH :
-				if (resolve)
-					return getFinish();
-				return basicGetFinish();
-			case UMLPackage.EXECUTION_SPECIFICATION__START :
-				if (resolve)
-					return getStart();
-				return basicGetStart();
+		case UMLPackage.EXECUTION_SPECIFICATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.EXECUTION_SPECIFICATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.EXECUTION_SPECIFICATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.EXECUTION_SPECIFICATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.EXECUTION_SPECIFICATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.EXECUTION_SPECIFICATION__NAME:
+			return getName();
+		case UMLPackage.EXECUTION_SPECIFICATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.EXECUTION_SPECIFICATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.EXECUTION_SPECIFICATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXECUTION_SPECIFICATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.EXECUTION_SPECIFICATION__COVERED:
+			return getCovereds();
+		case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_OPERAND:
+			if (resolve)
+				return getEnclosingOperand();
+			return basicGetEnclosingOperand();
+		case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION:
+			if (resolve)
+				return getEnclosingInteraction();
+			return basicGetEnclosingInteraction();
+		case UMLPackage.EXECUTION_SPECIFICATION__GENERAL_ORDERING:
+			return getGeneralOrderings();
+		case UMLPackage.EXECUTION_SPECIFICATION__FINISH:
+			if (resolve)
+				return getFinish();
+			return basicGetFinish();
+		case UMLPackage.EXECUTION_SPECIFICATION__START:
+			if (resolve)
+				return getStart();
+			return basicGetStart();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -219,46 +212,43 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.EXECUTION_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__COVERED :
-				getCovereds().clear();
-				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) newValue);
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				getGeneralOrderings()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__FINISH :
-				setFinish((OccurrenceSpecification) newValue);
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__START :
-				setStart((OccurrenceSpecification) newValue);
-				return;
+		case UMLPackage.EXECUTION_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__COVERED:
+			getCovereds().clear();
+			getCovereds().addAll((Collection<? extends Lifeline>) newValue);
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) newValue);
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			getGeneralOrderings().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__FINISH:
+			setFinish((OccurrenceSpecification) newValue);
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__START:
+			setStart((OccurrenceSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -271,39 +261,39 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXECUTION_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__COVERED :
-				getCovereds().clear();
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) null);
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) null);
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__FINISH :
-				setFinish((OccurrenceSpecification) null);
-				return;
-			case UMLPackage.EXECUTION_SPECIFICATION__START :
-				setStart((OccurrenceSpecification) null);
-				return;
+		case UMLPackage.EXECUTION_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__COVERED:
+			getCovereds().clear();
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) null);
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) null);
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__FINISH:
+			setFinish((OccurrenceSpecification) null);
+			return;
+		case UMLPackage.EXECUTION_SPECIFICATION__START:
+			setStart((OccurrenceSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -316,40 +306,38 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXECUTION_SPECIFICATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.EXECUTION_SPECIFICATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.EXECUTION_SPECIFICATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.EXECUTION_SPECIFICATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.EXECUTION_SPECIFICATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.EXECUTION_SPECIFICATION__NAME :
-				return isSetName();
-			case UMLPackage.EXECUTION_SPECIFICATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.EXECUTION_SPECIFICATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.EXECUTION_SPECIFICATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.EXECUTION_SPECIFICATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.EXECUTION_SPECIFICATION__COVERED :
-				return !getCovereds().isEmpty();
-			case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_OPERAND :
-				return basicGetEnclosingOperand() != null;
-			case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION :
-				return basicGetEnclosingInteraction() != null;
-			case UMLPackage.EXECUTION_SPECIFICATION__GENERAL_ORDERING :
-				return !getGeneralOrderings().isEmpty();
-			case UMLPackage.EXECUTION_SPECIFICATION__FINISH :
-				return basicGetFinish() != null;
-			case UMLPackage.EXECUTION_SPECIFICATION__START :
-				return basicGetStart() != null;
+		case UMLPackage.EXECUTION_SPECIFICATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.EXECUTION_SPECIFICATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.EXECUTION_SPECIFICATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.EXECUTION_SPECIFICATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.EXECUTION_SPECIFICATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.EXECUTION_SPECIFICATION__NAME:
+			return isSetName();
+		case UMLPackage.EXECUTION_SPECIFICATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.EXECUTION_SPECIFICATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.EXECUTION_SPECIFICATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.EXECUTION_SPECIFICATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.EXECUTION_SPECIFICATION__COVERED:
+			return !getCovereds().isEmpty();
+		case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_OPERAND:
+			return basicGetEnclosingOperand() != null;
+		case UMLPackage.EXECUTION_SPECIFICATION__ENCLOSING_INTERACTION:
+			return basicGetEnclosingInteraction() != null;
+		case UMLPackage.EXECUTION_SPECIFICATION__GENERAL_ORDERING:
+			return !getGeneralOrderings().isEmpty();
+		case UMLPackage.EXECUTION_SPECIFICATION__FINISH:
+			return basicGetFinish() != null;
+		case UMLPackage.EXECUTION_SPECIFICATION__START:
+			return basicGetStart() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -364,128 +352,112 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXECUTION_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXECUTION_SPECIFICATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXECUTION_SPECIFICATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXECUTION_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.EXECUTION_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.EXECUTION_SPECIFICATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.EXECUTION_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXECUTION_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXECUTION_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXECUTION_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.EXECUTION_SPECIFICATION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.EXECUTION_SPECIFICATION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.EXECUTION_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXECUTION_SPECIFICATION___SEPARATOR :
-				return separator();
-			case UMLPackage.EXECUTION_SPECIFICATION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.EXECUTION_SPECIFICATION___VALIDATE_SAME_LIFELINE__DIAGNOSTICCHAIN_MAP :
-				return validateSameLifeline((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXECUTION_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXECUTION_SPECIFICATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXECUTION_SPECIFICATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXECUTION_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.EXECUTION_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.EXECUTION_SPECIFICATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.EXECUTION_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXECUTION_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXECUTION_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXECUTION_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.EXECUTION_SPECIFICATION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.EXECUTION_SPECIFICATION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.EXECUTION_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXECUTION_SPECIFICATION___SEPARATOR:
+			return separator();
+		case UMLPackage.EXECUTION_SPECIFICATION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.EXECUTION_SPECIFICATION___VALIDATE_SAME_LIFELINE__DIAGNOSTICCHAIN_MAP:
+			return validateSameLifeline((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExpansionNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExpansionNodeImpl.java
index 2222c34..afda9a1 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExpansionNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExpansionNodeImpl.java
@@ -1,14 +1,15 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -16,6 +17,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -24,6 +26,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Activity;
@@ -92,9 +96,7 @@
 	 * @generated
 	 */
 	public ExpansionRegion getRegionAsOutput() {
-		return (ExpansionRegion) eDynamicGet(
-			UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXPANSION_NODE__REGION_AS_OUTPUT, true, true);
+		return (ExpansionRegion) eDynamicGet(UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXPANSION_NODE__REGION_AS_OUTPUT, true, true);
 	}
 
 	/**
@@ -103,9 +105,7 @@
 	 * @generated
 	 */
 	public ExpansionRegion basicGetRegionAsOutput() {
-		return (ExpansionRegion) eDynamicGet(
-			UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXPANSION_NODE__REGION_AS_OUTPUT, false, true);
+		return (ExpansionRegion) eDynamicGet(UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXPANSION_NODE__REGION_AS_OUTPUT, false, true);
 	}
 
 	/**
@@ -115,8 +115,7 @@
 	 */
 	public NotificationChain basicSetRegionAsOutput(
 			ExpansionRegion newRegionAsOutput, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newRegionAsOutput,
-			UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newRegionAsOutput, UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT, msgs);
 		return msgs;
 	}
 
@@ -126,10 +125,7 @@
 	 * @generated
 	 */
 	public void setRegionAsOutput(ExpansionRegion newRegionAsOutput) {
-		eDynamicSet(
-			UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXPANSION_NODE__REGION_AS_OUTPUT,
-			newRegionAsOutput);
+		eDynamicSet(UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXPANSION_NODE__REGION_AS_OUTPUT, newRegionAsOutput);
 	}
 
 	/**
@@ -139,8 +135,7 @@
 	 */
 	public boolean validateRegionAsInputOrOutput(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ExpansionNodeOperations.validateRegionAsInputOrOutput(this,
-			diagnostics, context);
+		return ExpansionNodeOperations.validateRegionAsInputOrOutput(this, diagnostics, context);
 	}
 
 	/**
@@ -149,9 +144,7 @@
 	 * @generated
 	 */
 	public ExpansionRegion getRegionAsInput() {
-		return (ExpansionRegion) eDynamicGet(
-			UMLPackage.EXPANSION_NODE__REGION_AS_INPUT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXPANSION_NODE__REGION_AS_INPUT, true, true);
+		return (ExpansionRegion) eDynamicGet(UMLPackage.EXPANSION_NODE__REGION_AS_INPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXPANSION_NODE__REGION_AS_INPUT, true, true);
 	}
 
 	/**
@@ -160,9 +153,7 @@
 	 * @generated
 	 */
 	public ExpansionRegion basicGetRegionAsInput() {
-		return (ExpansionRegion) eDynamicGet(
-			UMLPackage.EXPANSION_NODE__REGION_AS_INPUT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXPANSION_NODE__REGION_AS_INPUT, false, true);
+		return (ExpansionRegion) eDynamicGet(UMLPackage.EXPANSION_NODE__REGION_AS_INPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXPANSION_NODE__REGION_AS_INPUT, false, true);
 	}
 
 	/**
@@ -172,8 +163,7 @@
 	 */
 	public NotificationChain basicSetRegionAsInput(
 			ExpansionRegion newRegionAsInput, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newRegionAsInput,
-			UMLPackage.EXPANSION_NODE__REGION_AS_INPUT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newRegionAsInput, UMLPackage.EXPANSION_NODE__REGION_AS_INPUT, msgs);
 		return msgs;
 	}
 
@@ -183,10 +173,7 @@
 	 * @generated
 	 */
 	public void setRegionAsInput(ExpansionRegion newRegionAsInput) {
-		eDynamicSet(
-			UMLPackage.EXPANSION_NODE__REGION_AS_INPUT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXPANSION_NODE__REGION_AS_INPUT,
-			newRegionAsInput);
+		eDynamicSet(UMLPackage.EXPANSION_NODE__REGION_AS_INPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXPANSION_NODE__REGION_AS_INPUT, newRegionAsInput);
 	}
 
 	/**
@@ -199,40 +186,30 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.EXPANSION_NODE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_NODE__IN_STRUCTURED_NODE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetInStructuredNode(
-					(StructuredActivityNode) otherEnd, msgs);
-			case UMLPackage.EXPANSION_NODE__INCOMING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_NODE__OUTGOING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_NODE__IN_PARTITION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_NODE__REGION_AS_INPUT :
-				ExpansionRegion regionAsInput = basicGetRegionAsInput();
-				if (regionAsInput != null)
-					msgs = ((InternalEObject) regionAsInput).eInverseRemove(
-						this, UMLPackage.EXPANSION_REGION__INPUT_ELEMENT,
-						ExpansionRegion.class, msgs);
-				return basicSetRegionAsInput((ExpansionRegion) otherEnd, msgs);
-			case UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT :
-				ExpansionRegion regionAsOutput = basicGetRegionAsOutput();
-				if (regionAsOutput != null)
-					msgs = ((InternalEObject) regionAsOutput).eInverseRemove(
-						this, UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT,
-						ExpansionRegion.class, msgs);
-				return basicSetRegionAsOutput((ExpansionRegion) otherEnd, msgs);
+		case UMLPackage.EXPANSION_NODE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_NODE__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_NODE__IN_STRUCTURED_NODE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetInStructuredNode((StructuredActivityNode) otherEnd, msgs);
+		case UMLPackage.EXPANSION_NODE__INCOMING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_NODE__OUTGOING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_NODE__IN_PARTITION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_NODE__REGION_AS_INPUT:
+			ExpansionRegion regionAsInput = basicGetRegionAsInput();
+			if (regionAsInput != null)
+				msgs = ((InternalEObject) regionAsInput).eInverseRemove(this, UMLPackage.EXPANSION_REGION__INPUT_ELEMENT, ExpansionRegion.class, msgs);
+			return basicSetRegionAsInput((ExpansionRegion) otherEnd, msgs);
+		case UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT:
+			ExpansionRegion regionAsOutput = basicGetRegionAsOutput();
+			if (regionAsOutput != null)
+				msgs = ((InternalEObject) regionAsOutput).eInverseRemove(this, UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT, ExpansionRegion.class, msgs);
+			return basicSetRegionAsOutput((ExpansionRegion) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -246,34 +223,28 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.EXPANSION_NODE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_NODE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_NODE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.EXPANSION_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_NODE__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.EXPANSION_NODE__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.EXPANSION_NODE__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.EXPANSION_NODE__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_NODE__UPPER_BOUND :
-				return basicSetUpperBound(null, msgs);
-			case UMLPackage.EXPANSION_NODE__REGION_AS_INPUT :
-				return basicSetRegionAsInput(null, msgs);
-			case UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT :
-				return basicSetRegionAsOutput(null, msgs);
+		case UMLPackage.EXPANSION_NODE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_NODE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_NODE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.EXPANSION_NODE__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_NODE__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.EXPANSION_NODE__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_NODE__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_NODE__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_NODE__UPPER_BOUND:
+			return basicSetUpperBound(null, msgs);
+		case UMLPackage.EXPANSION_NODE__REGION_AS_INPUT:
+			return basicSetRegionAsInput(null, msgs);
+		case UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT:
+			return basicSetRegionAsOutput(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -286,84 +257,84 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.EXPANSION_NODE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.EXPANSION_NODE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.EXPANSION_NODE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.EXPANSION_NODE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.EXPANSION_NODE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.EXPANSION_NODE__NAME :
-				return getName();
-			case UMLPackage.EXPANSION_NODE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.EXPANSION_NODE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.EXPANSION_NODE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXPANSION_NODE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.EXPANSION_NODE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.EXPANSION_NODE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.EXPANSION_NODE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.EXPANSION_NODE__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.EXPANSION_NODE__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.EXPANSION_NODE__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.EXPANSION_NODE__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.EXPANSION_NODE__INCOMING :
-				return getIncomings();
-			case UMLPackage.EXPANSION_NODE__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.EXPANSION_NODE__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.EXPANSION_NODE__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.EXPANSION_NODE__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.EXPANSION_NODE__IN_STATE :
-				return getInStates();
-			case UMLPackage.EXPANSION_NODE__IS_CONTROL_TYPE :
-				return isControlType();
-			case UMLPackage.EXPANSION_NODE__ORDERING :
-				return getOrdering();
-			case UMLPackage.EXPANSION_NODE__SELECTION :
-				if (resolve)
-					return getSelection();
-				return basicGetSelection();
-			case UMLPackage.EXPANSION_NODE__UPPER_BOUND :
-				if (resolve)
-					return getUpperBound();
-				return basicGetUpperBound();
-			case UMLPackage.EXPANSION_NODE__REGION_AS_INPUT :
-				if (resolve)
-					return getRegionAsInput();
-				return basicGetRegionAsInput();
-			case UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT :
-				if (resolve)
-					return getRegionAsOutput();
-				return basicGetRegionAsOutput();
+		case UMLPackage.EXPANSION_NODE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.EXPANSION_NODE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.EXPANSION_NODE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.EXPANSION_NODE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.EXPANSION_NODE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.EXPANSION_NODE__NAME:
+			return getName();
+		case UMLPackage.EXPANSION_NODE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.EXPANSION_NODE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.EXPANSION_NODE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXPANSION_NODE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.EXPANSION_NODE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.EXPANSION_NODE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.EXPANSION_NODE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.EXPANSION_NODE__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.EXPANSION_NODE__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.EXPANSION_NODE__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.EXPANSION_NODE__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.EXPANSION_NODE__INCOMING:
+			return getIncomings();
+		case UMLPackage.EXPANSION_NODE__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.EXPANSION_NODE__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.EXPANSION_NODE__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.EXPANSION_NODE__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.EXPANSION_NODE__IN_STATE:
+			return getInStates();
+		case UMLPackage.EXPANSION_NODE__IS_CONTROL_TYPE:
+			return isControlType();
+		case UMLPackage.EXPANSION_NODE__ORDERING:
+			return getOrdering();
+		case UMLPackage.EXPANSION_NODE__SELECTION:
+			if (resolve)
+				return getSelection();
+			return basicGetSelection();
+		case UMLPackage.EXPANSION_NODE__UPPER_BOUND:
+			if (resolve)
+				return getUpperBound();
+			return basicGetUpperBound();
+		case UMLPackage.EXPANSION_NODE__REGION_AS_INPUT:
+			if (resolve)
+				return getRegionAsInput();
+			return basicGetRegionAsInput();
+		case UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT:
+			if (resolve)
+				return getRegionAsOutput();
+			return basicGetRegionAsOutput();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -377,84 +348,77 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.EXPANSION_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__IN_STATE :
-				getInStates().clear();
-				getInStates().addAll((Collection<? extends State>) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__IS_CONTROL_TYPE :
-				setIsControlType((Boolean) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__ORDERING :
-				setOrdering((ObjectNodeOrderingKind) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__SELECTION :
-				setSelection((Behavior) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__UPPER_BOUND :
-				setUpperBound((ValueSpecification) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__REGION_AS_INPUT :
-				setRegionAsInput((ExpansionRegion) newValue);
-				return;
-			case UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT :
-				setRegionAsOutput((ExpansionRegion) newValue);
-				return;
+		case UMLPackage.EXPANSION_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__IN_STATE:
+			getInStates().clear();
+			getInStates().addAll((Collection<? extends State>) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__IS_CONTROL_TYPE:
+			setIsControlType((Boolean) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__ORDERING:
+			setOrdering((ObjectNodeOrderingKind) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__SELECTION:
+			setSelection((Behavior) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__UPPER_BOUND:
+			setUpperBound((ValueSpecification) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__REGION_AS_INPUT:
+			setRegionAsInput((ExpansionRegion) newValue);
+			return;
+		case UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT:
+			setRegionAsOutput((ExpansionRegion) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -467,69 +431,69 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXPANSION_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.EXPANSION_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.EXPANSION_NODE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.EXPANSION_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.EXPANSION_NODE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.EXPANSION_NODE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.EXPANSION_NODE__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.EXPANSION_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.EXPANSION_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.EXPANSION_NODE__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.EXPANSION_NODE__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.EXPANSION_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.EXPANSION_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.EXPANSION_NODE__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.EXPANSION_NODE__IN_STATE :
-				getInStates().clear();
-				return;
-			case UMLPackage.EXPANSION_NODE__IS_CONTROL_TYPE :
-				setIsControlType(IS_CONTROL_TYPE_EDEFAULT);
-				return;
-			case UMLPackage.EXPANSION_NODE__ORDERING :
-				setOrdering(ORDERING_EDEFAULT);
-				return;
-			case UMLPackage.EXPANSION_NODE__SELECTION :
-				setSelection((Behavior) null);
-				return;
-			case UMLPackage.EXPANSION_NODE__UPPER_BOUND :
-				setUpperBound((ValueSpecification) null);
-				return;
-			case UMLPackage.EXPANSION_NODE__REGION_AS_INPUT :
-				setRegionAsInput((ExpansionRegion) null);
-				return;
-			case UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT :
-				setRegionAsOutput((ExpansionRegion) null);
-				return;
+		case UMLPackage.EXPANSION_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.EXPANSION_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.EXPANSION_NODE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.EXPANSION_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.EXPANSION_NODE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.EXPANSION_NODE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.EXPANSION_NODE__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.EXPANSION_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.EXPANSION_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.EXPANSION_NODE__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.EXPANSION_NODE__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.EXPANSION_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.EXPANSION_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.EXPANSION_NODE__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.EXPANSION_NODE__IN_STATE:
+			getInStates().clear();
+			return;
+		case UMLPackage.EXPANSION_NODE__IS_CONTROL_TYPE:
+			setIsControlType(IS_CONTROL_TYPE_EDEFAULT);
+			return;
+		case UMLPackage.EXPANSION_NODE__ORDERING:
+			setOrdering(ORDERING_EDEFAULT);
+			return;
+		case UMLPackage.EXPANSION_NODE__SELECTION:
+			setSelection((Behavior) null);
+			return;
+		case UMLPackage.EXPANSION_NODE__UPPER_BOUND:
+			setUpperBound((ValueSpecification) null);
+			return;
+		case UMLPackage.EXPANSION_NODE__REGION_AS_INPUT:
+			setRegionAsInput((ExpansionRegion) null);
+			return;
+		case UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT:
+			setRegionAsOutput((ExpansionRegion) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -542,66 +506,64 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXPANSION_NODE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.EXPANSION_NODE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.EXPANSION_NODE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.EXPANSION_NODE__OWNER :
-				return isSetOwner();
-			case UMLPackage.EXPANSION_NODE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.EXPANSION_NODE__NAME :
-				return isSetName();
-			case UMLPackage.EXPANSION_NODE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.EXPANSION_NODE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.EXPANSION_NODE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.EXPANSION_NODE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.EXPANSION_NODE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.EXPANSION_NODE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.EXPANSION_NODE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.EXPANSION_NODE__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.EXPANSION_NODE__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.EXPANSION_NODE__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.EXPANSION_NODE__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.EXPANSION_NODE__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.EXPANSION_NODE__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.EXPANSION_NODE__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.EXPANSION_NODE__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.EXPANSION_NODE__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.EXPANSION_NODE__IN_STATE :
-				return !getInStates().isEmpty();
-			case UMLPackage.EXPANSION_NODE__IS_CONTROL_TYPE :
-				return isControlType() != IS_CONTROL_TYPE_EDEFAULT;
-			case UMLPackage.EXPANSION_NODE__ORDERING :
-				return getOrdering() != ORDERING_EDEFAULT;
-			case UMLPackage.EXPANSION_NODE__SELECTION :
-				return basicGetSelection() != null;
-			case UMLPackage.EXPANSION_NODE__UPPER_BOUND :
-				return basicGetUpperBound() != null;
-			case UMLPackage.EXPANSION_NODE__REGION_AS_INPUT :
-				return basicGetRegionAsInput() != null;
-			case UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT :
-				return basicGetRegionAsOutput() != null;
+		case UMLPackage.EXPANSION_NODE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.EXPANSION_NODE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.EXPANSION_NODE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.EXPANSION_NODE__OWNER:
+			return isSetOwner();
+		case UMLPackage.EXPANSION_NODE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.EXPANSION_NODE__NAME:
+			return isSetName();
+		case UMLPackage.EXPANSION_NODE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.EXPANSION_NODE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.EXPANSION_NODE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.EXPANSION_NODE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.EXPANSION_NODE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.EXPANSION_NODE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.EXPANSION_NODE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.EXPANSION_NODE__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.EXPANSION_NODE__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.EXPANSION_NODE__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.EXPANSION_NODE__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.EXPANSION_NODE__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.EXPANSION_NODE__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.EXPANSION_NODE__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.EXPANSION_NODE__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.EXPANSION_NODE__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.EXPANSION_NODE__IN_STATE:
+			return !getInStates().isEmpty();
+		case UMLPackage.EXPANSION_NODE__IS_CONTROL_TYPE:
+			return isControlType() != IS_CONTROL_TYPE_EDEFAULT;
+		case UMLPackage.EXPANSION_NODE__ORDERING:
+			return getOrdering() != ORDERING_EDEFAULT;
+		case UMLPackage.EXPANSION_NODE__SELECTION:
+			return basicGetSelection() != null;
+		case UMLPackage.EXPANSION_NODE__UPPER_BOUND:
+			return basicGetUpperBound() != null;
+		case UMLPackage.EXPANSION_NODE__REGION_AS_INPUT:
+			return basicGetRegionAsInput() != null;
+		case UMLPackage.EXPANSION_NODE__REGION_AS_OUTPUT:
+			return basicGetRegionAsOutput() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -616,160 +578,130 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.EXPANSION_NODE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXPANSION_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXPANSION_NODE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.EXPANSION_NODE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.EXPANSION_NODE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.EXPANSION_NODE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.EXPANSION_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXPANSION_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___GET_MODEL :
-				return getModel();
-			case UMLPackage.EXPANSION_NODE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.EXPANSION_NODE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.EXPANSION_NODE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.EXPANSION_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.EXPANSION_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.EXPANSION_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.EXPANSION_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXPANSION_NODE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXPANSION_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.EXPANSION_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.EXPANSION_NODE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.EXPANSION_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXPANSION_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXPANSION_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXPANSION_NODE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.EXPANSION_NODE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.EXPANSION_NODE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.EXPANSION_NODE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.EXPANSION_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.EXPANSION_NODE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXPANSION_NODE___SEPARATOR :
-				return separator();
-			case UMLPackage.EXPANSION_NODE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.EXPANSION_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXPANSION_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXPANSION_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXPANSION_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.EXPANSION_NODE___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.EXPANSION_NODE___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP :
-				return validateInputOutputParameter(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXPANSION_NODE___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateSelectionBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXPANSION_NODE___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateObjectFlowEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXPANSION_NODE___VALIDATE_REGION_AS_INPUT_OR_OUTPUT__DIAGNOSTICCHAIN_MAP :
-				return validateRegionAsInputOrOutput(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.EXPANSION_NODE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.EXPANSION_NODE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.EXPANSION_NODE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.EXPANSION_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___GET_MODEL:
+			return getModel();
+		case UMLPackage.EXPANSION_NODE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.EXPANSION_NODE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.EXPANSION_NODE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.EXPANSION_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.EXPANSION_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.EXPANSION_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.EXPANSION_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.EXPANSION_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.EXPANSION_NODE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.EXPANSION_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.EXPANSION_NODE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.EXPANSION_NODE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.EXPANSION_NODE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.EXPANSION_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXPANSION_NODE___SEPARATOR:
+			return separator();
+		case UMLPackage.EXPANSION_NODE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.EXPANSION_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.EXPANSION_NODE___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.EXPANSION_NODE___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP:
+			return validateInputOutputParameter((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateSelectionBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateObjectFlowEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXPANSION_NODE___VALIDATE_REGION_AS_INPUT_OR_OUTPUT__DIAGNOSTICCHAIN_MAP:
+			return validateRegionAsInputOrOutput((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExpansionRegionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExpansionRegionImpl.java
index e62b920..43da6e6 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExpansionRegionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExpansionRegionImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -16,6 +16,7 @@
 
 import java.util.Collection;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -24,6 +25,9 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Activity;
@@ -102,9 +106,7 @@
 	 * @generated
 	 */
 	public ExpansionKind getMode() {
-		return (ExpansionKind) eDynamicGet(
-			UMLPackage.EXPANSION_REGION__MODE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXPANSION_REGION__MODE, true, true);
+		return (ExpansionKind) eDynamicGet(UMLPackage.EXPANSION_REGION__MODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXPANSION_REGION__MODE, true, true);
 	}
 
 	/**
@@ -113,8 +115,7 @@
 	 * @generated
 	 */
 	public void setMode(ExpansionKind newMode) {
-		eDynamicSet(UMLPackage.EXPANSION_REGION__MODE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXPANSION_REGION__MODE, newMode);
+		eDynamicSet(UMLPackage.EXPANSION_REGION__MODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXPANSION_REGION__MODE, newMode);
 	}
 
 	/**
@@ -124,9 +125,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ExpansionNode> getInputElements() {
-		return (EList<ExpansionNode>) eDynamicGet(
-			UMLPackage.EXPANSION_REGION__INPUT_ELEMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXPANSION_REGION__INPUT_ELEMENT, true, true);
+		return (EList<ExpansionNode>) eDynamicGet(UMLPackage.EXPANSION_REGION__INPUT_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXPANSION_REGION__INPUT_ELEMENT, true, true);
 	}
 
 	/**
@@ -145,10 +144,8 @@
 	 */
 	public ExpansionNode getInputElement(String name, Type type,
 			boolean ignoreCase) {
-		inputElementLoop : for (ExpansionNode inputElement : getInputElements()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(inputElement.getName())
-				: name.equals(inputElement.getName())))
+		inputElementLoop: for (ExpansionNode inputElement : getInputElements()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(inputElement.getName()) : name.equals(inputElement.getName())))
 				continue inputElementLoop;
 			if (type != null && !type.equals(inputElement.getType()))
 				continue inputElementLoop;
@@ -164,9 +161,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ExpansionNode> getOutputElements() {
-		return (EList<ExpansionNode>) eDynamicGet(
-			UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXPANSION_REGION__OUTPUT_ELEMENT, true, true);
+		return (EList<ExpansionNode>) eDynamicGet(UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXPANSION_REGION__OUTPUT_ELEMENT, true, true);
 	}
 
 	/**
@@ -185,10 +180,8 @@
 	 */
 	public ExpansionNode getOutputElement(String name, Type type,
 			boolean ignoreCase) {
-		outputElementLoop : for (ExpansionNode outputElement : getOutputElements()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(outputElement.getName())
-				: name.equals(outputElement.getName())))
+		outputElementLoop: for (ExpansionNode outputElement : getOutputElements()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(outputElement.getName()) : name.equals(outputElement.getName())))
 				continue outputElementLoop;
 			if (type != null && !type.equals(outputElement.getType()))
 				continue outputElementLoop;
@@ -207,53 +200,38 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.EXPANSION_REGION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__IN_STRUCTURED_NODE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetInStructuredNode(
-					(StructuredActivityNode) otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__INCOMING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__OUTGOING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__IN_PARTITION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__HANDLER :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getHandlers())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__EDGE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEdges())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__VARIABLE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getVariables())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__NODE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getNodes())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutputElements())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__INPUT_ELEMENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInputElements())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__IN_STRUCTURED_NODE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetInStructuredNode((StructuredActivityNode) otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__INCOMING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__OUTGOING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__IN_PARTITION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__HANDLER:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getHandlers()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__EDGE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEdges()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__VARIABLE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getVariables()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__NODE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getNodes()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutputElements()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__INPUT_ELEMENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInputElements()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -267,67 +245,48 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.EXPANSION_REGION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.EXPANSION_REGION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.EXPANSION_REGION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.EXPANSION_REGION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.EXPANSION_REGION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.EXPANSION_REGION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__EDGE :
-				return ((InternalEList<?>) getEdges()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_INPUT :
-				return ((InternalEList<?>) getStructuredNodeInputs())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_OUTPUT :
-				return ((InternalEList<?>) getStructuredNodeOutputs())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__VARIABLE :
-				return ((InternalEList<?>) getVariables()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.EXPANSION_REGION__NODE :
-				return ((InternalEList<?>) getNodes()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT :
-				return ((InternalEList<?>) getOutputElements())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPANSION_REGION__INPUT_ELEMENT :
-				return ((InternalEList<?>) getInputElements())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.EXPANSION_REGION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.EXPANSION_REGION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__EDGE:
+			return ((InternalEList<?>) getEdges()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_INPUT:
+			return ((InternalEList<?>) getStructuredNodeInputs()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_OUTPUT:
+			return ((InternalEList<?>) getStructuredNodeOutputs()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__VARIABLE:
+			return ((InternalEList<?>) getVariables()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__NODE:
+			return ((InternalEList<?>) getNodes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT:
+			return ((InternalEList<?>) getOutputElements()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPANSION_REGION__INPUT_ELEMENT:
+			return ((InternalEList<?>) getInputElements()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -340,118 +299,118 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.EXPANSION_REGION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.EXPANSION_REGION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.EXPANSION_REGION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.EXPANSION_REGION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.EXPANSION_REGION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.EXPANSION_REGION__NAME :
-				return getName();
-			case UMLPackage.EXPANSION_REGION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.EXPANSION_REGION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.EXPANSION_REGION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXPANSION_REGION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.EXPANSION_REGION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.EXPANSION_REGION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.EXPANSION_REGION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.EXPANSION_REGION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.EXPANSION_REGION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.EXPANSION_REGION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.EXPANSION_REGION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.EXPANSION_REGION__INCOMING :
-				return getIncomings();
-			case UMLPackage.EXPANSION_REGION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.EXPANSION_REGION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.EXPANSION_REGION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.EXPANSION_REGION__HANDLER :
-				return getHandlers();
-			case UMLPackage.EXPANSION_REGION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.EXPANSION_REGION__INPUT :
-				return getInputs();
-			case UMLPackage.EXPANSION_REGION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.EXPANSION_REGION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.EXPANSION_REGION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.EXPANSION_REGION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.EXPANSION_REGION__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.EXPANSION_REGION__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.EXPANSION_REGION__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.EXPANSION_REGION__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.EXPANSION_REGION__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.EXPANSION_REGION__MEMBER :
-				return getMembers();
-			case UMLPackage.EXPANSION_REGION__CONTAINED_EDGE :
-				return getContainedEdges();
-			case UMLPackage.EXPANSION_REGION__CONTAINED_NODE :
-				return getContainedNodes();
-			case UMLPackage.EXPANSION_REGION__IN_ACTIVITY :
-				if (resolve)
-					return getInActivity();
-				return basicGetInActivity();
-			case UMLPackage.EXPANSION_REGION__SUBGROUP :
-				return getSubgroups();
-			case UMLPackage.EXPANSION_REGION__SUPER_GROUP :
-				if (resolve)
-					return getSuperGroup();
-				return basicGetSuperGroup();
-			case UMLPackage.EXPANSION_REGION__EDGE :
-				return getEdges();
-			case UMLPackage.EXPANSION_REGION__MUST_ISOLATE :
-				return isMustIsolate();
-			case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_INPUT :
-				return getStructuredNodeInputs();
-			case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_OUTPUT :
-				return getStructuredNodeOutputs();
-			case UMLPackage.EXPANSION_REGION__VARIABLE :
-				return getVariables();
-			case UMLPackage.EXPANSION_REGION__NODE :
-				return getNodes();
-			case UMLPackage.EXPANSION_REGION__MODE :
-				return getMode();
-			case UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT :
-				return getOutputElements();
-			case UMLPackage.EXPANSION_REGION__INPUT_ELEMENT :
-				return getInputElements();
+		case UMLPackage.EXPANSION_REGION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.EXPANSION_REGION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.EXPANSION_REGION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.EXPANSION_REGION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.EXPANSION_REGION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.EXPANSION_REGION__NAME:
+			return getName();
+		case UMLPackage.EXPANSION_REGION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.EXPANSION_REGION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.EXPANSION_REGION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXPANSION_REGION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.EXPANSION_REGION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.EXPANSION_REGION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.EXPANSION_REGION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.EXPANSION_REGION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.EXPANSION_REGION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.EXPANSION_REGION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.EXPANSION_REGION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.EXPANSION_REGION__INCOMING:
+			return getIncomings();
+		case UMLPackage.EXPANSION_REGION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.EXPANSION_REGION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.EXPANSION_REGION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.EXPANSION_REGION__HANDLER:
+			return getHandlers();
+		case UMLPackage.EXPANSION_REGION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.EXPANSION_REGION__INPUT:
+			return getInputs();
+		case UMLPackage.EXPANSION_REGION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.EXPANSION_REGION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.EXPANSION_REGION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.EXPANSION_REGION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.EXPANSION_REGION__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.EXPANSION_REGION__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.EXPANSION_REGION__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.EXPANSION_REGION__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.EXPANSION_REGION__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.EXPANSION_REGION__MEMBER:
+			return getMembers();
+		case UMLPackage.EXPANSION_REGION__CONTAINED_EDGE:
+			return getContainedEdges();
+		case UMLPackage.EXPANSION_REGION__CONTAINED_NODE:
+			return getContainedNodes();
+		case UMLPackage.EXPANSION_REGION__IN_ACTIVITY:
+			if (resolve)
+				return getInActivity();
+			return basicGetInActivity();
+		case UMLPackage.EXPANSION_REGION__SUBGROUP:
+			return getSubgroups();
+		case UMLPackage.EXPANSION_REGION__SUPER_GROUP:
+			if (resolve)
+				return getSuperGroup();
+			return basicGetSuperGroup();
+		case UMLPackage.EXPANSION_REGION__EDGE:
+			return getEdges();
+		case UMLPackage.EXPANSION_REGION__MUST_ISOLATE:
+			return isMustIsolate();
+		case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_INPUT:
+			return getStructuredNodeInputs();
+		case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_OUTPUT:
+			return getStructuredNodeOutputs();
+		case UMLPackage.EXPANSION_REGION__VARIABLE:
+			return getVariables();
+		case UMLPackage.EXPANSION_REGION__NODE:
+			return getNodes();
+		case UMLPackage.EXPANSION_REGION__MODE:
+			return getMode();
+		case UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT:
+			return getOutputElements();
+		case UMLPackage.EXPANSION_REGION__INPUT_ELEMENT:
+			return getInputElements();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -465,136 +424,116 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.EXPANSION_REGION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__IN_ACTIVITY :
-				setInActivity((Activity) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__EDGE :
-				getEdges().clear();
-				getEdges()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__MUST_ISOLATE :
-				setMustIsolate((Boolean) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_INPUT :
-				getStructuredNodeInputs().clear();
-				getStructuredNodeInputs()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_OUTPUT :
-				getStructuredNodeOutputs().clear();
-				getStructuredNodeOutputs()
-					.addAll((Collection<? extends OutputPin>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__VARIABLE :
-				getVariables().clear();
-				getVariables()
-					.addAll((Collection<? extends Variable>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__NODE :
-				getNodes().clear();
-				getNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__MODE :
-				setMode((ExpansionKind) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT :
-				getOutputElements().clear();
-				getOutputElements()
-					.addAll((Collection<? extends ExpansionNode>) newValue);
-				return;
-			case UMLPackage.EXPANSION_REGION__INPUT_ELEMENT :
-				getInputElements().clear();
-				getInputElements()
-					.addAll((Collection<? extends ExpansionNode>) newValue);
-				return;
+		case UMLPackage.EXPANSION_REGION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__IN_ACTIVITY:
+			setInActivity((Activity) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__EDGE:
+			getEdges().clear();
+			getEdges().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__MUST_ISOLATE:
+			setMustIsolate((Boolean) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_INPUT:
+			getStructuredNodeInputs().clear();
+			getStructuredNodeInputs().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_OUTPUT:
+			getStructuredNodeOutputs().clear();
+			getStructuredNodeOutputs().addAll((Collection<? extends OutputPin>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__VARIABLE:
+			getVariables().clear();
+			getVariables().addAll((Collection<? extends Variable>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__NODE:
+			getNodes().clear();
+			getNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__MODE:
+			setMode((ExpansionKind) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT:
+			getOutputElements().clear();
+			getOutputElements().addAll((Collection<? extends ExpansionNode>) newValue);
+			return;
+		case UMLPackage.EXPANSION_REGION__INPUT_ELEMENT:
+			getInputElements().clear();
+			getInputElements().addAll((Collection<? extends ExpansionNode>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -607,96 +546,96 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXPANSION_REGION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.EXPANSION_REGION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.EXPANSION_REGION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.EXPANSION_REGION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.EXPANSION_REGION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.EXPANSION_REGION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.EXPANSION_REGION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.EXPANSION_REGION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__IN_ACTIVITY :
-				setInActivity((Activity) null);
-				return;
-			case UMLPackage.EXPANSION_REGION__EDGE :
-				getEdges().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__MUST_ISOLATE :
-				setMustIsolate(MUST_ISOLATE_EDEFAULT);
-				return;
-			case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_INPUT :
-				getStructuredNodeInputs().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_OUTPUT :
-				getStructuredNodeOutputs().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__VARIABLE :
-				getVariables().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__NODE :
-				getNodes().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__MODE :
-				setMode(MODE_EDEFAULT);
-				return;
-			case UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT :
-				getOutputElements().clear();
-				return;
-			case UMLPackage.EXPANSION_REGION__INPUT_ELEMENT :
-				getInputElements().clear();
-				return;
+		case UMLPackage.EXPANSION_REGION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.EXPANSION_REGION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.EXPANSION_REGION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.EXPANSION_REGION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.EXPANSION_REGION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.EXPANSION_REGION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.EXPANSION_REGION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.EXPANSION_REGION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__IN_ACTIVITY:
+			setInActivity((Activity) null);
+			return;
+		case UMLPackage.EXPANSION_REGION__EDGE:
+			getEdges().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__MUST_ISOLATE:
+			setMustIsolate(MUST_ISOLATE_EDEFAULT);
+			return;
+		case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_INPUT:
+			getStructuredNodeInputs().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_OUTPUT:
+			getStructuredNodeOutputs().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__VARIABLE:
+			getVariables().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__NODE:
+			getNodes().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__MODE:
+			setMode(MODE_EDEFAULT);
+			return;
+		case UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT:
+			getOutputElements().clear();
+			return;
+		case UMLPackage.EXPANSION_REGION__INPUT_ELEMENT:
+			getInputElements().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -709,104 +648,102 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXPANSION_REGION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.EXPANSION_REGION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.EXPANSION_REGION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.EXPANSION_REGION__OWNER :
-				return isSetOwner();
-			case UMLPackage.EXPANSION_REGION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.EXPANSION_REGION__NAME :
-				return isSetName();
-			case UMLPackage.EXPANSION_REGION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.EXPANSION_REGION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.EXPANSION_REGION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.EXPANSION_REGION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.EXPANSION_REGION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.EXPANSION_REGION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.EXPANSION_REGION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.EXPANSION_REGION__ACTIVITY :
-				return isSetActivity();
-			case UMLPackage.EXPANSION_REGION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.EXPANSION_REGION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.EXPANSION_REGION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.EXPANSION_REGION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.EXPANSION_REGION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.EXPANSION_REGION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.EXPANSION_REGION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.EXPANSION_REGION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.EXPANSION_REGION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.EXPANSION_REGION__INPUT :
-				return isSetInputs();
-			case UMLPackage.EXPANSION_REGION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.EXPANSION_REGION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.EXPANSION_REGION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.EXPANSION_REGION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.EXPANSION_REGION__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.EXPANSION_REGION__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.EXPANSION_REGION__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.EXPANSION_REGION__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.EXPANSION_REGION__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.EXPANSION_REGION__MEMBER :
-				return isSetMembers();
-			case UMLPackage.EXPANSION_REGION__CONTAINED_EDGE :
-				return isSetContainedEdges();
-			case UMLPackage.EXPANSION_REGION__CONTAINED_NODE :
-				return isSetContainedNodes();
-			case UMLPackage.EXPANSION_REGION__IN_ACTIVITY :
-				return isSetInActivity();
-			case UMLPackage.EXPANSION_REGION__SUBGROUP :
-				return isSetSubgroups();
-			case UMLPackage.EXPANSION_REGION__SUPER_GROUP :
-				return isSetSuperGroup();
-			case UMLPackage.EXPANSION_REGION__EDGE :
-				return !getEdges().isEmpty();
-			case UMLPackage.EXPANSION_REGION__MUST_ISOLATE :
-				return isMustIsolate() != MUST_ISOLATE_EDEFAULT;
-			case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_INPUT :
-				return !getStructuredNodeInputs().isEmpty();
-			case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_OUTPUT :
-				return !getStructuredNodeOutputs().isEmpty();
-			case UMLPackage.EXPANSION_REGION__VARIABLE :
-				return !getVariables().isEmpty();
-			case UMLPackage.EXPANSION_REGION__NODE :
-				return !getNodes().isEmpty();
-			case UMLPackage.EXPANSION_REGION__MODE :
-				return getMode() != MODE_EDEFAULT;
-			case UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT :
-				return !getOutputElements().isEmpty();
-			case UMLPackage.EXPANSION_REGION__INPUT_ELEMENT :
-				return !getInputElements().isEmpty();
+		case UMLPackage.EXPANSION_REGION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.EXPANSION_REGION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.EXPANSION_REGION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.EXPANSION_REGION__OWNER:
+			return isSetOwner();
+		case UMLPackage.EXPANSION_REGION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.EXPANSION_REGION__NAME:
+			return isSetName();
+		case UMLPackage.EXPANSION_REGION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.EXPANSION_REGION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.EXPANSION_REGION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.EXPANSION_REGION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.EXPANSION_REGION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.EXPANSION_REGION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.EXPANSION_REGION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.EXPANSION_REGION__ACTIVITY:
+			return isSetActivity();
+		case UMLPackage.EXPANSION_REGION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.EXPANSION_REGION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.EXPANSION_REGION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.EXPANSION_REGION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.EXPANSION_REGION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.EXPANSION_REGION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.EXPANSION_REGION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.EXPANSION_REGION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.EXPANSION_REGION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.EXPANSION_REGION__INPUT:
+			return isSetInputs();
+		case UMLPackage.EXPANSION_REGION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.EXPANSION_REGION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.EXPANSION_REGION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.EXPANSION_REGION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.EXPANSION_REGION__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.EXPANSION_REGION__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.EXPANSION_REGION__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.EXPANSION_REGION__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.EXPANSION_REGION__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.EXPANSION_REGION__MEMBER:
+			return isSetMembers();
+		case UMLPackage.EXPANSION_REGION__CONTAINED_EDGE:
+			return isSetContainedEdges();
+		case UMLPackage.EXPANSION_REGION__CONTAINED_NODE:
+			return isSetContainedNodes();
+		case UMLPackage.EXPANSION_REGION__IN_ACTIVITY:
+			return isSetInActivity();
+		case UMLPackage.EXPANSION_REGION__SUBGROUP:
+			return isSetSubgroups();
+		case UMLPackage.EXPANSION_REGION__SUPER_GROUP:
+			return isSetSuperGroup();
+		case UMLPackage.EXPANSION_REGION__EDGE:
+			return !getEdges().isEmpty();
+		case UMLPackage.EXPANSION_REGION__MUST_ISOLATE:
+			return isMustIsolate() != MUST_ISOLATE_EDEFAULT;
+		case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_INPUT:
+			return !getStructuredNodeInputs().isEmpty();
+		case UMLPackage.EXPANSION_REGION__STRUCTURED_NODE_OUTPUT:
+			return !getStructuredNodeOutputs().isEmpty();
+		case UMLPackage.EXPANSION_REGION__VARIABLE:
+			return !getVariables().isEmpty();
+		case UMLPackage.EXPANSION_REGION__NODE:
+			return !getNodes().isEmpty();
+		case UMLPackage.EXPANSION_REGION__MODE:
+			return getMode() != MODE_EDEFAULT;
+		case UMLPackage.EXPANSION_REGION__OUTPUT_ELEMENT:
+			return !getOutputElements().isEmpty();
+		case UMLPackage.EXPANSION_REGION__INPUT_ELEMENT:
+			return !getInputElements().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExpressionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExpressionImpl.java
index 76306e8..93d65c7 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExpressionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExpressionImpl.java
@@ -1,20 +1,21 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
- *   Kenn Hussey - 519572
+ *   Kenn Hussey - 519572, 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -23,8 +24,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -99,20 +103,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.EXPRESSION__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.EXPRESSION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.EXPRESSION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.EXPRESSION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -121,9 +118,7 @@
 	 * @generated
 	 */
 	public String getSymbol() {
-		return (String) eDynamicGet(
-			UMLPackage.EXPRESSION__SYMBOL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXPRESSION__SYMBOL, true, true);
+		return (String) eDynamicGet(UMLPackage.EXPRESSION__SYMBOL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXPRESSION__SYMBOL, true, true);
 	}
 
 	/**
@@ -132,8 +127,7 @@
 	 * @generated
 	 */
 	public void setSymbol(String newSymbol) {
-		eDynamicSet(UMLPackage.EXPRESSION__SYMBOL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXPRESSION__SYMBOL, newSymbol);
+		eDynamicSet(UMLPackage.EXPRESSION__SYMBOL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXPRESSION__SYMBOL, newSymbol);
 	}
 
 	/**
@@ -142,8 +136,7 @@
 	 * @generated
 	 */
 	public void unsetSymbol() {
-		eDynamicUnset(UMLPackage.EXPRESSION__SYMBOL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXPRESSION__SYMBOL);
+		eDynamicUnset(UMLPackage.EXPRESSION__SYMBOL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXPRESSION__SYMBOL);
 	}
 
 	/**
@@ -152,9 +145,7 @@
 	 * @generated
 	 */
 	public boolean isSetSymbol() {
-		return eDynamicIsSet(
-			UMLPackage.EXPRESSION__SYMBOL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXPRESSION__SYMBOL);
+		return eDynamicIsSet(UMLPackage.EXPRESSION__SYMBOL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXPRESSION__SYMBOL);
 	}
 
 	/**
@@ -164,9 +155,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ValueSpecification> getOperands() {
-		return (EList<ValueSpecification>) eDynamicGet(
-			UMLPackage.EXPRESSION__OPERAND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXPRESSION__OPERAND, true, true);
+		return (EList<ValueSpecification>) eDynamicGet(UMLPackage.EXPRESSION__OPERAND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXPRESSION__OPERAND, true, true);
 	}
 
 	/**
@@ -201,20 +190,16 @@
 	 */
 	public ValueSpecification getOperand(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		operandLoop : for (ValueSpecification operand : getOperands()) {
+		operandLoop: for (ValueSpecification operand : getOperands()) {
 			if (eClass != null && !eClass.isInstance(operand))
 				continue operandLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(operand.getName())
-				: name.equals(operand.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(operand.getName()) : name.equals(operand.getName())))
 				continue operandLoop;
 			if (type != null && !type.equals(operand.getType()))
 				continue operandLoop;
 			return operand;
 		}
-		return createOnDemand && eClass != null
-			? createOperand(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOperand(name, type, eClass) : null;
 	}
 
 	/**
@@ -226,21 +211,18 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.EXPRESSION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPRESSION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXPRESSION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.EXPRESSION__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.EXPRESSION__OPERAND :
-				return ((InternalEList<?>) getOperands()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.EXPRESSION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPRESSION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXPRESSION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.EXPRESSION__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.EXPRESSION__OPERAND:
+			return ((InternalEList<?>) getOperands()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -253,48 +235,48 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.EXPRESSION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.EXPRESSION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.EXPRESSION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.EXPRESSION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.EXPRESSION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.EXPRESSION__NAME :
-				return getName();
-			case UMLPackage.EXPRESSION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.EXPRESSION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.EXPRESSION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXPRESSION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.EXPRESSION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.EXPRESSION__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.EXPRESSION__OPERAND :
-				return getOperands();
-			case UMLPackage.EXPRESSION__SYMBOL :
-				return getSymbol();
+		case UMLPackage.EXPRESSION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.EXPRESSION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.EXPRESSION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.EXPRESSION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.EXPRESSION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.EXPRESSION__NAME:
+			return getName();
+		case UMLPackage.EXPRESSION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.EXPRESSION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.EXPRESSION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXPRESSION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.EXPRESSION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.EXPRESSION__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.EXPRESSION__OPERAND:
+			return getOperands();
+		case UMLPackage.EXPRESSION__SYMBOL:
+			return getSymbol();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -308,42 +290,39 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.EXPRESSION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.EXPRESSION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.EXPRESSION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.EXPRESSION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.EXPRESSION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.EXPRESSION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.EXPRESSION__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.EXPRESSION__OPERAND :
-				getOperands().clear();
-				getOperands().addAll(
-					(Collection<? extends ValueSpecification>) newValue);
-				return;
-			case UMLPackage.EXPRESSION__SYMBOL :
-				setSymbol((String) newValue);
-				return;
+		case UMLPackage.EXPRESSION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.EXPRESSION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.EXPRESSION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.EXPRESSION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.EXPRESSION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.EXPRESSION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.EXPRESSION__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.EXPRESSION__OPERAND:
+			getOperands().clear();
+			getOperands().addAll((Collection<? extends ValueSpecification>) newValue);
+			return;
+		case UMLPackage.EXPRESSION__SYMBOL:
+			setSymbol((String) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -356,36 +335,36 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXPRESSION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.EXPRESSION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.EXPRESSION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.EXPRESSION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.EXPRESSION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.EXPRESSION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.EXPRESSION__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.EXPRESSION__OPERAND :
-				getOperands().clear();
-				return;
-			case UMLPackage.EXPRESSION__SYMBOL :
-				unsetSymbol();
-				return;
+		case UMLPackage.EXPRESSION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.EXPRESSION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.EXPRESSION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.EXPRESSION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.EXPRESSION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.EXPRESSION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.EXPRESSION__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.EXPRESSION__OPERAND:
+			getOperands().clear();
+			return;
+		case UMLPackage.EXPRESSION__SYMBOL:
+			unsetSymbol();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -398,38 +377,36 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXPRESSION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.EXPRESSION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.EXPRESSION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.EXPRESSION__OWNER :
-				return isSetOwner();
-			case UMLPackage.EXPRESSION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.EXPRESSION__NAME :
-				return isSetName();
-			case UMLPackage.EXPRESSION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.EXPRESSION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.EXPRESSION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.EXPRESSION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.EXPRESSION__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.EXPRESSION__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.EXPRESSION__OPERAND :
-				return !getOperands().isEmpty();
-			case UMLPackage.EXPRESSION__SYMBOL :
-				return isSetSymbol();
+		case UMLPackage.EXPRESSION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.EXPRESSION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.EXPRESSION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.EXPRESSION__OWNER:
+			return isSetOwner();
+		case UMLPackage.EXPRESSION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.EXPRESSION__NAME:
+			return isSetName();
+		case UMLPackage.EXPRESSION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.EXPRESSION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.EXPRESSION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.EXPRESSION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.EXPRESSION__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.EXPRESSION__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.EXPRESSION__OPERAND:
+			return !getOperands().isEmpty();
+		case UMLPackage.EXPRESSION__SYMBOL:
+			return isSetSymbol();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -442,9 +419,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.EXPRESSION__OWNED_COMMENT,
-		UMLPackage.EXPRESSION__NAME_EXPRESSION, UMLPackage.EXPRESSION__OPERAND};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.EXPRESSION__OWNED_COMMENT, UMLPackage.EXPRESSION__NAME_EXPRESSION, UMLPackage.EXPRESSION__OPERAND };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -454,7 +429,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.EXPRESSION__OPERAND);
+				|| eIsSet(UMLPackage.EXPRESSION__OPERAND);
 	}
 
 } //ExpressionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtendImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtendImpl.java
index 8812d8e..025c01b 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtendImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtendImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,8 +28,12 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -105,20 +110,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> relatedElements = (EList<Element>) cache.get(
-				eResource, this,
-				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
+			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<Element>(
-						Element.class, this, UMLPackage.EXTEND__RELATED_ELEMENT,
-						RELATED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT, relatedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.EXTEND__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.EXTEND__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.EXTEND__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -131,19 +129,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> sources = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			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>(
-						Element.class, this, UMLPackage.EXTEND__SOURCE,
-						SOURCE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE, sources = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.EXTEND__SOURCE, SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.EXTEND__SOURCE, SOURCE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.EXTEND__SOURCE, SOURCE_ESUBSETS);
 	}
 
 	/**
@@ -156,19 +148,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> targets = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			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>(
-						Element.class, this, UMLPackage.EXTEND__TARGET,
-						TARGET_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET, targets = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.EXTEND__TARGET, TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.EXTEND__TARGET, TARGET_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.EXTEND__TARGET, TARGET_ESUBSETS);
 	}
 
 	/**
@@ -182,19 +168,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.EXTEND__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.EXTEND__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.EXTEND__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.EXTEND__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -203,9 +183,7 @@
 	 * @generated
 	 */
 	public UseCase getExtendedCase() {
-		return (UseCase) eDynamicGet(
-			UMLPackage.EXTEND__EXTENDED_CASE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXTEND__EXTENDED_CASE, true, true);
+		return (UseCase) eDynamicGet(UMLPackage.EXTEND__EXTENDED_CASE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXTEND__EXTENDED_CASE, true, true);
 	}
 
 	/**
@@ -214,9 +192,7 @@
 	 * @generated
 	 */
 	public UseCase basicGetExtendedCase() {
-		return (UseCase) eDynamicGet(
-			UMLPackage.EXTEND__EXTENDED_CASE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXTEND__EXTENDED_CASE, false, true);
+		return (UseCase) eDynamicGet(UMLPackage.EXTEND__EXTENDED_CASE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXTEND__EXTENDED_CASE, false, true);
 	}
 
 	/**
@@ -225,8 +201,7 @@
 	 * @generated
 	 */
 	public void setExtendedCase(UseCase newExtendedCase) {
-		eDynamicSet(UMLPackage.EXTEND__EXTENDED_CASE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXTEND__EXTENDED_CASE, newExtendedCase);
+		eDynamicSet(UMLPackage.EXTEND__EXTENDED_CASE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXTEND__EXTENDED_CASE, newExtendedCase);
 	}
 
 	/**
@@ -235,9 +210,7 @@
 	 * @generated
 	 */
 	public Constraint getCondition() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.EXTEND__CONDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXTEND__CONDITION, true, true);
+		return (Constraint) eDynamicGet(UMLPackage.EXTEND__CONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXTEND__CONDITION, true, true);
 	}
 
 	/**
@@ -246,9 +219,7 @@
 	 * @generated
 	 */
 	public Constraint basicGetCondition() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.EXTEND__CONDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXTEND__CONDITION, false, true);
+		return (Constraint) eDynamicGet(UMLPackage.EXTEND__CONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXTEND__CONDITION, false, true);
 	}
 
 	/**
@@ -258,8 +229,7 @@
 	 */
 	public NotificationChain basicSetCondition(Constraint newCondition,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newCondition,
-			UMLPackage.EXTEND__CONDITION, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newCondition, UMLPackage.EXTEND__CONDITION, msgs);
 		return msgs;
 	}
 
@@ -269,8 +239,7 @@
 	 * @generated
 	 */
 	public void setCondition(Constraint newCondition) {
-		eDynamicSet(UMLPackage.EXTEND__CONDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXTEND__CONDITION, newCondition);
+		eDynamicSet(UMLPackage.EXTEND__CONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXTEND__CONDITION, newCondition);
 	}
 
 	/**
@@ -302,9 +271,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ExtensionPoint> getExtensionLocations() {
-		return (EList<ExtensionPoint>) eDynamicGet(
-			UMLPackage.EXTEND__EXTENSION_LOCATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXTEND__EXTENSION_LOCATION, true, true);
+		return (EList<ExtensionPoint>) eDynamicGet(UMLPackage.EXTEND__EXTENSION_LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXTEND__EXTENSION_LOCATION, true, true);
 	}
 
 	/**
@@ -323,10 +290,8 @@
 	 */
 	public ExtensionPoint getExtensionLocation(String name,
 			boolean ignoreCase) {
-		extensionLocationLoop : for (ExtensionPoint extensionLocation : getExtensionLocations()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(extensionLocation.getName())
-				: name.equals(extensionLocation.getName())))
+		extensionLocationLoop: for (ExtensionPoint extensionLocation : getExtensionLocations()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(extensionLocation.getName()) : name.equals(extensionLocation.getName())))
 				continue extensionLocationLoop;
 			return extensionLocation;
 		}
@@ -339,9 +304,7 @@
 	 * @generated
 	 */
 	public UseCase getExtension() {
-		return (UseCase) eDynamicGet(
-			UMLPackage.EXTEND__EXTENSION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXTEND__EXTENSION, true, true);
+		return (UseCase) eDynamicGet(UMLPackage.EXTEND__EXTENSION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXTEND__EXTENSION, true, true);
 	}
 
 	/**
@@ -350,9 +313,7 @@
 	 * @generated
 	 */
 	public UseCase basicGetExtension() {
-		return (UseCase) eDynamicGet(
-			UMLPackage.EXTEND__EXTENSION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXTEND__EXTENSION, false, true);
+		return (UseCase) eDynamicGet(UMLPackage.EXTEND__EXTENSION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXTEND__EXTENSION, false, true);
 	}
 
 	/**
@@ -362,8 +323,7 @@
 	 */
 	public NotificationChain basicSetExtension(UseCase newExtension,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newExtension,
-			UMLPackage.EXTEND__EXTENSION, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newExtension, UMLPackage.EXTEND__EXTENSION, msgs);
 		return msgs;
 	}
 
@@ -373,8 +333,7 @@
 	 * @generated
 	 */
 	public void setExtension(UseCase newExtension) {
-		eDynamicSet(UMLPackage.EXTEND__EXTENSION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXTEND__EXTENSION, newExtension);
+		eDynamicSet(UMLPackage.EXTEND__EXTENSION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXTEND__EXTENSION, newExtension);
 	}
 
 	/**
@@ -384,8 +343,7 @@
 	 */
 	public boolean validateExtensionPoints(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ExtendOperations.validateExtensionPoints(this, diagnostics,
-			context);
+		return ExtendOperations.validateExtensionPoints(this, diagnostics, context);
 	}
 
 	/**
@@ -398,13 +356,12 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.EXTEND__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXTEND__EXTENSION :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetExtension((UseCase) otherEnd, msgs);
+		case UMLPackage.EXTEND__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXTEND__EXTENSION:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetExtension((UseCase) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -418,18 +375,16 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.EXTEND__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTEND__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTEND__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.EXTEND__CONDITION :
-				return basicSetCondition(null, msgs);
-			case UMLPackage.EXTEND__EXTENSION :
-				return basicSetExtension(null, msgs);
+		case UMLPackage.EXTEND__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTEND__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTEND__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.EXTEND__CONDITION:
+			return basicSetCondition(null, msgs);
+		case UMLPackage.EXTEND__EXTENSION:
+			return basicSetExtension(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -443,9 +398,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.EXTEND__EXTENSION :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.USE_CASE__EXTEND, UseCase.class, msgs);
+		case UMLPackage.EXTEND__EXTENSION:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.USE_CASE__EXTEND, UseCase.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -458,52 +412,52 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.EXTEND__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.EXTEND__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.EXTEND__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.EXTEND__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.EXTEND__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.EXTEND__NAME :
-				return getName();
-			case UMLPackage.EXTEND__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.EXTEND__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.EXTEND__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXTEND__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.EXTEND__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.EXTEND__SOURCE :
-				return getSources();
-			case UMLPackage.EXTEND__TARGET :
-				return getTargets();
-			case UMLPackage.EXTEND__CONDITION :
-				if (resolve)
-					return getCondition();
-				return basicGetCondition();
-			case UMLPackage.EXTEND__EXTENDED_CASE :
-				if (resolve)
-					return getExtendedCase();
-				return basicGetExtendedCase();
-			case UMLPackage.EXTEND__EXTENSION_LOCATION :
-				return getExtensionLocations();
-			case UMLPackage.EXTEND__EXTENSION :
-				if (resolve)
-					return getExtension();
-				return basicGetExtension();
+		case UMLPackage.EXTEND__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.EXTEND__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.EXTEND__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.EXTEND__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.EXTEND__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.EXTEND__NAME:
+			return getName();
+		case UMLPackage.EXTEND__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.EXTEND__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.EXTEND__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXTEND__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.EXTEND__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.EXTEND__SOURCE:
+			return getSources();
+		case UMLPackage.EXTEND__TARGET:
+			return getTargets();
+		case UMLPackage.EXTEND__CONDITION:
+			if (resolve)
+				return getCondition();
+			return basicGetCondition();
+		case UMLPackage.EXTEND__EXTENDED_CASE:
+			if (resolve)
+				return getExtendedCase();
+			return basicGetExtendedCase();
+		case UMLPackage.EXTEND__EXTENSION_LOCATION:
+			return getExtensionLocations();
+		case UMLPackage.EXTEND__EXTENSION:
+			if (resolve)
+				return getExtension();
+			return basicGetExtension();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -517,39 +471,36 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.EXTEND__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.EXTEND__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.EXTEND__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.EXTEND__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.EXTEND__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.EXTEND__CONDITION :
-				setCondition((Constraint) newValue);
-				return;
-			case UMLPackage.EXTEND__EXTENDED_CASE :
-				setExtendedCase((UseCase) newValue);
-				return;
-			case UMLPackage.EXTEND__EXTENSION_LOCATION :
-				getExtensionLocations().clear();
-				getExtensionLocations()
-					.addAll((Collection<? extends ExtensionPoint>) newValue);
-				return;
-			case UMLPackage.EXTEND__EXTENSION :
-				setExtension((UseCase) newValue);
-				return;
+		case UMLPackage.EXTEND__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.EXTEND__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.EXTEND__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.EXTEND__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.EXTEND__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.EXTEND__CONDITION:
+			setCondition((Constraint) newValue);
+			return;
+		case UMLPackage.EXTEND__EXTENDED_CASE:
+			setExtendedCase((UseCase) newValue);
+			return;
+		case UMLPackage.EXTEND__EXTENSION_LOCATION:
+			getExtensionLocations().clear();
+			getExtensionLocations().addAll((Collection<? extends ExtensionPoint>) newValue);
+			return;
+		case UMLPackage.EXTEND__EXTENSION:
+			setExtension((UseCase) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -562,33 +513,33 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXTEND__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.EXTEND__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.EXTEND__NAME :
-				unsetName();
-				return;
-			case UMLPackage.EXTEND__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.EXTEND__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.EXTEND__CONDITION :
-				setCondition((Constraint) null);
-				return;
-			case UMLPackage.EXTEND__EXTENDED_CASE :
-				setExtendedCase((UseCase) null);
-				return;
-			case UMLPackage.EXTEND__EXTENSION_LOCATION :
-				getExtensionLocations().clear();
-				return;
-			case UMLPackage.EXTEND__EXTENSION :
-				setExtension((UseCase) null);
-				return;
+		case UMLPackage.EXTEND__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.EXTEND__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.EXTEND__NAME:
+			unsetName();
+			return;
+		case UMLPackage.EXTEND__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.EXTEND__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.EXTEND__CONDITION:
+			setCondition((Constraint) null);
+			return;
+		case UMLPackage.EXTEND__EXTENDED_CASE:
+			setExtendedCase((UseCase) null);
+			return;
+		case UMLPackage.EXTEND__EXTENSION_LOCATION:
+			getExtensionLocations().clear();
+			return;
+		case UMLPackage.EXTEND__EXTENSION:
+			setExtension((UseCase) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -601,42 +552,40 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXTEND__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.EXTEND__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.EXTEND__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.EXTEND__OWNER :
-				return isSetOwner();
-			case UMLPackage.EXTEND__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.EXTEND__NAME :
-				return isSetName();
-			case UMLPackage.EXTEND__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.EXTEND__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.EXTEND__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.EXTEND__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.EXTEND__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.EXTEND__SOURCE :
-				return isSetSources();
-			case UMLPackage.EXTEND__TARGET :
-				return isSetTargets();
-			case UMLPackage.EXTEND__CONDITION :
-				return basicGetCondition() != null;
-			case UMLPackage.EXTEND__EXTENDED_CASE :
-				return basicGetExtendedCase() != null;
-			case UMLPackage.EXTEND__EXTENSION_LOCATION :
-				return !getExtensionLocations().isEmpty();
-			case UMLPackage.EXTEND__EXTENSION :
-				return basicGetExtension() != null;
+		case UMLPackage.EXTEND__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.EXTEND__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.EXTEND__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.EXTEND__OWNER:
+			return isSetOwner();
+		case UMLPackage.EXTEND__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.EXTEND__NAME:
+			return isSetName();
+		case UMLPackage.EXTEND__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.EXTEND__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.EXTEND__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.EXTEND__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.EXTEND__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.EXTEND__SOURCE:
+			return isSetSources();
+		case UMLPackage.EXTEND__TARGET:
+			return isSetTargets();
+		case UMLPackage.EXTEND__CONDITION:
+			return basicGetCondition() != null;
+		case UMLPackage.EXTEND__EXTENDED_CASE:
+			return basicGetExtendedCase() != null;
+		case UMLPackage.EXTEND__EXTENSION_LOCATION:
+			return !getExtensionLocations().isEmpty();
+		case UMLPackage.EXTEND__EXTENSION:
+			return basicGetExtension() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -651,20 +600,20 @@
 			Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.EXTEND__RELATED_ELEMENT :
-					return UMLPackage.RELATIONSHIP__RELATED_ELEMENT;
-				default :
-					return -1;
+			case UMLPackage.EXTEND__RELATED_ELEMENT:
+				return UMLPackage.RELATIONSHIP__RELATED_ELEMENT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == DirectedRelationship.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.EXTEND__SOURCE :
-					return UMLPackage.DIRECTED_RELATIONSHIP__SOURCE;
-				case UMLPackage.EXTEND__TARGET :
-					return UMLPackage.DIRECTED_RELATIONSHIP__TARGET;
-				default :
-					return -1;
+			case UMLPackage.EXTEND__SOURCE:
+				return UMLPackage.DIRECTED_RELATIONSHIP__SOURCE;
+			case UMLPackage.EXTEND__TARGET:
+				return UMLPackage.DIRECTED_RELATIONSHIP__TARGET;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -680,20 +629,20 @@
 			Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.RELATIONSHIP__RELATED_ELEMENT :
-					return UMLPackage.EXTEND__RELATED_ELEMENT;
-				default :
-					return -1;
+			case UMLPackage.RELATIONSHIP__RELATED_ELEMENT:
+				return UMLPackage.EXTEND__RELATED_ELEMENT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == DirectedRelationship.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.DIRECTED_RELATIONSHIP__SOURCE :
-					return UMLPackage.EXTEND__SOURCE;
-				case UMLPackage.DIRECTED_RELATIONSHIP__TARGET :
-					return UMLPackage.EXTEND__TARGET;
-				default :
-					return -1;
+			case UMLPackage.DIRECTED_RELATIONSHIP__SOURCE:
+				return UMLPackage.EXTEND__SOURCE;
+			case UMLPackage.DIRECTED_RELATIONSHIP__TARGET:
+				return UMLPackage.EXTEND__TARGET;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -709,129 +658,112 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.EXTEND___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.EXTEND___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTEND___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTEND___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.EXTEND___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.EXTEND___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.EXTEND___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.EXTEND___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.EXTEND___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.EXTEND___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.EXTEND___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.EXTEND___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.EXTEND___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXTEND___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.EXTEND___GET_MODEL :
-				return getModel();
-			case UMLPackage.EXTEND___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.EXTEND___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.EXTEND___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.EXTEND___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.EXTEND___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.EXTEND___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.EXTEND___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.EXTEND___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.EXTEND___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.EXTEND___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.EXTEND___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.EXTEND___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXTEND___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.EXTEND___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXTEND___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.EXTEND___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.EXTEND___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.EXTEND___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.EXTEND___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.EXTEND___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.EXTEND___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.EXTEND___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.EXTEND___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTEND___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTEND___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTEND___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.EXTEND___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.EXTEND___GET_LABEL :
-				return getLabel();
-			case UMLPackage.EXTEND___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.EXTEND___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.EXTEND___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.EXTEND___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.EXTEND___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.EXTEND___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXTEND___SEPARATOR :
-				return separator();
-			case UMLPackage.EXTEND___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.EXTEND___VALIDATE_EXTENSION_POINTS__DIAGNOSTICCHAIN_MAP :
-				return validateExtensionPoints(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTEND___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.EXTEND___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTEND___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTEND___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.EXTEND___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.EXTEND___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.EXTEND___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.EXTEND___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.EXTEND___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.EXTEND___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.EXTEND___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.EXTEND___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.EXTEND___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXTEND___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.EXTEND___GET_MODEL:
+			return getModel();
+		case UMLPackage.EXTEND___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.EXTEND___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.EXTEND___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXTEND___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.EXTEND___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.EXTEND___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.EXTEND___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXTEND___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.EXTEND___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.EXTEND___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.EXTEND___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXTEND___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXTEND___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.EXTEND___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXTEND___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.EXTEND___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.EXTEND___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.EXTEND___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.EXTEND___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.EXTEND___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.EXTEND___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.EXTEND___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.EXTEND___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTEND___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTEND___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTEND___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.EXTEND___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.EXTEND___GET_LABEL:
+			return getLabel();
+		case UMLPackage.EXTEND___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.EXTEND___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.EXTEND___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.EXTEND___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.EXTEND___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.EXTEND___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXTEND___SEPARATOR:
+			return separator();
+		case UMLPackage.EXTEND___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.EXTEND___VALIDATE_EXTENSION_POINTS__DIAGNOSTICCHAIN_MAP:
+			return validateExtensionPoints((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -844,8 +776,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] RELATED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.EXTEND__SOURCE, UMLPackage.EXTEND__TARGET};
+	protected static final int[] RELATED_ELEMENT_ESUBSETS = new int[] { UMLPackage.EXTEND__SOURCE, UMLPackage.EXTEND__TARGET };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -853,7 +784,8 @@
 	 * @generated
 	 */
 	public boolean isSetRelatedElements() {
-		return isSetSources() || isSetTargets();
+		return isSetSources()
+				|| isSetTargets();
 	}
 
 	/**
@@ -864,8 +796,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SOURCE_ESUBSETS = new int[]{
-		UMLPackage.EXTEND__EXTENSION};
+	protected static final int[] SOURCE_ESUBSETS = new int[] { UMLPackage.EXTEND__EXTENSION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -884,8 +815,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] TARGET_ESUBSETS = new int[]{
-		UMLPackage.EXTEND__EXTENDED_CASE};
+	protected static final int[] TARGET_ESUBSETS = new int[] { UMLPackage.EXTEND__EXTENDED_CASE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -904,9 +834,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.EXTEND__OWNED_COMMENT, UMLPackage.EXTEND__NAME_EXPRESSION,
-		UMLPackage.EXTEND__CONDITION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.EXTEND__OWNED_COMMENT, UMLPackage.EXTEND__NAME_EXPRESSION, UMLPackage.EXTEND__CONDITION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -916,9 +844,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -943,7 +869,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.EXTEND__CONDITION);
+				|| eIsSet(UMLPackage.EXTEND__CONDITION);
 	}
 
 	/**
@@ -953,7 +879,8 @@
 	 */
 	@Override
 	public boolean isSetNamespace() {
-		return super.isSetNamespace() || eIsSet(UMLPackage.EXTEND__EXTENSION);
+		return super.isSetNamespace()
+				|| eIsSet(UMLPackage.EXTEND__EXTENSION);
 	}
 
 } //ExtendImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtensionEndImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtensionEndImpl.java
index 91942dd..0925768 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtensionEndImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtensionEndImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 212765, 418466, 451350, 485756
  *
  */
@@ -17,11 +17,17 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.uml2.uml.AggregationKind;
 import org.eclipse.uml2.uml.Association;
 import org.eclipse.uml2.uml.Comment;
@@ -89,9 +95,7 @@
 	 */
 	@Override
 	public Type getType() {
-		return (Type) eDynamicGet(
-			UMLPackage.EXTENSION_END__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TYPED_ELEMENT__TYPE, true, true);
+		return (Type) eDynamicGet(UMLPackage.EXTENSION_END__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TYPED_ELEMENT__TYPE, true, true);
 	}
 
 	/**
@@ -101,9 +105,7 @@
 	 */
 	@Override
 	public Type basicGetType() {
-		return (Type) eDynamicGet(
-			UMLPackage.EXTENSION_END__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TYPED_ELEMENT__TYPE, false, true);
+		return (Type) eDynamicGet(UMLPackage.EXTENSION_END__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TYPED_ELEMENT__TYPE, false, true);
 	}
 
 	/**
@@ -114,11 +116,9 @@
 	@Override
 	public void setType(Type newType) {
 		if (newType != null && !(newType instanceof Stereotype)) {
-			throw new IllegalArgumentException(
-				"newType must be an instance of Stereotype"); //$NON-NLS-1$
+			throw new IllegalArgumentException("newType must be an instance of Stereotype"); //$NON-NLS-1$
 		}
-		eDynamicSet(UMLPackage.EXTENSION_END__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TYPED_ELEMENT__TYPE, newType);
+		eDynamicSet(UMLPackage.EXTENSION_END__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TYPED_ELEMENT__TYPE, newType);
 	}
 
 	/**
@@ -166,8 +166,7 @@
 	 */
 	public boolean validateMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ExtensionEndOperations.validateMultiplicity(this, diagnostics,
-			context);
+		return ExtensionEndOperations.validateMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -177,8 +176,7 @@
 	 */
 	public boolean validateAggregation(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ExtensionEndOperations.validateAggregation(this, diagnostics,
-			context);
+		return ExtensionEndOperations.validateAggregation(this, diagnostics, context);
 	}
 
 	/**
@@ -199,128 +197,128 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION_END__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.EXTENSION_END__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.EXTENSION_END__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.EXTENSION_END__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.EXTENSION_END__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.EXTENSION_END__NAME :
-				return getName();
-			case UMLPackage.EXTENSION_END__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.EXTENSION_END__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.EXTENSION_END__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXTENSION_END__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.EXTENSION_END__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.EXTENSION_END__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.EXTENSION_END__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.EXTENSION_END__FEATURING_CLASSIFIER :
-				return getFeaturingClassifiers();
-			case UMLPackage.EXTENSION_END__IS_STATIC :
-				return isStatic();
-			case UMLPackage.EXTENSION_END__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.EXTENSION_END__IS_ORDERED :
-				return isOrdered();
-			case UMLPackage.EXTENSION_END__IS_UNIQUE :
-				return isUnique();
-			case UMLPackage.EXTENSION_END__LOWER :
-				return getLower();
-			case UMLPackage.EXTENSION_END__LOWER_VALUE :
-				if (resolve)
-					return getLowerValue();
-				return basicGetLowerValue();
-			case UMLPackage.EXTENSION_END__UPPER :
-				return getUpper();
-			case UMLPackage.EXTENSION_END__UPPER_VALUE :
-				if (resolve)
-					return getUpperValue();
-				return basicGetUpperValue();
-			case UMLPackage.EXTENSION_END__IS_READ_ONLY :
-				return isReadOnly();
-			case UMLPackage.EXTENSION_END__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.EXTENSION_END__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.EXTENSION_END__END :
-				return getEnds();
-			case UMLPackage.EXTENSION_END__DEPLOYED_ELEMENT :
-				return getDeployedElements();
-			case UMLPackage.EXTENSION_END__DEPLOYMENT :
-				return getDeployments();
-			case UMLPackage.EXTENSION_END__DATATYPE :
-				if (resolve)
-					return getDatatype();
-				return basicGetDatatype();
-			case UMLPackage.EXTENSION_END__INTERFACE :
-				if (resolve)
-					return getInterface();
-				return basicGetInterface();
-			case UMLPackage.EXTENSION_END__DEFAULT :
-				return getDefault();
-			case UMLPackage.EXTENSION_END__AGGREGATION :
-				return getAggregation();
-			case UMLPackage.EXTENSION_END__ASSOCIATION_END :
-				if (resolve)
-					return getAssociationEnd();
-				return basicGetAssociationEnd();
-			case UMLPackage.EXTENSION_END__QUALIFIER :
-				return getQualifiers();
-			case UMLPackage.EXTENSION_END__CLASS :
-				if (resolve)
-					return getClass_();
-				return basicGetClass_();
-			case UMLPackage.EXTENSION_END__DEFAULT_VALUE :
-				if (resolve)
-					return getDefaultValue();
-				return basicGetDefaultValue();
-			case UMLPackage.EXTENSION_END__IS_COMPOSITE :
-				return isComposite();
-			case UMLPackage.EXTENSION_END__IS_DERIVED :
-				return isDerived();
-			case UMLPackage.EXTENSION_END__IS_DERIVED_UNION :
-				return isDerivedUnion();
-			case UMLPackage.EXTENSION_END__IS_ID :
-				return isID();
-			case UMLPackage.EXTENSION_END__OPPOSITE :
-				if (resolve)
-					return getOpposite();
-				return basicGetOpposite();
-			case UMLPackage.EXTENSION_END__OWNING_ASSOCIATION :
-				if (resolve)
-					return getOwningAssociation();
-				return basicGetOwningAssociation();
-			case UMLPackage.EXTENSION_END__REDEFINED_PROPERTY :
-				return getRedefinedProperties();
-			case UMLPackage.EXTENSION_END__SUBSETTED_PROPERTY :
-				return getSubsettedProperties();
-			case UMLPackage.EXTENSION_END__ASSOCIATION :
-				if (resolve)
-					return getAssociation();
-				return basicGetAssociation();
+		case UMLPackage.EXTENSION_END__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.EXTENSION_END__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.EXTENSION_END__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.EXTENSION_END__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.EXTENSION_END__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.EXTENSION_END__NAME:
+			return getName();
+		case UMLPackage.EXTENSION_END__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.EXTENSION_END__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.EXTENSION_END__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXTENSION_END__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.EXTENSION_END__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.EXTENSION_END__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.EXTENSION_END__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.EXTENSION_END__FEATURING_CLASSIFIER:
+			return getFeaturingClassifiers();
+		case UMLPackage.EXTENSION_END__IS_STATIC:
+			return isStatic();
+		case UMLPackage.EXTENSION_END__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.EXTENSION_END__IS_ORDERED:
+			return isOrdered();
+		case UMLPackage.EXTENSION_END__IS_UNIQUE:
+			return isUnique();
+		case UMLPackage.EXTENSION_END__LOWER:
+			return getLower();
+		case UMLPackage.EXTENSION_END__LOWER_VALUE:
+			if (resolve)
+				return getLowerValue();
+			return basicGetLowerValue();
+		case UMLPackage.EXTENSION_END__UPPER:
+			return getUpper();
+		case UMLPackage.EXTENSION_END__UPPER_VALUE:
+			if (resolve)
+				return getUpperValue();
+			return basicGetUpperValue();
+		case UMLPackage.EXTENSION_END__IS_READ_ONLY:
+			return isReadOnly();
+		case UMLPackage.EXTENSION_END__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.EXTENSION_END__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.EXTENSION_END__END:
+			return getEnds();
+		case UMLPackage.EXTENSION_END__DEPLOYED_ELEMENT:
+			return getDeployedElements();
+		case UMLPackage.EXTENSION_END__DEPLOYMENT:
+			return getDeployments();
+		case UMLPackage.EXTENSION_END__DATATYPE:
+			if (resolve)
+				return getDatatype();
+			return basicGetDatatype();
+		case UMLPackage.EXTENSION_END__INTERFACE:
+			if (resolve)
+				return getInterface();
+			return basicGetInterface();
+		case UMLPackage.EXTENSION_END__DEFAULT:
+			return getDefault();
+		case UMLPackage.EXTENSION_END__AGGREGATION:
+			return getAggregation();
+		case UMLPackage.EXTENSION_END__ASSOCIATION_END:
+			if (resolve)
+				return getAssociationEnd();
+			return basicGetAssociationEnd();
+		case UMLPackage.EXTENSION_END__QUALIFIER:
+			return getQualifiers();
+		case UMLPackage.EXTENSION_END__CLASS:
+			if (resolve)
+				return getClass_();
+			return basicGetClass_();
+		case UMLPackage.EXTENSION_END__DEFAULT_VALUE:
+			if (resolve)
+				return getDefaultValue();
+			return basicGetDefaultValue();
+		case UMLPackage.EXTENSION_END__IS_COMPOSITE:
+			return isComposite();
+		case UMLPackage.EXTENSION_END__IS_DERIVED:
+			return isDerived();
+		case UMLPackage.EXTENSION_END__IS_DERIVED_UNION:
+			return isDerivedUnion();
+		case UMLPackage.EXTENSION_END__IS_ID:
+			return isID();
+		case UMLPackage.EXTENSION_END__OPPOSITE:
+			if (resolve)
+				return getOpposite();
+			return basicGetOpposite();
+		case UMLPackage.EXTENSION_END__OWNING_ASSOCIATION:
+			if (resolve)
+				return getOwningAssociation();
+			return basicGetOwningAssociation();
+		case UMLPackage.EXTENSION_END__REDEFINED_PROPERTY:
+			return getRedefinedProperties();
+		case UMLPackage.EXTENSION_END__SUBSETTED_PROPERTY:
+			return getSubsettedProperties();
+		case UMLPackage.EXTENSION_END__ASSOCIATION:
+			if (resolve)
+				return getAssociation();
+			return basicGetAssociation();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -334,120 +332,114 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION_END__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__IS_STATIC :
-				setIsStatic((Boolean) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__IS_ORDERED :
-				setIsOrdered((Boolean) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__IS_UNIQUE :
-				setIsUnique((Boolean) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__LOWER :
-				setLower((Integer) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__LOWER_VALUE :
-				setLowerValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__UPPER :
-				setUpper((Integer) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__UPPER_VALUE :
-				setUpperValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__IS_READ_ONLY :
-				setIsReadOnly((Boolean) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__DEPLOYMENT :
-				getDeployments().clear();
-				getDeployments()
-					.addAll((Collection<? extends Deployment>) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__DATATYPE :
-				setDatatype((DataType) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__INTERFACE :
-				setInterface((Interface) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__DEFAULT :
-				setDefault((String) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__AGGREGATION :
-				setAggregation((AggregationKind) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__ASSOCIATION_END :
-				setAssociationEnd((Property) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__QUALIFIER :
-				getQualifiers().clear();
-				getQualifiers()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__DEFAULT_VALUE :
-				setDefaultValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__IS_COMPOSITE :
-				setIsComposite((Boolean) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__IS_DERIVED :
-				setIsDerived((Boolean) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__IS_DERIVED_UNION :
-				setIsDerivedUnion((Boolean) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__IS_ID :
-				setIsID((Boolean) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__OPPOSITE :
-				setOpposite((Property) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__OWNING_ASSOCIATION :
-				setOwningAssociation((Association) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__REDEFINED_PROPERTY :
-				getRedefinedProperties().clear();
-				getRedefinedProperties()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__SUBSETTED_PROPERTY :
-				getSubsettedProperties().clear();
-				getSubsettedProperties()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.EXTENSION_END__ASSOCIATION :
-				setAssociation((Association) newValue);
-				return;
+		case UMLPackage.EXTENSION_END__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__IS_STATIC:
+			setIsStatic((Boolean) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__IS_ORDERED:
+			setIsOrdered((Boolean) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__IS_UNIQUE:
+			setIsUnique((Boolean) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__LOWER:
+			setLower((Integer) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__LOWER_VALUE:
+			setLowerValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__UPPER:
+			setUpper((Integer) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__UPPER_VALUE:
+			setUpperValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__IS_READ_ONLY:
+			setIsReadOnly((Boolean) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__DEPLOYMENT:
+			getDeployments().clear();
+			getDeployments().addAll((Collection<? extends Deployment>) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__DATATYPE:
+			setDatatype((DataType) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__INTERFACE:
+			setInterface((Interface) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__DEFAULT:
+			setDefault((String) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__AGGREGATION:
+			setAggregation((AggregationKind) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__ASSOCIATION_END:
+			setAssociationEnd((Property) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__QUALIFIER:
+			getQualifiers().clear();
+			getQualifiers().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__DEFAULT_VALUE:
+			setDefaultValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__IS_COMPOSITE:
+			setIsComposite((Boolean) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__IS_DERIVED:
+			setIsDerived((Boolean) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__IS_DERIVED_UNION:
+			setIsDerivedUnion((Boolean) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__IS_ID:
+			setIsID((Boolean) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__OPPOSITE:
+			setOpposite((Property) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__OWNING_ASSOCIATION:
+			setOwningAssociation((Association) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__REDEFINED_PROPERTY:
+			getRedefinedProperties().clear();
+			getRedefinedProperties().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__SUBSETTED_PROPERTY:
+			getSubsettedProperties().clear();
+			getSubsettedProperties().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.EXTENSION_END__ASSOCIATION:
+			setAssociation((Association) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -460,108 +452,108 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION_END__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.EXTENSION_END__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.EXTENSION_END__NAME :
-				unsetName();
-				return;
-			case UMLPackage.EXTENSION_END__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.EXTENSION_END__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.EXTENSION_END__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION_END__IS_STATIC :
-				setIsStatic(IS_STATIC_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION_END__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.EXTENSION_END__IS_ORDERED :
-				setIsOrdered(IS_ORDERED_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION_END__IS_UNIQUE :
-				setIsUnique(IS_UNIQUE_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION_END__LOWER :
-				setLower(LOWER_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION_END__LOWER_VALUE :
-				setLowerValue((ValueSpecification) null);
-				return;
-			case UMLPackage.EXTENSION_END__UPPER :
-				setUpper(UPPER_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION_END__UPPER_VALUE :
-				setUpperValue((ValueSpecification) null);
-				return;
-			case UMLPackage.EXTENSION_END__IS_READ_ONLY :
-				setIsReadOnly(IS_READ_ONLY_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION_END__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.EXTENSION_END__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.EXTENSION_END__DEPLOYMENT :
-				getDeployments().clear();
-				return;
-			case UMLPackage.EXTENSION_END__DATATYPE :
-				setDatatype((DataType) null);
-				return;
-			case UMLPackage.EXTENSION_END__INTERFACE :
-				setInterface((Interface) null);
-				return;
-			case UMLPackage.EXTENSION_END__DEFAULT :
-				unsetDefault();
-				return;
-			case UMLPackage.EXTENSION_END__AGGREGATION :
-				setAggregation(AGGREGATION_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION_END__ASSOCIATION_END :
-				setAssociationEnd((Property) null);
-				return;
-			case UMLPackage.EXTENSION_END__QUALIFIER :
-				getQualifiers().clear();
-				return;
-			case UMLPackage.EXTENSION_END__DEFAULT_VALUE :
-				setDefaultValue((ValueSpecification) null);
-				return;
-			case UMLPackage.EXTENSION_END__IS_COMPOSITE :
-				setIsComposite(IS_COMPOSITE_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION_END__IS_DERIVED :
-				setIsDerived(IS_DERIVED_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION_END__IS_DERIVED_UNION :
-				setIsDerivedUnion(IS_DERIVED_UNION_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION_END__IS_ID :
-				setIsID(IS_ID_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION_END__OPPOSITE :
-				setOpposite((Property) null);
-				return;
-			case UMLPackage.EXTENSION_END__OWNING_ASSOCIATION :
-				setOwningAssociation((Association) null);
-				return;
-			case UMLPackage.EXTENSION_END__REDEFINED_PROPERTY :
-				getRedefinedProperties().clear();
-				return;
-			case UMLPackage.EXTENSION_END__SUBSETTED_PROPERTY :
-				getSubsettedProperties().clear();
-				return;
-			case UMLPackage.EXTENSION_END__ASSOCIATION :
-				setAssociation((Association) null);
-				return;
+		case UMLPackage.EXTENSION_END__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.EXTENSION_END__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.EXTENSION_END__NAME:
+			unsetName();
+			return;
+		case UMLPackage.EXTENSION_END__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.EXTENSION_END__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.EXTENSION_END__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION_END__IS_STATIC:
+			setIsStatic(IS_STATIC_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION_END__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.EXTENSION_END__IS_ORDERED:
+			setIsOrdered(IS_ORDERED_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION_END__IS_UNIQUE:
+			setIsUnique(IS_UNIQUE_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION_END__LOWER:
+			setLower(LOWER_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION_END__LOWER_VALUE:
+			setLowerValue((ValueSpecification) null);
+			return;
+		case UMLPackage.EXTENSION_END__UPPER:
+			setUpper(UPPER_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION_END__UPPER_VALUE:
+			setUpperValue((ValueSpecification) null);
+			return;
+		case UMLPackage.EXTENSION_END__IS_READ_ONLY:
+			setIsReadOnly(IS_READ_ONLY_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION_END__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.EXTENSION_END__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.EXTENSION_END__DEPLOYMENT:
+			getDeployments().clear();
+			return;
+		case UMLPackage.EXTENSION_END__DATATYPE:
+			setDatatype((DataType) null);
+			return;
+		case UMLPackage.EXTENSION_END__INTERFACE:
+			setInterface((Interface) null);
+			return;
+		case UMLPackage.EXTENSION_END__DEFAULT:
+			unsetDefault();
+			return;
+		case UMLPackage.EXTENSION_END__AGGREGATION:
+			setAggregation(AGGREGATION_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION_END__ASSOCIATION_END:
+			setAssociationEnd((Property) null);
+			return;
+		case UMLPackage.EXTENSION_END__QUALIFIER:
+			getQualifiers().clear();
+			return;
+		case UMLPackage.EXTENSION_END__DEFAULT_VALUE:
+			setDefaultValue((ValueSpecification) null);
+			return;
+		case UMLPackage.EXTENSION_END__IS_COMPOSITE:
+			setIsComposite(IS_COMPOSITE_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION_END__IS_DERIVED:
+			setIsDerived(IS_DERIVED_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION_END__IS_DERIVED_UNION:
+			setIsDerivedUnion(IS_DERIVED_UNION_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION_END__IS_ID:
+			setIsID(IS_ID_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION_END__OPPOSITE:
+			setOpposite((Property) null);
+			return;
+		case UMLPackage.EXTENSION_END__OWNING_ASSOCIATION:
+			setOwningAssociation((Association) null);
+			return;
+		case UMLPackage.EXTENSION_END__REDEFINED_PROPERTY:
+			getRedefinedProperties().clear();
+			return;
+		case UMLPackage.EXTENSION_END__SUBSETTED_PROPERTY:
+			getSubsettedProperties().clear();
+			return;
+		case UMLPackage.EXTENSION_END__ASSOCIATION:
+			setAssociation((Association) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -574,98 +566,96 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION_END__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.EXTENSION_END__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.EXTENSION_END__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.EXTENSION_END__OWNER :
-				return isSetOwner();
-			case UMLPackage.EXTENSION_END__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.EXTENSION_END__NAME :
-				return isSetName();
-			case UMLPackage.EXTENSION_END__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.EXTENSION_END__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.EXTENSION_END__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.EXTENSION_END__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.EXTENSION_END__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.EXTENSION_END__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.EXTENSION_END__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.EXTENSION_END__FEATURING_CLASSIFIER :
-				return isSetFeaturingClassifiers();
-			case UMLPackage.EXTENSION_END__IS_STATIC :
-				return isStatic() != IS_STATIC_EDEFAULT;
-			case UMLPackage.EXTENSION_END__TYPE :
-				return isSetType();
-			case UMLPackage.EXTENSION_END__IS_ORDERED :
-				return isOrdered() != IS_ORDERED_EDEFAULT;
-			case UMLPackage.EXTENSION_END__IS_UNIQUE :
-				return isUnique() != IS_UNIQUE_EDEFAULT;
-			case UMLPackage.EXTENSION_END__LOWER :
-				return isSetLower();
-			case UMLPackage.EXTENSION_END__LOWER_VALUE :
-				return basicGetLowerValue() != null;
-			case UMLPackage.EXTENSION_END__UPPER :
-				return getUpper() != UPPER_EDEFAULT;
-			case UMLPackage.EXTENSION_END__UPPER_VALUE :
-				return basicGetUpperValue() != null;
-			case UMLPackage.EXTENSION_END__IS_READ_ONLY :
-				return isReadOnly() != IS_READ_ONLY_EDEFAULT;
-			case UMLPackage.EXTENSION_END__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.EXTENSION_END__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.EXTENSION_END__END :
-				return !getEnds().isEmpty();
-			case UMLPackage.EXTENSION_END__DEPLOYED_ELEMENT :
-				return !getDeployedElements().isEmpty();
-			case UMLPackage.EXTENSION_END__DEPLOYMENT :
-				return !getDeployments().isEmpty();
-			case UMLPackage.EXTENSION_END__DATATYPE :
-				return basicGetDatatype() != null;
-			case UMLPackage.EXTENSION_END__INTERFACE :
-				return basicGetInterface() != null;
-			case UMLPackage.EXTENSION_END__DEFAULT :
-				return isSetDefault();
-			case UMLPackage.EXTENSION_END__AGGREGATION :
-				return getAggregation() != AGGREGATION_EDEFAULT;
-			case UMLPackage.EXTENSION_END__ASSOCIATION_END :
-				return basicGetAssociationEnd() != null;
-			case UMLPackage.EXTENSION_END__QUALIFIER :
-				return !getQualifiers().isEmpty();
-			case UMLPackage.EXTENSION_END__CLASS :
-				return basicGetClass_() != null;
-			case UMLPackage.EXTENSION_END__DEFAULT_VALUE :
-				return basicGetDefaultValue() != null;
-			case UMLPackage.EXTENSION_END__IS_COMPOSITE :
-				return isComposite() != IS_COMPOSITE_EDEFAULT;
-			case UMLPackage.EXTENSION_END__IS_DERIVED :
-				return isDerived() != IS_DERIVED_EDEFAULT;
-			case UMLPackage.EXTENSION_END__IS_DERIVED_UNION :
-				return isDerivedUnion() != IS_DERIVED_UNION_EDEFAULT;
-			case UMLPackage.EXTENSION_END__IS_ID :
-				return isID() != IS_ID_EDEFAULT;
-			case UMLPackage.EXTENSION_END__OPPOSITE :
-				return basicGetOpposite() != null;
-			case UMLPackage.EXTENSION_END__OWNING_ASSOCIATION :
-				return basicGetOwningAssociation() != null;
-			case UMLPackage.EXTENSION_END__REDEFINED_PROPERTY :
-				return !getRedefinedProperties().isEmpty();
-			case UMLPackage.EXTENSION_END__SUBSETTED_PROPERTY :
-				return !getSubsettedProperties().isEmpty();
-			case UMLPackage.EXTENSION_END__ASSOCIATION :
-				return basicGetAssociation() != null;
+		case UMLPackage.EXTENSION_END__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.EXTENSION_END__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.EXTENSION_END__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.EXTENSION_END__OWNER:
+			return isSetOwner();
+		case UMLPackage.EXTENSION_END__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.EXTENSION_END__NAME:
+			return isSetName();
+		case UMLPackage.EXTENSION_END__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.EXTENSION_END__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.EXTENSION_END__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.EXTENSION_END__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.EXTENSION_END__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.EXTENSION_END__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.EXTENSION_END__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.EXTENSION_END__FEATURING_CLASSIFIER:
+			return isSetFeaturingClassifiers();
+		case UMLPackage.EXTENSION_END__IS_STATIC:
+			return isStatic() != IS_STATIC_EDEFAULT;
+		case UMLPackage.EXTENSION_END__TYPE:
+			return isSetType();
+		case UMLPackage.EXTENSION_END__IS_ORDERED:
+			return isOrdered() != IS_ORDERED_EDEFAULT;
+		case UMLPackage.EXTENSION_END__IS_UNIQUE:
+			return isUnique() != IS_UNIQUE_EDEFAULT;
+		case UMLPackage.EXTENSION_END__LOWER:
+			return isSetLower();
+		case UMLPackage.EXTENSION_END__LOWER_VALUE:
+			return basicGetLowerValue() != null;
+		case UMLPackage.EXTENSION_END__UPPER:
+			return getUpper() != UPPER_EDEFAULT;
+		case UMLPackage.EXTENSION_END__UPPER_VALUE:
+			return basicGetUpperValue() != null;
+		case UMLPackage.EXTENSION_END__IS_READ_ONLY:
+			return isReadOnly() != IS_READ_ONLY_EDEFAULT;
+		case UMLPackage.EXTENSION_END__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.EXTENSION_END__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.EXTENSION_END__END:
+			return !getEnds().isEmpty();
+		case UMLPackage.EXTENSION_END__DEPLOYED_ELEMENT:
+			return !getDeployedElements().isEmpty();
+		case UMLPackage.EXTENSION_END__DEPLOYMENT:
+			return !getDeployments().isEmpty();
+		case UMLPackage.EXTENSION_END__DATATYPE:
+			return basicGetDatatype() != null;
+		case UMLPackage.EXTENSION_END__INTERFACE:
+			return basicGetInterface() != null;
+		case UMLPackage.EXTENSION_END__DEFAULT:
+			return isSetDefault();
+		case UMLPackage.EXTENSION_END__AGGREGATION:
+			return getAggregation() != AGGREGATION_EDEFAULT;
+		case UMLPackage.EXTENSION_END__ASSOCIATION_END:
+			return basicGetAssociationEnd() != null;
+		case UMLPackage.EXTENSION_END__QUALIFIER:
+			return !getQualifiers().isEmpty();
+		case UMLPackage.EXTENSION_END__CLASS:
+			return basicGetClass_() != null;
+		case UMLPackage.EXTENSION_END__DEFAULT_VALUE:
+			return basicGetDefaultValue() != null;
+		case UMLPackage.EXTENSION_END__IS_COMPOSITE:
+			return isComposite() != IS_COMPOSITE_EDEFAULT;
+		case UMLPackage.EXTENSION_END__IS_DERIVED:
+			return isDerived() != IS_DERIVED_EDEFAULT;
+		case UMLPackage.EXTENSION_END__IS_DERIVED_UNION:
+			return isDerivedUnion() != IS_DERIVED_UNION_EDEFAULT;
+		case UMLPackage.EXTENSION_END__IS_ID:
+			return isID() != IS_ID_EDEFAULT;
+		case UMLPackage.EXTENSION_END__OPPOSITE:
+			return basicGetOpposite() != null;
+		case UMLPackage.EXTENSION_END__OWNING_ASSOCIATION:
+			return basicGetOwningAssociation() != null;
+		case UMLPackage.EXTENSION_END__REDEFINED_PROPERTY:
+			return !getRedefinedProperties().isEmpty();
+		case UMLPackage.EXTENSION_END__SUBSETTED_PROPERTY:
+			return !getSubsettedProperties().isEmpty();
+		case UMLPackage.EXTENSION_END__ASSOCIATION:
+			return basicGetAssociation() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -680,296 +670,237 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.EXTENSION_END___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.EXTENSION_END___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.EXTENSION_END___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION_END___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.EXTENSION_END___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.EXTENSION_END___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.EXTENSION_END___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.EXTENSION_END___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.EXTENSION_END___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.EXTENSION_END___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.EXTENSION_END___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXTENSION_END___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION_END___GET_MODEL :
-				return getModel();
-			case UMLPackage.EXTENSION_END___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.EXTENSION_END___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.EXTENSION_END___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.EXTENSION_END___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.EXTENSION_END___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.EXTENSION_END___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.EXTENSION_END___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.EXTENSION_END___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION_END___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.EXTENSION_END___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.EXTENSION_END___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.EXTENSION_END___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXTENSION_END___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.EXTENSION_END___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXTENSION_END___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION_END___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION_END___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION_END___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.EXTENSION_END___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.EXTENSION_END___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION_END___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.EXTENSION_END___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.EXTENSION_END___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.EXTENSION_END___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.EXTENSION_END___GET_LABEL :
-				return getLabel();
-			case UMLPackage.EXTENSION_END___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.EXTENSION_END___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.EXTENSION_END___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.EXTENSION_END___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.EXTENSION_END___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.EXTENSION_END___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXTENSION_END___SEPARATOR :
-				return separator();
-			case UMLPackage.EXTENSION_END___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.EXTENSION_END___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.EXTENSION_END___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.EXTENSION_END___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-				return validateUpperGeLower((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-				return validateLowerGe0((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationNoSideEffects(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationConstant(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-				return validateLowerIsInteger(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-				return validateUpperIsUnlimitedNatural(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___SET_LOWER__INT :
-				setLower((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.EXTENSION_END___SET_UPPER__INT :
-				setUpper((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.EXTENSION_END___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-				return compatibleWith((MultiplicityElement) arguments.get(0));
-			case UMLPackage.EXTENSION_END___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-				return includesMultiplicity(
-					(MultiplicityElement) arguments.get(0));
-			case UMLPackage.EXTENSION_END___IS__INT_INT :
-				return is((Integer) arguments.get(0),
-					(Integer) arguments.get(1));
-			case UMLPackage.EXTENSION_END___IS_MULTIVALUED :
-				return isMultivalued();
-			case UMLPackage.EXTENSION_END___GET_LOWER :
-				return getLower();
-			case UMLPackage.EXTENSION_END___LOWER_BOUND :
-				return lowerBound();
-			case UMLPackage.EXTENSION_END___GET_UPPER :
-				return getUpper();
-			case UMLPackage.EXTENSION_END___UPPER_BOUND :
-				return upperBound();
-			case UMLPackage.EXTENSION_END___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.EXTENSION_END___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.EXTENSION_END___GET_ENDS :
-				return getEnds();
-			case UMLPackage.EXTENSION_END___GET_DEPLOYED_ELEMENTS :
-				return getDeployedElements();
-			case UMLPackage.EXTENSION_END___VALIDATE_SUBSETTING_CONTEXT_CONFORMS__DIAGNOSTICCHAIN_MAP :
-				return validateSubsettingContextConforms(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_DERIVED_UNION_IS_READ_ONLY__DIAGNOSTICCHAIN_MAP :
-				return validateDerivedUnionIsReadOnly(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_MULTIPLICITY_OF_COMPOSITE__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfComposite(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_REDEFINED_PROPERTY_INHERITED__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinedPropertyInherited(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_SUBSETTING_RULES__DIAGNOSTICCHAIN_MAP :
-				return validateSubsettingRules(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_BINDING_TO_ATTRIBUTE__DIAGNOSTICCHAIN_MAP :
-				return validateBindingToAttribute(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_DERIVED_UNION_IS_DERIVED__DIAGNOSTICCHAIN_MAP :
-				return validateDerivedUnionIsDerived(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_DEPLOYMENT_TARGET__DIAGNOSTICCHAIN_MAP :
-				return validateDeploymentTarget(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_SUBSETTED_PROPERTY_NAMES__DIAGNOSTICCHAIN_MAP :
-				return validateSubsettedPropertyNames(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_TYPE_OF_OPPOSITE_END__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfOppositeEnd(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_QUALIFIED_IS_ASSOCIATION_END__DIAGNOSTICCHAIN_MAP :
-				return validateQualifiedIsAssociationEnd(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___GET_DEFAULT :
-				return getDefault();
-			case UMLPackage.EXTENSION_END___GET_OTHER_END :
-				return getOtherEnd();
-			case UMLPackage.EXTENSION_END___IS_SET_DEFAULT :
-				return isSetDefault();
-			case UMLPackage.EXTENSION_END___SET_BOOLEAN_DEFAULT_VALUE__BOOLEAN :
-				setBooleanDefaultValue((Boolean) arguments.get(0));
-				return null;
-			case UMLPackage.EXTENSION_END___SET_DEFAULT__STRING :
-				setDefault((String) arguments.get(0));
-				return null;
-			case UMLPackage.EXTENSION_END___SET_INTEGER_DEFAULT_VALUE__INT :
-				setIntegerDefaultValue((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.EXTENSION_END___SET_IS_COMPOSITE__BOOLEAN :
-				setIsComposite((Boolean) arguments.get(0));
-				return null;
-			case UMLPackage.EXTENSION_END___SET_IS_NAVIGABLE__BOOLEAN :
-				setIsNavigable((Boolean) arguments.get(0));
-				return null;
-			case UMLPackage.EXTENSION_END___SET_NULL_DEFAULT_VALUE :
-				setNullDefaultValue();
-				return null;
-			case UMLPackage.EXTENSION_END___SET_OPPOSITE__PROPERTY :
-				setOpposite((Property) arguments.get(0));
-				return null;
-			case UMLPackage.EXTENSION_END___SET_REAL_DEFAULT_VALUE__DOUBLE :
-				setRealDefaultValue((Double) arguments.get(0));
-				return null;
-			case UMLPackage.EXTENSION_END___SET_STRING_DEFAULT_VALUE__STRING :
-				setStringDefaultValue((String) arguments.get(0));
-				return null;
-			case UMLPackage.EXTENSION_END___SET_UNLIMITED_NATURAL_DEFAULT_VALUE__INT :
-				setUnlimitedNaturalDefaultValue((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.EXTENSION_END___UNSET_DEFAULT :
-				unsetDefault();
-				return null;
-			case UMLPackage.EXTENSION_END___IS_ATTRIBUTE :
-				return isAttribute();
-			case UMLPackage.EXTENSION_END___IS_COMPOSITE :
-				return isComposite();
-			case UMLPackage.EXTENSION_END___IS_NAVIGABLE :
-				return isNavigable();
-			case UMLPackage.EXTENSION_END___GET_OPPOSITE :
-				return getOpposite();
-			case UMLPackage.EXTENSION_END___SUBSETTING_CONTEXT :
-				return subsettingContext();
-			case UMLPackage.EXTENSION_END___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_END___VALIDATE_AGGREGATION__DIAGNOSTICCHAIN_MAP :
-				return validateAggregation((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.EXTENSION_END___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.EXTENSION_END___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION_END___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.EXTENSION_END___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.EXTENSION_END___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.EXTENSION_END___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.EXTENSION_END___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.EXTENSION_END___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.EXTENSION_END___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.EXTENSION_END___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXTENSION_END___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION_END___GET_MODEL:
+			return getModel();
+		case UMLPackage.EXTENSION_END___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.EXTENSION_END___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.EXTENSION_END___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXTENSION_END___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.EXTENSION_END___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.EXTENSION_END___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.EXTENSION_END___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXTENSION_END___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION_END___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.EXTENSION_END___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.EXTENSION_END___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXTENSION_END___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXTENSION_END___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.EXTENSION_END___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXTENSION_END___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION_END___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION_END___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION_END___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.EXTENSION_END___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.EXTENSION_END___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION_END___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.EXTENSION_END___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.EXTENSION_END___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.EXTENSION_END___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.EXTENSION_END___GET_LABEL:
+			return getLabel();
+		case UMLPackage.EXTENSION_END___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.EXTENSION_END___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.EXTENSION_END___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.EXTENSION_END___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.EXTENSION_END___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.EXTENSION_END___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXTENSION_END___SEPARATOR:
+			return separator();
+		case UMLPackage.EXTENSION_END___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.EXTENSION_END___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.EXTENSION_END___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.EXTENSION_END___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+			return validateUpperGeLower((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+			return validateLowerGe0((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationConstant((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+			return validateLowerIsInteger((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+			return validateUpperIsUnlimitedNatural((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___SET_LOWER__INT:
+			setLower((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.EXTENSION_END___SET_UPPER__INT:
+			setUpper((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.EXTENSION_END___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+			return compatibleWith((MultiplicityElement) arguments.get(0));
+		case UMLPackage.EXTENSION_END___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+			return includesMultiplicity((MultiplicityElement) arguments.get(0));
+		case UMLPackage.EXTENSION_END___IS__INT_INT:
+			return is((Integer) arguments.get(0), (Integer) arguments.get(1));
+		case UMLPackage.EXTENSION_END___IS_MULTIVALUED:
+			return isMultivalued();
+		case UMLPackage.EXTENSION_END___GET_LOWER:
+			return getLower();
+		case UMLPackage.EXTENSION_END___LOWER_BOUND:
+			return lowerBound();
+		case UMLPackage.EXTENSION_END___GET_UPPER:
+			return getUpper();
+		case UMLPackage.EXTENSION_END___UPPER_BOUND:
+			return upperBound();
+		case UMLPackage.EXTENSION_END___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.EXTENSION_END___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.EXTENSION_END___GET_ENDS:
+			return getEnds();
+		case UMLPackage.EXTENSION_END___GET_DEPLOYED_ELEMENTS:
+			return getDeployedElements();
+		case UMLPackage.EXTENSION_END___VALIDATE_SUBSETTING_CONTEXT_CONFORMS__DIAGNOSTICCHAIN_MAP:
+			return validateSubsettingContextConforms((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_DERIVED_UNION_IS_READ_ONLY__DIAGNOSTICCHAIN_MAP:
+			return validateDerivedUnionIsReadOnly((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_MULTIPLICITY_OF_COMPOSITE__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfComposite((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_REDEFINED_PROPERTY_INHERITED__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinedPropertyInherited((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_SUBSETTING_RULES__DIAGNOSTICCHAIN_MAP:
+			return validateSubsettingRules((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_BINDING_TO_ATTRIBUTE__DIAGNOSTICCHAIN_MAP:
+			return validateBindingToAttribute((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_DERIVED_UNION_IS_DERIVED__DIAGNOSTICCHAIN_MAP:
+			return validateDerivedUnionIsDerived((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_DEPLOYMENT_TARGET__DIAGNOSTICCHAIN_MAP:
+			return validateDeploymentTarget((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_SUBSETTED_PROPERTY_NAMES__DIAGNOSTICCHAIN_MAP:
+			return validateSubsettedPropertyNames((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_TYPE_OF_OPPOSITE_END__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfOppositeEnd((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_QUALIFIED_IS_ASSOCIATION_END__DIAGNOSTICCHAIN_MAP:
+			return validateQualifiedIsAssociationEnd((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___GET_DEFAULT:
+			return getDefault();
+		case UMLPackage.EXTENSION_END___GET_OTHER_END:
+			return getOtherEnd();
+		case UMLPackage.EXTENSION_END___IS_SET_DEFAULT:
+			return isSetDefault();
+		case UMLPackage.EXTENSION_END___SET_BOOLEAN_DEFAULT_VALUE__BOOLEAN:
+			setBooleanDefaultValue((Boolean) arguments.get(0));
+			return null;
+		case UMLPackage.EXTENSION_END___SET_DEFAULT__STRING:
+			setDefault((String) arguments.get(0));
+			return null;
+		case UMLPackage.EXTENSION_END___SET_INTEGER_DEFAULT_VALUE__INT:
+			setIntegerDefaultValue((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.EXTENSION_END___SET_IS_COMPOSITE__BOOLEAN:
+			setIsComposite((Boolean) arguments.get(0));
+			return null;
+		case UMLPackage.EXTENSION_END___SET_IS_NAVIGABLE__BOOLEAN:
+			setIsNavigable((Boolean) arguments.get(0));
+			return null;
+		case UMLPackage.EXTENSION_END___SET_NULL_DEFAULT_VALUE:
+			setNullDefaultValue();
+			return null;
+		case UMLPackage.EXTENSION_END___SET_OPPOSITE__PROPERTY:
+			setOpposite((Property) arguments.get(0));
+			return null;
+		case UMLPackage.EXTENSION_END___SET_REAL_DEFAULT_VALUE__DOUBLE:
+			setRealDefaultValue((Double) arguments.get(0));
+			return null;
+		case UMLPackage.EXTENSION_END___SET_STRING_DEFAULT_VALUE__STRING:
+			setStringDefaultValue((String) arguments.get(0));
+			return null;
+		case UMLPackage.EXTENSION_END___SET_UNLIMITED_NATURAL_DEFAULT_VALUE__INT:
+			setUnlimitedNaturalDefaultValue((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.EXTENSION_END___UNSET_DEFAULT:
+			unsetDefault();
+			return null;
+		case UMLPackage.EXTENSION_END___IS_ATTRIBUTE:
+			return isAttribute();
+		case UMLPackage.EXTENSION_END___IS_COMPOSITE:
+			return isComposite();
+		case UMLPackage.EXTENSION_END___IS_NAVIGABLE:
+			return isNavigable();
+		case UMLPackage.EXTENSION_END___GET_OPPOSITE:
+			return getOpposite();
+		case UMLPackage.EXTENSION_END___SUBSETTING_CONTEXT:
+			return subsettingContext();
+		case UMLPackage.EXTENSION_END___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_END___VALIDATE_AGGREGATION__DIAGNOSTICCHAIN_MAP:
+			return validateAggregation((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtensionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtensionImpl.java
index 297e1fb..48f617e 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtensionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtensionImpl.java
@@ -1,25 +1,27 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 212765, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.DiagnosticChain;
 
+import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EList;
 
 import org.eclipse.emf.ecore.EAnnotation;
@@ -27,14 +29,17 @@
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
 
+//import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectContainmentWithInverseEList;
+
 import org.eclipse.uml2.uml.AggregationKind;
 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.ElementImport;
-import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectContainmentWithInverseEList;
 import org.eclipse.uml2.uml.Extension;
 import org.eclipse.uml2.uml.ExtensionEnd;
 import org.eclipse.uml2.uml.Generalization;
@@ -54,9 +59,9 @@
 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.ExtensionOperations;
 
 /**
@@ -107,17 +112,9 @@
 		return UMLPackage.Literals.EXTENSION;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.ASSOCIATION__OWNED_END) {
 			return createOwnedEndsList();
 		}
@@ -133,16 +130,14 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Property> getOwnedEnds() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.EXTENSION__OWNED_END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.ASSOCIATION__OWNED_END, true, true);
+		return (EList<Property>) eDynamicGet(UMLPackage.EXTENSION__OWNED_END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.ASSOCIATION__OWNED_END, true, true);
 	}
 
 	private EList<Property> createOwnedEndsList() {
 		return new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Property>(
-			ExtensionEnd.class, this, UMLPackage.EXTENSION__OWNED_END,
-			OWNED_END_ESUPERSETS, OWNED_END_ESUBSETS,
-			UMLPackage.PROPERTY__OWNING_ASSOCIATION);
+				ExtensionEnd.class, this, UMLPackage.EXTENSION__OWNED_END,
+				OWNED_END_ESUPERSETS, OWNED_END_ESUBSETS,
+				UMLPackage.PROPERTY__OWNING_ASSOCIATION);
 	}
 
 	/**
@@ -150,10 +145,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Property createOwnedEnd(String name, Type type) {
-		ExtensionEnd newOwnedEnd = (ExtensionEnd) create(
-			UMLPackage.Literals.EXTENSION_END);
+		ExtensionEnd newOwnedEnd = (ExtensionEnd) create(UMLPackage.Literals.EXTENSION_END);
 		getOwnedEnds().add(newOwnedEnd);
 		if (name != null)
 			newOwnedEnd.setName(name);
@@ -167,7 +160,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Property getOwnedEnd(String name, Type type) {
 		return getOwnedEnd(name, type, false, false);
 	}
@@ -179,18 +171,14 @@
 	 */
 	public Property getOwnedEnd(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedEndLoop : for (Property ownedEnd : getOwnedEnds()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedEnd.getName())
-				: name.equals(ownedEnd.getName())))
+		ownedEndLoop: for (Property ownedEnd : getOwnedEnds()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedEnd.getName()) : name.equals(ownedEnd.getName())))
 				continue ownedEndLoop;
 			if (type != null && !type.equals(ownedEnd.getType()))
 				continue ownedEndLoop;
 			return ownedEnd;
 		}
-		return createOnDemand
-			? createOwnedEnd(name, type)
-			: null;
+		return createOnDemand ? createOwnedEnd(name, type) : null;
 	}
 
 	/**
@@ -218,10 +206,7 @@
 	 */
 	public org.eclipse.uml2.uml.Class getMetaclass() {
 		org.eclipse.uml2.uml.Class metaclass = basicGetMetaclass();
-		return metaclass != null && metaclass.eIsProxy()
-			? (org.eclipse.uml2.uml.Class) eResolveProxy(
-				(InternalEObject) metaclass)
-			: metaclass;
+		return metaclass != null && metaclass.eIsProxy() ? (org.eclipse.uml2.uml.Class) eResolveProxy((InternalEObject) metaclass) : metaclass;
 	}
 
 	/**
@@ -240,8 +225,7 @@
 	 */
 	public boolean validateNonOwnedEnd(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ExtensionOperations.validateNonOwnedEnd(this, diagnostics,
-			context);
+		return ExtensionOperations.validateNonOwnedEnd(this, diagnostics, context);
 	}
 
 	/**
@@ -291,62 +275,42 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXTENSION__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXTENSION__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXTENSION__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXTENSION__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.EXTENSION__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.EXTENSION__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXTENSION__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.EXTENSION__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.EXTENSION__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXTENSION__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXTENSION__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXTENSION__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXTENSION__MEMBER_END :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getMemberEnds())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXTENSION__OWNED_END :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedEnds())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.EXTENSION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXTENSION__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXTENSION__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXTENSION__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXTENSION__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.EXTENSION__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.EXTENSION__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXTENSION__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.EXTENSION__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.EXTENSION__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXTENSION__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXTENSION__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXTENSION__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXTENSION__MEMBER_END:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getMemberEnds()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXTENSION__OWNED_END:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedEnds()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -360,56 +324,42 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTENSION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTENSION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.EXTENSION__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTENSION__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTENSION__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTENSION__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.EXTENSION__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.EXTENSION__TEMPLATE_BINDING :
-				return ((InternalEList<?>) getTemplateBindings())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTENSION__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.EXTENSION__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTENSION__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTENSION__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTENSION__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTENSION__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.EXTENSION__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTENSION__MEMBER_END :
-				return ((InternalEList<?>) getMemberEnds())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTENSION__OWNED_END :
-				return ((InternalEList<?>) getOwnedEnds()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.EXTENSION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTENSION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTENSION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.EXTENSION__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTENSION__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTENSION__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTENSION__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.EXTENSION__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.EXTENSION__TEMPLATE_BINDING:
+			return ((InternalEList<?>) getTemplateBindings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTENSION__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.EXTENSION__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTENSION__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTENSION__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTENSION__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTENSION__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTENSION__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTENSION__MEMBER_END:
+			return ((InternalEList<?>) getMemberEnds()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTENSION__OWNED_END:
+			return ((InternalEList<?>) getOwnedEnds()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -422,116 +372,116 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.EXTENSION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.EXTENSION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.EXTENSION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.EXTENSION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.EXTENSION__NAME :
-				return getName();
-			case UMLPackage.EXTENSION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.EXTENSION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.EXTENSION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXTENSION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.EXTENSION__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.EXTENSION__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.EXTENSION__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.EXTENSION__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.EXTENSION__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.EXTENSION__MEMBER :
-				return getMembers();
-			case UMLPackage.EXTENSION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.EXTENSION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.EXTENSION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.EXTENSION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.EXTENSION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.EXTENSION__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.EXTENSION__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.EXTENSION__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.EXTENSION__FEATURE :
-				return getFeatures();
-			case UMLPackage.EXTENSION__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.EXTENSION__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.EXTENSION__GENERAL :
-				return getGenerals();
-			case UMLPackage.EXTENSION__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.EXTENSION__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.EXTENSION__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.EXTENSION__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.EXTENSION__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.EXTENSION__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.EXTENSION__USE_CASE :
-				return getUseCases();
-			case UMLPackage.EXTENSION__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.EXTENSION__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.EXTENSION__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.EXTENSION__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.EXTENSION__END_TYPE :
-				return getEndTypes();
-			case UMLPackage.EXTENSION__IS_DERIVED :
-				return isDerived();
-			case UMLPackage.EXTENSION__MEMBER_END :
-				return getMemberEnds();
-			case UMLPackage.EXTENSION__OWNED_END :
-				return getOwnedEnds();
-			case UMLPackage.EXTENSION__NAVIGABLE_OWNED_END :
-				return getNavigableOwnedEnds();
-			case UMLPackage.EXTENSION__IS_REQUIRED :
-				return isRequired();
-			case UMLPackage.EXTENSION__METACLASS :
-				if (resolve)
-					return getMetaclass();
-				return basicGetMetaclass();
+		case UMLPackage.EXTENSION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.EXTENSION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.EXTENSION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.EXTENSION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.EXTENSION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.EXTENSION__NAME:
+			return getName();
+		case UMLPackage.EXTENSION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.EXTENSION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.EXTENSION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXTENSION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.EXTENSION__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.EXTENSION__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.EXTENSION__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.EXTENSION__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.EXTENSION__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.EXTENSION__MEMBER:
+			return getMembers();
+		case UMLPackage.EXTENSION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.EXTENSION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.EXTENSION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.EXTENSION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.EXTENSION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.EXTENSION__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.EXTENSION__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.EXTENSION__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.EXTENSION__FEATURE:
+			return getFeatures();
+		case UMLPackage.EXTENSION__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.EXTENSION__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.EXTENSION__GENERAL:
+			return getGenerals();
+		case UMLPackage.EXTENSION__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.EXTENSION__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.EXTENSION__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.EXTENSION__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.EXTENSION__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.EXTENSION__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.EXTENSION__USE_CASE:
+			return getUseCases();
+		case UMLPackage.EXTENSION__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.EXTENSION__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.EXTENSION__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.EXTENSION__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.EXTENSION__END_TYPE:
+			return getEndTypes();
+		case UMLPackage.EXTENSION__IS_DERIVED:
+			return isDerived();
+		case UMLPackage.EXTENSION__MEMBER_END:
+			return getMemberEnds();
+		case UMLPackage.EXTENSION__OWNED_END:
+			return getOwnedEnds();
+		case UMLPackage.EXTENSION__NAVIGABLE_OWNED_END:
+			return getNavigableOwnedEnds();
+		case UMLPackage.EXTENSION__IS_REQUIRED:
+			return isRequired();
+		case UMLPackage.EXTENSION__METACLASS:
+			if (resolve)
+				return getMetaclass();
+			return basicGetMetaclass();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -545,126 +495,110 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.EXTENSION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.EXTENSION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.EXTENSION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.EXTENSION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.EXTENSION__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.EXTENSION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.EXTENSION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.EXTENSION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.EXTENSION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.EXTENSION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.EXTENSION__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.EXTENSION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.EXTENSION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.EXTENSION__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.EXTENSION__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.EXTENSION__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.EXTENSION__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.EXTENSION__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.EXTENSION__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.EXTENSION__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.EXTENSION__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.EXTENSION__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.EXTENSION__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.EXTENSION__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.EXTENSION__IS_DERIVED :
-				setIsDerived((Boolean) newValue);
-				return;
-			case UMLPackage.EXTENSION__MEMBER_END :
-				getMemberEnds().clear();
-				getMemberEnds()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.EXTENSION__OWNED_END :
-				getOwnedEnds().clear();
-				getOwnedEnds()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.EXTENSION__NAVIGABLE_OWNED_END :
-				getNavigableOwnedEnds().clear();
-				getNavigableOwnedEnds()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
+		case UMLPackage.EXTENSION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.EXTENSION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.EXTENSION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.EXTENSION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.EXTENSION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.EXTENSION__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.EXTENSION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.EXTENSION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.EXTENSION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.EXTENSION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.EXTENSION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.EXTENSION__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.EXTENSION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.EXTENSION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.EXTENSION__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.EXTENSION__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.EXTENSION__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.EXTENSION__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.EXTENSION__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.EXTENSION__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.EXTENSION__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.EXTENSION__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.EXTENSION__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.EXTENSION__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.EXTENSION__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.EXTENSION__IS_DERIVED:
+			setIsDerived((Boolean) newValue);
+			return;
+		case UMLPackage.EXTENSION__MEMBER_END:
+			getMemberEnds().clear();
+			getMemberEnds().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.EXTENSION__OWNED_END:
+			getOwnedEnds().clear();
+			getOwnedEnds().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.EXTENSION__NAVIGABLE_OWNED_END:
+			getNavigableOwnedEnds().clear();
+			getNavigableOwnedEnds().addAll((Collection<? extends Property>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -677,93 +611,93 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.EXTENSION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.EXTENSION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.EXTENSION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.EXTENSION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.EXTENSION__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.EXTENSION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.EXTENSION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.EXTENSION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.EXTENSION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.EXTENSION__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.EXTENSION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.EXTENSION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.EXTENSION__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.EXTENSION__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.EXTENSION__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.EXTENSION__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.EXTENSION__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.EXTENSION__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.EXTENSION__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.EXTENSION__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.EXTENSION__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.EXTENSION__IS_DERIVED :
-				setIsDerived(IS_DERIVED_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION__MEMBER_END :
-				getMemberEnds().clear();
-				return;
-			case UMLPackage.EXTENSION__OWNED_END :
-				getOwnedEnds().clear();
-				return;
-			case UMLPackage.EXTENSION__NAVIGABLE_OWNED_END :
-				getNavigableOwnedEnds().clear();
-				return;
+		case UMLPackage.EXTENSION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.EXTENSION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.EXTENSION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.EXTENSION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.EXTENSION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.EXTENSION__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.EXTENSION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.EXTENSION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.EXTENSION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.EXTENSION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.EXTENSION__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.EXTENSION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.EXTENSION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.EXTENSION__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.EXTENSION__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.EXTENSION__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.EXTENSION__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.EXTENSION__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.EXTENSION__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.EXTENSION__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.EXTENSION__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.EXTENSION__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.EXTENSION__IS_DERIVED:
+			setIsDerived(IS_DERIVED_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION__MEMBER_END:
+			getMemberEnds().clear();
+			return;
+		case UMLPackage.EXTENSION__OWNED_END:
+			getOwnedEnds().clear();
+			return;
+		case UMLPackage.EXTENSION__NAVIGABLE_OWNED_END:
+			getNavigableOwnedEnds().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -776,100 +710,98 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.EXTENSION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.EXTENSION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.EXTENSION__OWNER :
-				return isSetOwner();
-			case UMLPackage.EXTENSION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.EXTENSION__NAME :
-				return isSetName();
-			case UMLPackage.EXTENSION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.EXTENSION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.EXTENSION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.EXTENSION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.EXTENSION__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.EXTENSION__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.EXTENSION__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.EXTENSION__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.EXTENSION__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.EXTENSION__MEMBER :
-				return isSetMembers();
-			case UMLPackage.EXTENSION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.EXTENSION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.EXTENSION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.EXTENSION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.EXTENSION__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.EXTENSION__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.EXTENSION__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.EXTENSION__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.EXTENSION__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.EXTENSION__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.EXTENSION__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.EXTENSION__GENERAL :
-				return !getGenerals().isEmpty();
-			case UMLPackage.EXTENSION__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.EXTENSION__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.EXTENSION__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.EXTENSION__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.EXTENSION__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.EXTENSION__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.EXTENSION__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.EXTENSION__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.EXTENSION__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.EXTENSION__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.EXTENSION__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.EXTENSION__END_TYPE :
-				return !getEndTypes().isEmpty();
-			case UMLPackage.EXTENSION__IS_DERIVED :
-				return isDerived() != IS_DERIVED_EDEFAULT;
-			case UMLPackage.EXTENSION__MEMBER_END :
-				return !getMemberEnds().isEmpty();
-			case UMLPackage.EXTENSION__OWNED_END :
-				return isSetOwnedEnds();
-			case UMLPackage.EXTENSION__NAVIGABLE_OWNED_END :
-				return !getNavigableOwnedEnds().isEmpty();
-			case UMLPackage.EXTENSION__IS_REQUIRED :
-				return isRequired() != IS_REQUIRED_EDEFAULT;
-			case UMLPackage.EXTENSION__METACLASS :
-				return basicGetMetaclass() != null;
+		case UMLPackage.EXTENSION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.EXTENSION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.EXTENSION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.EXTENSION__OWNER:
+			return isSetOwner();
+		case UMLPackage.EXTENSION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.EXTENSION__NAME:
+			return isSetName();
+		case UMLPackage.EXTENSION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.EXTENSION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.EXTENSION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.EXTENSION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.EXTENSION__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.EXTENSION__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.EXTENSION__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.EXTENSION__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.EXTENSION__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.EXTENSION__MEMBER:
+			return isSetMembers();
+		case UMLPackage.EXTENSION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.EXTENSION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.EXTENSION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.EXTENSION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.EXTENSION__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.EXTENSION__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.EXTENSION__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.EXTENSION__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.EXTENSION__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.EXTENSION__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.EXTENSION__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.EXTENSION__GENERAL:
+			return !getGenerals().isEmpty();
+		case UMLPackage.EXTENSION__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.EXTENSION__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.EXTENSION__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.EXTENSION__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.EXTENSION__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.EXTENSION__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.EXTENSION__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.EXTENSION__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.EXTENSION__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.EXTENSION__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.EXTENSION__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.EXTENSION__END_TYPE:
+			return !getEndTypes().isEmpty();
+		case UMLPackage.EXTENSION__IS_DERIVED:
+			return isDerived() != IS_DERIVED_EDEFAULT;
+		case UMLPackage.EXTENSION__MEMBER_END:
+			return !getMemberEnds().isEmpty();
+		case UMLPackage.EXTENSION__OWNED_END:
+			return isSetOwnedEnds();
+		case UMLPackage.EXTENSION__NAVIGABLE_OWNED_END:
+			return !getNavigableOwnedEnds().isEmpty();
+		case UMLPackage.EXTENSION__IS_REQUIRED:
+			return isRequired() != IS_REQUIRED_EDEFAULT;
+		case UMLPackage.EXTENSION__METACLASS:
+			return basicGetMetaclass() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -884,312 +816,245 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.EXTENSION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.EXTENSION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.EXTENSION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.EXTENSION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.EXTENSION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.EXTENSION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.EXTENSION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.EXTENSION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.EXTENSION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.EXTENSION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXTENSION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION___GET_MODEL :
-				return getModel();
-			case UMLPackage.EXTENSION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.EXTENSION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.EXTENSION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.EXTENSION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.EXTENSION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.EXTENSION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.EXTENSION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.EXTENSION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.EXTENSION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.EXTENSION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.EXTENSION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXTENSION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.EXTENSION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXTENSION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.EXTENSION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.EXTENSION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.EXTENSION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.EXTENSION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.EXTENSION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.EXTENSION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.EXTENSION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.EXTENSION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.EXTENSION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.EXTENSION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.EXTENSION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.EXTENSION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXTENSION___SEPARATOR :
-				return separator();
-			case UMLPackage.EXTENSION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.EXTENSION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.EXTENSION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.EXTENSION___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.EXTENSION___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.EXTENSION___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.EXTENSION___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.EXTENSION___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.EXTENSION___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.EXTENSION___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.EXTENSION___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.EXTENSION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.EXTENSION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.EXTENSION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.EXTENSION___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.EXTENSION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.EXTENSION___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.EXTENSION___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.EXTENSION___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.EXTENSION___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.EXTENSION___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.EXTENSION___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.EXTENSION___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.EXTENSION___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.EXTENSION___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.EXTENSION___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.EXTENSION___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.EXTENSION___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.EXTENSION___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.EXTENSION___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.EXTENSION___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.EXTENSION___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.EXTENSION___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.EXTENSION___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.EXTENSION___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.EXTENSION___PARENTS :
-				return parents();
-			case UMLPackage.EXTENSION___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.EXTENSION___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.EXTENSION___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.EXTENSION___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.EXTENSION___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.EXTENSION___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.EXTENSION___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.EXTENSION___VALIDATE_SPECIALIZED_END_NUMBER__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializedEndNumber(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___VALIDATE_SPECIALIZED_END_TYPES__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializedEndTypes(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___VALIDATE_BINARY_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP :
-				return validateBinaryAssociations(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___VALIDATE_ASSOCIATION_ENDS__DIAGNOSTICCHAIN_MAP :
-				return validateAssociationEnds(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___VALIDATE_ENDS_MUST_BE_TYPED__DIAGNOSTICCHAIN_MAP :
-				return validateEndsMustBeTyped(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___IS_BINARY :
-				return isBinary();
-			case UMLPackage.EXTENSION___GET_END_TYPES :
-				return getEndTypes();
-			case UMLPackage.EXTENSION___VALIDATE_NON_OWNED_END__DIAGNOSTICCHAIN_MAP :
-				return validateNonOwnedEnd((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___VALIDATE_IS_BINARY__DIAGNOSTICCHAIN_MAP :
-				return validateIsBinary((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION___GET_STEREOTYPE :
-				return getStereotype();
-			case UMLPackage.EXTENSION___GET_STEREOTYPE_END :
-				return getStereotypeEnd();
-			case UMLPackage.EXTENSION___IS_REQUIRED :
-				return isRequired();
-			case UMLPackage.EXTENSION___GET_METACLASS :
-				return getMetaclass();
-			case UMLPackage.EXTENSION___METACLASS_END :
-				return metaclassEnd();
+		case UMLPackage.EXTENSION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.EXTENSION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.EXTENSION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.EXTENSION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.EXTENSION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.EXTENSION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.EXTENSION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.EXTENSION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.EXTENSION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.EXTENSION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXTENSION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION___GET_MODEL:
+			return getModel();
+		case UMLPackage.EXTENSION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.EXTENSION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.EXTENSION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXTENSION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.EXTENSION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.EXTENSION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.EXTENSION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXTENSION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.EXTENSION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.EXTENSION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXTENSION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXTENSION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.EXTENSION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXTENSION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.EXTENSION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.EXTENSION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.EXTENSION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.EXTENSION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.EXTENSION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.EXTENSION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.EXTENSION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.EXTENSION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.EXTENSION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.EXTENSION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.EXTENSION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.EXTENSION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXTENSION___SEPARATOR:
+			return separator();
+		case UMLPackage.EXTENSION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.EXTENSION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.EXTENSION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.EXTENSION___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.EXTENSION___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.EXTENSION___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.EXTENSION___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.EXTENSION___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.EXTENSION___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.EXTENSION___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.EXTENSION___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.EXTENSION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.EXTENSION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.EXTENSION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.EXTENSION___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.EXTENSION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.EXTENSION___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.EXTENSION___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.EXTENSION___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.EXTENSION___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.EXTENSION___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.EXTENSION___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.EXTENSION___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.EXTENSION___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.EXTENSION___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.EXTENSION___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.EXTENSION___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.EXTENSION___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.EXTENSION___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.EXTENSION___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.EXTENSION___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.EXTENSION___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.EXTENSION___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.EXTENSION___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.EXTENSION___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.EXTENSION___PARENTS:
+			return parents();
+		case UMLPackage.EXTENSION___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.EXTENSION___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.EXTENSION___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.EXTENSION___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.EXTENSION___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.EXTENSION___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.EXTENSION___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.EXTENSION___VALIDATE_SPECIALIZED_END_NUMBER__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializedEndNumber((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___VALIDATE_SPECIALIZED_END_TYPES__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializedEndTypes((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___VALIDATE_BINARY_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP:
+			return validateBinaryAssociations((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___VALIDATE_ASSOCIATION_ENDS__DIAGNOSTICCHAIN_MAP:
+			return validateAssociationEnds((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___VALIDATE_ENDS_MUST_BE_TYPED__DIAGNOSTICCHAIN_MAP:
+			return validateEndsMustBeTyped((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___IS_BINARY:
+			return isBinary();
+		case UMLPackage.EXTENSION___GET_END_TYPES:
+			return getEndTypes();
+		case UMLPackage.EXTENSION___VALIDATE_NON_OWNED_END__DIAGNOSTICCHAIN_MAP:
+			return validateNonOwnedEnd((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___VALIDATE_IS_BINARY__DIAGNOSTICCHAIN_MAP:
+			return validateIsBinary((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION___GET_STEREOTYPE:
+			return getStereotype();
+		case UMLPackage.EXTENSION___GET_STEREOTYPE_END:
+			return getStereotypeEnd();
+		case UMLPackage.EXTENSION___IS_REQUIRED:
+			return isRequired();
+		case UMLPackage.EXTENSION___GET_METACLASS:
+			return getMetaclass();
+		case UMLPackage.EXTENSION___METACLASS_END:
+			return metaclassEnd();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtensionPointImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtensionPointImpl.java
index 254926e..b6b9d21 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtensionPointImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ExtensionPointImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -26,6 +27,9 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Comment;
@@ -86,9 +90,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -111,9 +113,7 @@
 	 * @generated
 	 */
 	public UseCase getUseCase() {
-		return (UseCase) eDynamicGet(
-			UMLPackage.EXTENSION_POINT__USE_CASE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXTENSION_POINT__USE_CASE, true, true);
+		return (UseCase) eDynamicGet(UMLPackage.EXTENSION_POINT__USE_CASE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXTENSION_POINT__USE_CASE, true, true);
 	}
 
 	/**
@@ -122,9 +122,7 @@
 	 * @generated
 	 */
 	public UseCase basicGetUseCase() {
-		return (UseCase) eDynamicGet(
-			UMLPackage.EXTENSION_POINT__USE_CASE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXTENSION_POINT__USE_CASE, false, true);
+		return (UseCase) eDynamicGet(UMLPackage.EXTENSION_POINT__USE_CASE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXTENSION_POINT__USE_CASE, false, true);
 	}
 
 	/**
@@ -134,8 +132,7 @@
 	 */
 	public NotificationChain basicSetUseCase(UseCase newUseCase,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newUseCase,
-			UMLPackage.EXTENSION_POINT__USE_CASE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newUseCase, UMLPackage.EXTENSION_POINT__USE_CASE, msgs);
 		return msgs;
 	}
 
@@ -145,9 +142,7 @@
 	 * @generated
 	 */
 	public void setUseCase(UseCase newUseCase) {
-		eDynamicSet(
-			UMLPackage.EXTENSION_POINT__USE_CASE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.EXTENSION_POINT__USE_CASE, newUseCase);
+		eDynamicSet(UMLPackage.EXTENSION_POINT__USE_CASE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.EXTENSION_POINT__USE_CASE, newUseCase);
 	}
 
 	/**
@@ -157,8 +152,7 @@
 	 */
 	public boolean validateMustHaveName(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ExtensionPointOperations.validateMustHaveName(this, diagnostics,
-			context);
+		return ExtensionPointOperations.validateMustHaveName(this, diagnostics, context);
 	}
 
 	/**
@@ -171,13 +165,12 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION_POINT__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.EXTENSION_POINT__USE_CASE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetUseCase((UseCase) otherEnd, msgs);
+		case UMLPackage.EXTENSION_POINT__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.EXTENSION_POINT__USE_CASE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetUseCase((UseCase) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -191,16 +184,14 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION_POINT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTENSION_POINT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.EXTENSION_POINT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.EXTENSION_POINT__USE_CASE :
-				return basicSetUseCase(null, msgs);
+		case UMLPackage.EXTENSION_POINT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTENSION_POINT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.EXTENSION_POINT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.EXTENSION_POINT__USE_CASE:
+			return basicSetUseCase(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -214,9 +205,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.EXTENSION_POINT__USE_CASE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.USE_CASE__EXTENSION_POINT, UseCase.class, msgs);
+		case UMLPackage.EXTENSION_POINT__USE_CASE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.USE_CASE__EXTENSION_POINT, UseCase.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -229,42 +219,42 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION_POINT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.EXTENSION_POINT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.EXTENSION_POINT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.EXTENSION_POINT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.EXTENSION_POINT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.EXTENSION_POINT__NAME :
-				return getName();
-			case UMLPackage.EXTENSION_POINT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.EXTENSION_POINT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.EXTENSION_POINT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXTENSION_POINT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.EXTENSION_POINT__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.EXTENSION_POINT__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.EXTENSION_POINT__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.EXTENSION_POINT__USE_CASE :
-				if (resolve)
-					return getUseCase();
-				return basicGetUseCase();
+		case UMLPackage.EXTENSION_POINT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.EXTENSION_POINT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.EXTENSION_POINT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.EXTENSION_POINT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.EXTENSION_POINT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.EXTENSION_POINT__NAME:
+			return getName();
+		case UMLPackage.EXTENSION_POINT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.EXTENSION_POINT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.EXTENSION_POINT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXTENSION_POINT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.EXTENSION_POINT__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.EXTENSION_POINT__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.EXTENSION_POINT__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.EXTENSION_POINT__USE_CASE:
+			if (resolve)
+				return getUseCase();
+			return basicGetUseCase();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -278,31 +268,29 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION_POINT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.EXTENSION_POINT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.EXTENSION_POINT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.EXTENSION_POINT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.EXTENSION_POINT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.EXTENSION_POINT__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.EXTENSION_POINT__USE_CASE :
-				setUseCase((UseCase) newValue);
-				return;
+		case UMLPackage.EXTENSION_POINT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.EXTENSION_POINT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.EXTENSION_POINT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.EXTENSION_POINT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.EXTENSION_POINT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.EXTENSION_POINT__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.EXTENSION_POINT__USE_CASE:
+			setUseCase((UseCase) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -315,27 +303,27 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION_POINT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.EXTENSION_POINT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.EXTENSION_POINT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.EXTENSION_POINT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.EXTENSION_POINT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.EXTENSION_POINT__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.EXTENSION_POINT__USE_CASE :
-				setUseCase((UseCase) null);
-				return;
+		case UMLPackage.EXTENSION_POINT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.EXTENSION_POINT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.EXTENSION_POINT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.EXTENSION_POINT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.EXTENSION_POINT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.EXTENSION_POINT__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.EXTENSION_POINT__USE_CASE:
+			setUseCase((UseCase) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -348,36 +336,34 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.EXTENSION_POINT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.EXTENSION_POINT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.EXTENSION_POINT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.EXTENSION_POINT__OWNER :
-				return isSetOwner();
-			case UMLPackage.EXTENSION_POINT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.EXTENSION_POINT__NAME :
-				return isSetName();
-			case UMLPackage.EXTENSION_POINT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.EXTENSION_POINT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.EXTENSION_POINT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.EXTENSION_POINT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.EXTENSION_POINT__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.EXTENSION_POINT__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.EXTENSION_POINT__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.EXTENSION_POINT__USE_CASE :
-				return basicGetUseCase() != null;
+		case UMLPackage.EXTENSION_POINT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.EXTENSION_POINT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.EXTENSION_POINT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.EXTENSION_POINT__OWNER:
+			return isSetOwner();
+		case UMLPackage.EXTENSION_POINT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.EXTENSION_POINT__NAME:
+			return isSetName();
+		case UMLPackage.EXTENSION_POINT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.EXTENSION_POINT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.EXTENSION_POINT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.EXTENSION_POINT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.EXTENSION_POINT__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.EXTENSION_POINT__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.EXTENSION_POINT__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.EXTENSION_POINT__USE_CASE:
+			return basicGetUseCase() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -392,145 +378,122 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.EXTENSION_POINT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_POINT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_POINT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.EXTENSION_POINT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.EXTENSION_POINT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.EXTENSION_POINT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.EXTENSION_POINT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXTENSION_POINT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___GET_MODEL :
-				return getModel();
-			case UMLPackage.EXTENSION_POINT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.EXTENSION_POINT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.EXTENSION_POINT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.EXTENSION_POINT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.EXTENSION_POINT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.EXTENSION_POINT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.EXTENSION_POINT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXTENSION_POINT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.EXTENSION_POINT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.EXTENSION_POINT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.EXTENSION_POINT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.EXTENSION_POINT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_POINT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_POINT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_POINT___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___GET_LABEL :
-				return getLabel();
-			case UMLPackage.EXTENSION_POINT___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.EXTENSION_POINT___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.EXTENSION_POINT___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.EXTENSION_POINT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.EXTENSION_POINT___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.EXTENSION_POINT___SEPARATOR :
-				return separator();
-			case UMLPackage.EXTENSION_POINT___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.EXTENSION_POINT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_POINT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_POINT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.EXTENSION_POINT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.EXTENSION_POINT___VALIDATE_MUST_HAVE_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateMustHaveName((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_POINT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_POINT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_POINT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.EXTENSION_POINT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.EXTENSION_POINT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.EXTENSION_POINT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.EXTENSION_POINT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXTENSION_POINT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___GET_MODEL:
+			return getModel();
+		case UMLPackage.EXTENSION_POINT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.EXTENSION_POINT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.EXTENSION_POINT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.EXTENSION_POINT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.EXTENSION_POINT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.EXTENSION_POINT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.EXTENSION_POINT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXTENSION_POINT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.EXTENSION_POINT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.EXTENSION_POINT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.EXTENSION_POINT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.EXTENSION_POINT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_POINT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_POINT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_POINT___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___GET_LABEL:
+			return getLabel();
+		case UMLPackage.EXTENSION_POINT___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.EXTENSION_POINT___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.EXTENSION_POINT___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.EXTENSION_POINT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.EXTENSION_POINT___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.EXTENSION_POINT___SEPARATOR:
+			return separator();
+		case UMLPackage.EXTENSION_POINT___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.EXTENSION_POINT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_POINT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_POINT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.EXTENSION_POINT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.EXTENSION_POINT___VALIDATE_MUST_HAVE_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateMustHaveName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -543,7 +506,7 @@
 	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
-			|| eIsSet(UMLPackage.EXTENSION_POINT__USE_CASE);
+				|| eIsSet(UMLPackage.EXTENSION_POINT__USE_CASE);
 	}
 
 } //ExtensionPointImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FeatureImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FeatureImpl.java
index d48f97e..f99dafe 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FeatureImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FeatureImpl.java
@@ -1,24 +1,28 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
- *   Kenn Hussey - 519572
+ *   Kenn Hussey - 519572, 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
+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;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -88,28 +92,21 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Classifier> featuringClassifiers = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
+			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>(
-						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>(Classifier.class, this,
-			UMLPackage.FEATURE__FEATURING_CLASSIFIER, null);
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.FEATURE__FEATURING_CLASSIFIER, null);
 	}
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getFeaturingClassifiers() <em>Featuring Classifier</em>}' reference list.
 	 * @see #getFeaturingClassifiers()
 	 */
-	protected static final int[] FEATURING_CLASSIFIER_ESUBSETS = new int[]{
-		UMLPackage.FEATURE__NAMESPACE};
+	protected static final int[] FEATURING_CLASSIFIER_ESUBSETS = new int[] {
+			UMLPackage.FEATURE__NAMESPACE };
 
 	public EList<Classifier> getFeaturingClassifiers() {
 		CacheAdapter cache = getCacheAdapter();
@@ -117,21 +114,21 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<Classifier> featuringClassifiers = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
+					.get(eResource, this,
+							UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
 			if (featuringClassifiers == null) {
 				cache.put(eResource, this,
-					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER,
-					featuringClassifiers = new DerivedUnionEObjectEList<Classifier>(
-						Classifier.class, this,
-						UMLPackage.FEATURE__FEATURING_CLASSIFIER,
-						FEATURING_CLASSIFIER_ESUBSETS));
+						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>(Classifier.class, this,
-			UMLPackage.FEATURE__FEATURING_CLASSIFIER,
-			FEATURING_CLASSIFIER_ESUBSETS);
+				UMLPackage.FEATURE__FEATURING_CLASSIFIER,
+				FEATURING_CLASSIFIER_ESUBSETS);
 	}
 
 	/**
@@ -150,12 +147,10 @@
 	 */
 	public Classifier getFeaturingClassifier(String name, boolean ignoreCase,
 			EClass eClass) {
-		featuringClassifierLoop : for (Classifier featuringClassifier : getFeaturingClassifiers()) {
+		featuringClassifierLoop: for (Classifier featuringClassifier : getFeaturingClassifiers()) {
 			if (eClass != null && !eClass.isInstance(featuringClassifier))
 				continue featuringClassifierLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(featuringClassifier.getName())
-				: name.equals(featuringClassifier.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(featuringClassifier.getName()) : name.equals(featuringClassifier.getName())))
 				continue featuringClassifierLoop;
 			return featuringClassifier;
 		}
@@ -168,9 +163,7 @@
 	 * @generated
 	 */
 	public boolean isStatic() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.FEATURE__IS_STATIC - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.FEATURE__IS_STATIC, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.FEATURE__IS_STATIC - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.FEATURE__IS_STATIC, true, true);
 	}
 
 	/**
@@ -179,8 +172,7 @@
 	 * @generated
 	 */
 	public void setIsStatic(boolean newIsStatic) {
-		eDynamicSet(UMLPackage.FEATURE__IS_STATIC - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.FEATURE__IS_STATIC, newIsStatic);
+		eDynamicSet(UMLPackage.FEATURE__IS_STATIC - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.FEATURE__IS_STATIC, newIsStatic);
 	}
 
 	/**
@@ -191,42 +183,42 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.FEATURE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.FEATURE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.FEATURE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.FEATURE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.FEATURE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.FEATURE__NAME :
-				return getName();
-			case UMLPackage.FEATURE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.FEATURE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.FEATURE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.FEATURE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.FEATURE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.FEATURE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.FEATURE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.FEATURE__FEATURING_CLASSIFIER :
-				return getFeaturingClassifiers();
-			case UMLPackage.FEATURE__IS_STATIC :
-				return isStatic();
+		case UMLPackage.FEATURE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.FEATURE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.FEATURE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.FEATURE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.FEATURE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.FEATURE__NAME:
+			return getName();
+		case UMLPackage.FEATURE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.FEATURE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.FEATURE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.FEATURE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.FEATURE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.FEATURE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.FEATURE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.FEATURE__FEATURING_CLASSIFIER:
+			return getFeaturingClassifiers();
+		case UMLPackage.FEATURE__IS_STATIC:
+			return isStatic();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -240,31 +232,29 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.FEATURE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.FEATURE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.FEATURE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.FEATURE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.FEATURE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.FEATURE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.FEATURE__IS_STATIC :
-				setIsStatic((Boolean) newValue);
-				return;
+		case UMLPackage.FEATURE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.FEATURE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.FEATURE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.FEATURE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.FEATURE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.FEATURE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.FEATURE__IS_STATIC:
+			setIsStatic((Boolean) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -277,27 +267,27 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.FEATURE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.FEATURE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.FEATURE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.FEATURE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.FEATURE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.FEATURE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.FEATURE__IS_STATIC :
-				setIsStatic(IS_STATIC_EDEFAULT);
-				return;
+		case UMLPackage.FEATURE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.FEATURE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.FEATURE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.FEATURE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.FEATURE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.FEATURE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.FEATURE__IS_STATIC:
+			setIsStatic(IS_STATIC_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -310,38 +300,36 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.FEATURE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.FEATURE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.FEATURE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.FEATURE__OWNER :
-				return isSetOwner();
-			case UMLPackage.FEATURE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.FEATURE__NAME :
-				return isSetName();
-			case UMLPackage.FEATURE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.FEATURE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.FEATURE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.FEATURE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.FEATURE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.FEATURE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.FEATURE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.FEATURE__FEATURING_CLASSIFIER :
-				return isSetFeaturingClassifiers();
-			case UMLPackage.FEATURE__IS_STATIC :
-				return isStatic() != IS_STATIC_EDEFAULT;
+		case UMLPackage.FEATURE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.FEATURE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.FEATURE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.FEATURE__OWNER:
+			return isSetOwner();
+		case UMLPackage.FEATURE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.FEATURE__NAME:
+			return isSetName();
+		case UMLPackage.FEATURE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.FEATURE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.FEATURE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.FEATURE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.FEATURE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.FEATURE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.FEATURE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.FEATURE__FEATURING_CLASSIFIER:
+			return isSetFeaturingClassifiers();
+		case UMLPackage.FEATURE__IS_STATIC:
+			return isStatic() != IS_STATIC_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FinalNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FinalNodeImpl.java
index 7f3017e..62785b0 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FinalNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FinalNodeImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -67,8 +67,7 @@
 	 */
 	public boolean validateNoOutgoingEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return FinalNodeOperations.validateNoOutgoingEdges(this, diagnostics,
-			context);
+		return FinalNodeOperations.validateNoOutgoingEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -81,148 +80,124 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.FINAL_NODE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.FINAL_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_NODE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.FINAL_NODE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.FINAL_NODE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.FINAL_NODE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.FINAL_NODE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.FINAL_NODE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.FINAL_NODE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.FINAL_NODE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.FINAL_NODE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.FINAL_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.FINAL_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.FINAL_NODE___GET_MODEL :
-				return getModel();
-			case UMLPackage.FINAL_NODE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.FINAL_NODE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.FINAL_NODE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.FINAL_NODE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.FINAL_NODE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.FINAL_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.FINAL_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.FINAL_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.FINAL_NODE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.FINAL_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.FINAL_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.FINAL_NODE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.FINAL_NODE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.FINAL_NODE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.FINAL_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.FINAL_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.FINAL_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.FINAL_NODE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.FINAL_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.FINAL_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.FINAL_NODE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.FINAL_NODE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.FINAL_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_NODE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.FINAL_NODE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.FINAL_NODE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.FINAL_NODE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.FINAL_NODE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.FINAL_NODE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.FINAL_NODE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.FINAL_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.FINAL_NODE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.FINAL_NODE___SEPARATOR :
-				return separator();
-			case UMLPackage.FINAL_NODE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.FINAL_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.FINAL_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.FINAL_NODE___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.FINAL_NODE___VALIDATE_NO_OUTGOING_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateNoOutgoingEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_NODE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.FINAL_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_NODE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.FINAL_NODE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.FINAL_NODE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.FINAL_NODE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.FINAL_NODE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.FINAL_NODE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.FINAL_NODE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.FINAL_NODE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.FINAL_NODE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.FINAL_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.FINAL_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.FINAL_NODE___GET_MODEL:
+			return getModel();
+		case UMLPackage.FINAL_NODE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.FINAL_NODE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.FINAL_NODE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.FINAL_NODE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.FINAL_NODE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.FINAL_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.FINAL_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.FINAL_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.FINAL_NODE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.FINAL_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.FINAL_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.FINAL_NODE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.FINAL_NODE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.FINAL_NODE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.FINAL_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.FINAL_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.FINAL_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.FINAL_NODE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.FINAL_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.FINAL_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.FINAL_NODE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.FINAL_NODE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.FINAL_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_NODE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.FINAL_NODE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.FINAL_NODE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.FINAL_NODE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.FINAL_NODE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.FINAL_NODE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.FINAL_NODE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.FINAL_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.FINAL_NODE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.FINAL_NODE___SEPARATOR:
+			return separator();
+		case UMLPackage.FINAL_NODE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.FINAL_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.FINAL_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.FINAL_NODE___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.FINAL_NODE___VALIDATE_NO_OUTGOING_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateNoOutgoingEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FinalStateImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FinalStateImpl.java
index 9126a63..61230ee 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FinalStateImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FinalStateImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -71,8 +71,7 @@
 	 */
 	public boolean validateNoOutgoingTransitions(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return FinalStateOperations.validateNoOutgoingTransitions(this,
-			diagnostics, context);
+		return FinalStateOperations.validateNoOutgoingTransitions(this, diagnostics, context);
 	}
 
 	/**
@@ -82,8 +81,7 @@
 	 */
 	public boolean validateNoRegions(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return FinalStateOperations.validateNoRegions(this, diagnostics,
-			context);
+		return FinalStateOperations.validateNoRegions(this, diagnostics, context);
 	}
 
 	/**
@@ -93,8 +91,7 @@
 	 */
 	public boolean validateCannotReferenceSubmachine(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return FinalStateOperations.validateCannotReferenceSubmachine(this,
-			diagnostics, context);
+		return FinalStateOperations.validateCannotReferenceSubmachine(this, diagnostics, context);
 	}
 
 	/**
@@ -104,8 +101,7 @@
 	 */
 	public boolean validateNoEntryBehavior(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return FinalStateOperations.validateNoEntryBehavior(this, diagnostics,
-			context);
+		return FinalStateOperations.validateNoEntryBehavior(this, diagnostics, context);
 	}
 
 	/**
@@ -115,8 +111,7 @@
 	 */
 	public boolean validateNoExitBehavior(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return FinalStateOperations.validateNoExitBehavior(this, diagnostics,
-			context);
+		return FinalStateOperations.validateNoExitBehavior(this, diagnostics, context);
 	}
 
 	/**
@@ -126,8 +121,7 @@
 	 */
 	public boolean validateNoStateBehavior(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return FinalStateOperations.validateNoStateBehavior(this, diagnostics,
-			context);
+		return FinalStateOperations.validateNoStateBehavior(this, diagnostics, context);
 	}
 
 	/**
@@ -140,242 +134,188 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.FINAL_STATE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.FINAL_STATE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.FINAL_STATE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.FINAL_STATE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.FINAL_STATE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.FINAL_STATE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.FINAL_STATE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.FINAL_STATE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.FINAL_STATE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.FINAL_STATE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.FINAL_STATE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.FINAL_STATE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.FINAL_STATE___GET_MODEL :
-				return getModel();
-			case UMLPackage.FINAL_STATE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.FINAL_STATE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.FINAL_STATE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.FINAL_STATE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.FINAL_STATE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.FINAL_STATE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.FINAL_STATE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.FINAL_STATE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.FINAL_STATE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.FINAL_STATE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.FINAL_STATE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.FINAL_STATE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.FINAL_STATE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.FINAL_STATE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.FINAL_STATE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.FINAL_STATE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.FINAL_STATE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.FINAL_STATE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.FINAL_STATE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.FINAL_STATE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.FINAL_STATE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.FINAL_STATE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.FINAL_STATE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.FINAL_STATE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.FINAL_STATE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.FINAL_STATE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.FINAL_STATE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.FINAL_STATE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.FINAL_STATE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.FINAL_STATE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.FINAL_STATE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.FINAL_STATE___SEPARATOR :
-				return separator();
-			case UMLPackage.FINAL_STATE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.FINAL_STATE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.FINAL_STATE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.FINAL_STATE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.FINAL_STATE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.FINAL_STATE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.FINAL_STATE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.FINAL_STATE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.FINAL_STATE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.FINAL_STATE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.FINAL_STATE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.FINAL_STATE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.FINAL_STATE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.FINAL_STATE___CONTAINING_STATE_MACHINE :
-				return containingStateMachine();
-			case UMLPackage.FINAL_STATE___GET_INCOMINGS :
-				return getIncomings();
-			case UMLPackage.FINAL_STATE___GET_OUTGOINGS :
-				return getOutgoings();
-			case UMLPackage.FINAL_STATE___IS_CONTAINED_IN_STATE__STATE :
-				return isContainedInState((State) arguments.get(0));
-			case UMLPackage.FINAL_STATE___IS_CONTAINED_IN_REGION__REGION :
-				return isContainedInRegion((Region) arguments.get(0));
-			case UMLPackage.FINAL_STATE___VALIDATE_ENTRY_OR_EXIT__DIAGNOSTICCHAIN_MAP :
-				return validateEntryOrExit((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_SUBMACHINE_STATES__DIAGNOSTICCHAIN_MAP :
-				return validateSubmachineStates(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_COMPOSITE_STATES__DIAGNOSTICCHAIN_MAP :
-				return validateCompositeStates(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_DESTINATIONS_OR_SOURCES_OF_TRANSITIONS__DIAGNOSTICCHAIN_MAP :
-				return validateDestinationsOrSourcesOfTransitions(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_SUBMACHINE_OR_REGIONS__DIAGNOSTICCHAIN_MAP :
-				return validateSubmachineOrRegions(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___IS_COMPOSITE :
-				return isComposite();
-			case UMLPackage.FINAL_STATE___IS_ORTHOGONAL :
-				return isOrthogonal();
-			case UMLPackage.FINAL_STATE___IS_SIMPLE :
-				return isSimple();
-			case UMLPackage.FINAL_STATE___IS_SUBMACHINE_STATE :
-				return isSubmachineState();
-			case UMLPackage.FINAL_STATE___REDEFINITION_CONTEXT :
-				return redefinitionContext();
-			case UMLPackage.FINAL_STATE___VALIDATE_NO_EXIT_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateNoExitBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_NO_OUTGOING_TRANSITIONS__DIAGNOSTICCHAIN_MAP :
-				return validateNoOutgoingTransitions(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_NO_REGIONS__DIAGNOSTICCHAIN_MAP :
-				return validateNoRegions((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_CANNOT_REFERENCE_SUBMACHINE__DIAGNOSTICCHAIN_MAP :
-				return validateCannotReferenceSubmachine(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_NO_ENTRY_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateNoEntryBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FINAL_STATE___VALIDATE_NO_STATE_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateNoStateBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.FINAL_STATE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.FINAL_STATE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.FINAL_STATE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.FINAL_STATE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.FINAL_STATE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.FINAL_STATE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.FINAL_STATE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.FINAL_STATE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.FINAL_STATE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.FINAL_STATE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.FINAL_STATE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.FINAL_STATE___GET_MODEL:
+			return getModel();
+		case UMLPackage.FINAL_STATE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.FINAL_STATE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.FINAL_STATE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.FINAL_STATE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.FINAL_STATE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.FINAL_STATE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.FINAL_STATE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.FINAL_STATE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.FINAL_STATE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.FINAL_STATE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.FINAL_STATE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.FINAL_STATE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.FINAL_STATE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.FINAL_STATE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.FINAL_STATE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.FINAL_STATE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.FINAL_STATE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.FINAL_STATE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.FINAL_STATE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.FINAL_STATE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.FINAL_STATE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.FINAL_STATE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.FINAL_STATE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.FINAL_STATE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.FINAL_STATE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.FINAL_STATE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.FINAL_STATE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.FINAL_STATE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.FINAL_STATE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.FINAL_STATE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.FINAL_STATE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.FINAL_STATE___SEPARATOR:
+			return separator();
+		case UMLPackage.FINAL_STATE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.FINAL_STATE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.FINAL_STATE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.FINAL_STATE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.FINAL_STATE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.FINAL_STATE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.FINAL_STATE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.FINAL_STATE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.FINAL_STATE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.FINAL_STATE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.FINAL_STATE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.FINAL_STATE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.FINAL_STATE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.FINAL_STATE___CONTAINING_STATE_MACHINE:
+			return containingStateMachine();
+		case UMLPackage.FINAL_STATE___GET_INCOMINGS:
+			return getIncomings();
+		case UMLPackage.FINAL_STATE___GET_OUTGOINGS:
+			return getOutgoings();
+		case UMLPackage.FINAL_STATE___IS_CONTAINED_IN_STATE__STATE:
+			return isContainedInState((State) arguments.get(0));
+		case UMLPackage.FINAL_STATE___IS_CONTAINED_IN_REGION__REGION:
+			return isContainedInRegion((Region) arguments.get(0));
+		case UMLPackage.FINAL_STATE___VALIDATE_ENTRY_OR_EXIT__DIAGNOSTICCHAIN_MAP:
+			return validateEntryOrExit((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_SUBMACHINE_STATES__DIAGNOSTICCHAIN_MAP:
+			return validateSubmachineStates((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_COMPOSITE_STATES__DIAGNOSTICCHAIN_MAP:
+			return validateCompositeStates((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_DESTINATIONS_OR_SOURCES_OF_TRANSITIONS__DIAGNOSTICCHAIN_MAP:
+			return validateDestinationsOrSourcesOfTransitions((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_SUBMACHINE_OR_REGIONS__DIAGNOSTICCHAIN_MAP:
+			return validateSubmachineOrRegions((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___IS_COMPOSITE:
+			return isComposite();
+		case UMLPackage.FINAL_STATE___IS_ORTHOGONAL:
+			return isOrthogonal();
+		case UMLPackage.FINAL_STATE___IS_SIMPLE:
+			return isSimple();
+		case UMLPackage.FINAL_STATE___IS_SUBMACHINE_STATE:
+			return isSubmachineState();
+		case UMLPackage.FINAL_STATE___REDEFINITION_CONTEXT:
+			return redefinitionContext();
+		case UMLPackage.FINAL_STATE___VALIDATE_NO_EXIT_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateNoExitBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_NO_OUTGOING_TRANSITIONS__DIAGNOSTICCHAIN_MAP:
+			return validateNoOutgoingTransitions((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_NO_REGIONS__DIAGNOSTICCHAIN_MAP:
+			return validateNoRegions((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_CANNOT_REFERENCE_SUBMACHINE__DIAGNOSTICCHAIN_MAP:
+			return validateCannotReferenceSubmachine((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_NO_ENTRY_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateNoEntryBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FINAL_STATE___VALIDATE_NO_STATE_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateNoStateBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FlowFinalNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FlowFinalNodeImpl.java
index 56e7f69..a9702a9 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FlowFinalNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FlowFinalNodeImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ForkNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ForkNodeImpl.java
index a4fe9cd..b6e9bb8 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ForkNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ForkNodeImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -67,8 +67,7 @@
 	 */
 	public boolean validateOneIncomingEdge(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ForkNodeOperations.validateOneIncomingEdge(this, diagnostics,
-			context);
+		return ForkNodeOperations.validateOneIncomingEdge(this, diagnostics, context);
 	}
 
 	/**
@@ -91,151 +90,126 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.FORK_NODE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.FORK_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FORK_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FORK_NODE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.FORK_NODE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.FORK_NODE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.FORK_NODE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.FORK_NODE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.FORK_NODE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.FORK_NODE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.FORK_NODE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.FORK_NODE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.FORK_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.FORK_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.FORK_NODE___GET_MODEL :
-				return getModel();
-			case UMLPackage.FORK_NODE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.FORK_NODE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.FORK_NODE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.FORK_NODE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.FORK_NODE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.FORK_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.FORK_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.FORK_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.FORK_NODE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.FORK_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.FORK_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.FORK_NODE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.FORK_NODE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.FORK_NODE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.FORK_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.FORK_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.FORK_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.FORK_NODE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.FORK_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.FORK_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.FORK_NODE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.FORK_NODE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.FORK_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FORK_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FORK_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FORK_NODE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.FORK_NODE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.FORK_NODE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.FORK_NODE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.FORK_NODE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.FORK_NODE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.FORK_NODE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.FORK_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.FORK_NODE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.FORK_NODE___SEPARATOR :
-				return separator();
-			case UMLPackage.FORK_NODE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.FORK_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FORK_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FORK_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FORK_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.FORK_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.FORK_NODE___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.FORK_NODE___VALIDATE_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FORK_NODE___VALIDATE_ONE_INCOMING_EDGE__DIAGNOSTICCHAIN_MAP :
-				return validateOneIncomingEdge(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FORK_NODE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.FORK_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FORK_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FORK_NODE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.FORK_NODE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.FORK_NODE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.FORK_NODE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.FORK_NODE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.FORK_NODE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.FORK_NODE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.FORK_NODE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.FORK_NODE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.FORK_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.FORK_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.FORK_NODE___GET_MODEL:
+			return getModel();
+		case UMLPackage.FORK_NODE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.FORK_NODE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.FORK_NODE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.FORK_NODE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.FORK_NODE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.FORK_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.FORK_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.FORK_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.FORK_NODE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.FORK_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.FORK_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.FORK_NODE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.FORK_NODE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.FORK_NODE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.FORK_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.FORK_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.FORK_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.FORK_NODE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.FORK_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.FORK_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.FORK_NODE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.FORK_NODE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.FORK_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FORK_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FORK_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FORK_NODE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.FORK_NODE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.FORK_NODE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.FORK_NODE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.FORK_NODE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.FORK_NODE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.FORK_NODE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.FORK_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.FORK_NODE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.FORK_NODE___SEPARATOR:
+			return separator();
+		case UMLPackage.FORK_NODE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.FORK_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FORK_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FORK_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FORK_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.FORK_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.FORK_NODE___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.FORK_NODE___VALIDATE_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FORK_NODE___VALIDATE_ONE_INCOMING_EDGE__DIAGNOSTICCHAIN_MAP:
+			return validateOneIncomingEdge((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FunctionBehaviorImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FunctionBehaviorImpl.java
index e6f6ecc..b3091ca 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FunctionBehaviorImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/FunctionBehaviorImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -75,8 +75,7 @@
 	 */
 	public boolean validateOneOutputParameter(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return FunctionBehaviorOperations.validateOneOutputParameter(this,
-			diagnostics, context);
+		return FunctionBehaviorOperations.validateOneOutputParameter(this, diagnostics, context);
 	}
 
 	/**
@@ -86,8 +85,7 @@
 	 */
 	public boolean validateTypesOfParameters(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return FunctionBehaviorOperations.validateTypesOfParameters(this,
-			diagnostics, context);
+		return FunctionBehaviorOperations.validateTypesOfParameters(this, diagnostics, context);
 	}
 
 	/**
@@ -109,332 +107,261 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_MODEL :
-				return getModel();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.FUNCTION_BEHAVIOR___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.FUNCTION_BEHAVIOR___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_LABEL :
-				return getLabel();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.FUNCTION_BEHAVIOR___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.FUNCTION_BEHAVIOR___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.FUNCTION_BEHAVIOR___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.FUNCTION_BEHAVIOR___SEPARATOR :
-				return separator();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.FUNCTION_BEHAVIOR___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.FUNCTION_BEHAVIOR___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.FUNCTION_BEHAVIOR___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.FUNCTION_BEHAVIOR___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.FUNCTION_BEHAVIOR___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.FUNCTION_BEHAVIOR___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.FUNCTION_BEHAVIOR___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.FUNCTION_BEHAVIOR___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___PARENTS :
-				return parents();
-			case UMLPackage.FUNCTION_BEHAVIOR___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.FUNCTION_BEHAVIOR___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.FUNCTION_BEHAVIOR___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.FUNCTION_BEHAVIOR___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.FUNCTION_BEHAVIOR___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.FUNCTION_BEHAVIOR___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.FUNCTION_BEHAVIOR___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_PARTS :
-				return getParts();
-			case UMLPackage.FUNCTION_BEHAVIOR___ALL_ROLES :
-				return allRoles();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_OWNED_PORTS :
-				return getOwnedPorts();
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateClassBehavior((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_ALL_IMPLEMENTED_INTERFACES :
-				return getAllImplementedInterfaces();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_IMPLEMENTED_INTERFACES :
-				return getImplementedInterfaces();
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP :
-				return validatePassiveClass((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
-			case UMLPackage.FUNCTION_BEHAVIOR___IS_METACLASS :
-				return isMetaclass();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_EXTENSIONS :
-				return getExtensions();
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_SUPER_CLASSES :
-				return getSuperClasses();
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_MOST_ONE_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateMostOneBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_PARAMETERS_MATCH__DIAGNOSTICCHAIN_MAP :
-				return validateParametersMatch(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_FEATURE_OF_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateFeatureOfContextClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.FUNCTION_BEHAVIOR___BEHAVIORED_CLASSIFIER__ELEMENT :
-				return behavioredClassifier((Element) arguments.get(0));
-			case UMLPackage.FUNCTION_BEHAVIOR___INPUT_PARAMETERS :
-				return inputParameters();
-			case UMLPackage.FUNCTION_BEHAVIOR___OUTPUT_PARAMETERS :
-				return outputParameters();
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_ONE_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP :
-				return validateOneOutputParameter(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_TYPES_OF_PARAMETERS__DIAGNOSTICCHAIN_MAP :
-				return validateTypesOfParameters(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.FUNCTION_BEHAVIOR___HAS_ALL_DATA_TYPE_ATTRIBUTES__DATATYPE :
-				return hasAllDataTypeAttributes((DataType) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_MODEL:
+			return getModel();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.FUNCTION_BEHAVIOR___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.FUNCTION_BEHAVIOR___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_LABEL:
+			return getLabel();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.FUNCTION_BEHAVIOR___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.FUNCTION_BEHAVIOR___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.FUNCTION_BEHAVIOR___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.FUNCTION_BEHAVIOR___SEPARATOR:
+			return separator();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.FUNCTION_BEHAVIOR___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.FUNCTION_BEHAVIOR___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.FUNCTION_BEHAVIOR___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.FUNCTION_BEHAVIOR___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.FUNCTION_BEHAVIOR___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.FUNCTION_BEHAVIOR___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.FUNCTION_BEHAVIOR___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.FUNCTION_BEHAVIOR___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___PARENTS:
+			return parents();
+		case UMLPackage.FUNCTION_BEHAVIOR___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.FUNCTION_BEHAVIOR___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.FUNCTION_BEHAVIOR___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.FUNCTION_BEHAVIOR___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.FUNCTION_BEHAVIOR___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.FUNCTION_BEHAVIOR___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.FUNCTION_BEHAVIOR___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_PARTS:
+			return getParts();
+		case UMLPackage.FUNCTION_BEHAVIOR___ALL_ROLES:
+			return allRoles();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_OWNED_PORTS:
+			return getOwnedPorts();
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateClassBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_ALL_IMPLEMENTED_INTERFACES:
+			return getAllImplementedInterfaces();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_IMPLEMENTED_INTERFACES:
+			return getImplementedInterfaces();
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP:
+			return validatePassiveClass((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.FUNCTION_BEHAVIOR___IS_METACLASS:
+			return isMetaclass();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_EXTENSIONS:
+			return getExtensions();
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_SUPER_CLASSES:
+			return getSuperClasses();
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_MOST_ONE_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateMostOneBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_PARAMETERS_MATCH__DIAGNOSTICCHAIN_MAP:
+			return validateParametersMatch((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_FEATURE_OF_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateFeatureOfContextClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.FUNCTION_BEHAVIOR___BEHAVIORED_CLASSIFIER__ELEMENT:
+			return behavioredClassifier((Element) arguments.get(0));
+		case UMLPackage.FUNCTION_BEHAVIOR___INPUT_PARAMETERS:
+			return inputParameters();
+		case UMLPackage.FUNCTION_BEHAVIOR___OUTPUT_PARAMETERS:
+			return outputParameters();
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_ONE_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP:
+			return validateOneOutputParameter((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___VALIDATE_TYPES_OF_PARAMETERS__DIAGNOSTICCHAIN_MAP:
+			return validateTypesOfParameters((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.FUNCTION_BEHAVIOR___HAS_ALL_DATA_TYPE_ATTRIBUTES__DATATYPE:
+			return hasAllDataTypeAttributes((DataType) arguments.get(0));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GateImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GateImpl.java
index 3e8e546..ffa0d0b 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GateImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GateImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -69,8 +69,7 @@
 	 */
 	public boolean validateActualGateMatched(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return GateOperations.validateActualGateMatched(this, diagnostics,
-			context);
+		return GateOperations.validateActualGateMatched(this, diagnostics, context);
 	}
 
 	/**
@@ -80,8 +79,7 @@
 	 */
 	public boolean validateInsideCfMatched(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return GateOperations.validateInsideCfMatched(this, diagnostics,
-			context);
+		return GateOperations.validateInsideCfMatched(this, diagnostics, context);
 	}
 
 	/**
@@ -91,8 +89,7 @@
 	 */
 	public boolean validateOutsideCfMatched(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return GateOperations.validateOutsideCfMatched(this, diagnostics,
-			context);
+		return GateOperations.validateOutsideCfMatched(this, diagnostics, context);
 	}
 
 	/**
@@ -102,8 +99,7 @@
 	 */
 	public boolean validateFormalGateDistinguishable(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return GateOperations.validateFormalGateDistinguishable(this,
-			diagnostics, context);
+		return GateOperations.validateFormalGateDistinguishable(this, diagnostics, context);
 	}
 
 	/**
@@ -113,8 +109,7 @@
 	 */
 	public boolean validateActualGateDistinguishable(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return GateOperations.validateActualGateDistinguishable(this,
-			diagnostics, context);
+		return GateOperations.validateActualGateDistinguishable(this, diagnostics, context);
 	}
 
 	/**
@@ -124,8 +119,7 @@
 	 */
 	public boolean validateOutsideCfGateDistinguishable(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return GateOperations.validateOutsideCfGateDistinguishable(this,
-			diagnostics, context);
+		return GateOperations.validateOutsideCfGateDistinguishable(this, diagnostics, context);
 	}
 
 	/**
@@ -135,8 +129,7 @@
 	 */
 	public boolean validateInsideCfGateDistinguishable(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return GateOperations.validateInsideCfGateDistinguishable(this,
-			diagnostics, context);
+		return GateOperations.validateInsideCfGateDistinguishable(this, diagnostics, context);
 	}
 
 	/**
@@ -213,175 +206,146 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.GATE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.GATE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GATE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GATE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.GATE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.GATE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.GATE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.GATE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.GATE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.GATE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.GATE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.GATE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.GATE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.GATE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.GATE___GET_MODEL :
-				return getModel();
-			case UMLPackage.GATE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.GATE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.GATE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.GATE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.GATE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.GATE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.GATE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.GATE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.GATE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.GATE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.GATE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.GATE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.GATE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.GATE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.GATE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.GATE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.GATE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.GATE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.GATE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.GATE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.GATE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.GATE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.GATE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GATE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GATE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GATE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.GATE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.GATE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.GATE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.GATE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.GATE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.GATE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.GATE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.GATE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.GATE___SEPARATOR :
-				return separator();
-			case UMLPackage.GATE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.GATE___OPPOSITE_END :
-				return oppositeEnd();
-			case UMLPackage.GATE___IS_SEND :
-				return isSend();
-			case UMLPackage.GATE___IS_RECEIVE :
-				return isReceive();
-			case UMLPackage.GATE___ENCLOSING_FRAGMENT :
-				return enclosingFragment();
-			case UMLPackage.GATE___VALIDATE_ACTUAL_GATE_MATCHED__DIAGNOSTICCHAIN_MAP :
-				return validateActualGateMatched(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GATE___VALIDATE_INSIDE_CF_MATCHED__DIAGNOSTICCHAIN_MAP :
-				return validateInsideCfMatched(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GATE___VALIDATE_OUTSIDE_CF_MATCHED__DIAGNOSTICCHAIN_MAP :
-				return validateOutsideCfMatched(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GATE___VALIDATE_FORMAL_GATE_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateFormalGateDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GATE___VALIDATE_ACTUAL_GATE_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateActualGateDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GATE___VALIDATE_OUTSIDE_CF_GATE_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateOutsideCfGateDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GATE___VALIDATE_INSIDE_CF_GATE_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateInsideCfGateDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GATE___IS_OUTSIDE_CF :
-				return isOutsideCF();
-			case UMLPackage.GATE___IS_INSIDE_CF :
-				return isInsideCF();
-			case UMLPackage.GATE___IS_ACTUAL :
-				return isActual();
-			case UMLPackage.GATE___IS_FORMAL :
-				return isFormal();
-			case UMLPackage.GATE___GET_NAME :
-				return getName();
-			case UMLPackage.GATE___MATCHES__GATE :
-				return matches((Gate) arguments.get(0));
-			case UMLPackage.GATE___GET_OPERAND :
-				return getOperand();
+		case UMLPackage.GATE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.GATE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GATE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GATE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.GATE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.GATE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.GATE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.GATE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.GATE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.GATE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.GATE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.GATE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.GATE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.GATE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.GATE___GET_MODEL:
+			return getModel();
+		case UMLPackage.GATE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.GATE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.GATE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.GATE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.GATE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.GATE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.GATE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.GATE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.GATE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.GATE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.GATE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.GATE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.GATE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.GATE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.GATE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.GATE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.GATE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.GATE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.GATE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.GATE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.GATE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.GATE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.GATE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GATE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GATE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GATE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.GATE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.GATE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.GATE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.GATE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.GATE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.GATE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.GATE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.GATE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.GATE___SEPARATOR:
+			return separator();
+		case UMLPackage.GATE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.GATE___OPPOSITE_END:
+			return oppositeEnd();
+		case UMLPackage.GATE___IS_SEND:
+			return isSend();
+		case UMLPackage.GATE___IS_RECEIVE:
+			return isReceive();
+		case UMLPackage.GATE___ENCLOSING_FRAGMENT:
+			return enclosingFragment();
+		case UMLPackage.GATE___VALIDATE_ACTUAL_GATE_MATCHED__DIAGNOSTICCHAIN_MAP:
+			return validateActualGateMatched((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GATE___VALIDATE_INSIDE_CF_MATCHED__DIAGNOSTICCHAIN_MAP:
+			return validateInsideCfMatched((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GATE___VALIDATE_OUTSIDE_CF_MATCHED__DIAGNOSTICCHAIN_MAP:
+			return validateOutsideCfMatched((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GATE___VALIDATE_FORMAL_GATE_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateFormalGateDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GATE___VALIDATE_ACTUAL_GATE_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateActualGateDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GATE___VALIDATE_OUTSIDE_CF_GATE_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateOutsideCfGateDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GATE___VALIDATE_INSIDE_CF_GATE_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateInsideCfGateDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GATE___IS_OUTSIDE_CF:
+			return isOutsideCF();
+		case UMLPackage.GATE___IS_INSIDE_CF:
+			return isInsideCF();
+		case UMLPackage.GATE___IS_ACTUAL:
+			return isActual();
+		case UMLPackage.GATE___IS_FORMAL:
+			return isFormal();
+		case UMLPackage.GATE___GET_NAME:
+			return getName();
+		case UMLPackage.GATE___MATCHES__GATE:
+			return matches((Gate) arguments.get(0));
+		case UMLPackage.GATE___GET_OPERAND:
+			return getOperand();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -400,12 +364,12 @@
 
 			if (isActual() || isOutsideCF()) {
 				return (isSend()
-					? "out_" //$NON-NLS-1$
-					: "in_") + message.getName(); //$NON-NLS-1$
+						? "out_" //$NON-NLS-1$
+						: "in_") + message.getName(); //$NON-NLS-1$
 			} else {
 				return (isSend()
-					? "in_" //$NON-NLS-1$
-					: "out_") + message.getName(); //$NON-NLS-1$
+						? "in_" //$NON-NLS-1$
+						: "out_") + message.getName(); //$NON-NLS-1$
 			}
 		}
 
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GeneralOrderingImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GeneralOrderingImpl.java
index b1f2985..75118d7 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GeneralOrderingImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GeneralOrderingImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -15,6 +16,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -23,6 +25,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Comment;
@@ -79,9 +83,7 @@
 	 * @generated
 	 */
 	public OccurrenceSpecification getBefore() {
-		return (OccurrenceSpecification) eDynamicGet(
-			UMLPackage.GENERAL_ORDERING__BEFORE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERAL_ORDERING__BEFORE, true, true);
+		return (OccurrenceSpecification) eDynamicGet(UMLPackage.GENERAL_ORDERING__BEFORE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERAL_ORDERING__BEFORE, true, true);
 	}
 
 	/**
@@ -90,9 +92,7 @@
 	 * @generated
 	 */
 	public OccurrenceSpecification basicGetBefore() {
-		return (OccurrenceSpecification) eDynamicGet(
-			UMLPackage.GENERAL_ORDERING__BEFORE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERAL_ORDERING__BEFORE, false, true);
+		return (OccurrenceSpecification) eDynamicGet(UMLPackage.GENERAL_ORDERING__BEFORE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERAL_ORDERING__BEFORE, false, true);
 	}
 
 	/**
@@ -102,8 +102,7 @@
 	 */
 	public NotificationChain basicSetBefore(OccurrenceSpecification newBefore,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newBefore,
-			UMLPackage.GENERAL_ORDERING__BEFORE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newBefore, UMLPackage.GENERAL_ORDERING__BEFORE, msgs);
 		return msgs;
 	}
 
@@ -113,8 +112,7 @@
 	 * @generated
 	 */
 	public void setBefore(OccurrenceSpecification newBefore) {
-		eDynamicSet(UMLPackage.GENERAL_ORDERING__BEFORE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERAL_ORDERING__BEFORE, newBefore);
+		eDynamicSet(UMLPackage.GENERAL_ORDERING__BEFORE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERAL_ORDERING__BEFORE, newBefore);
 	}
 
 	/**
@@ -124,8 +122,7 @@
 	 */
 	public boolean validateIrreflexiveTransitiveClosure(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return GeneralOrderingOperations
-			.validateIrreflexiveTransitiveClosure(this, diagnostics, context);
+		return GeneralOrderingOperations.validateIrreflexiveTransitiveClosure(this, diagnostics, context);
 	}
 
 	/**
@@ -134,9 +131,7 @@
 	 * @generated
 	 */
 	public OccurrenceSpecification getAfter() {
-		return (OccurrenceSpecification) eDynamicGet(
-			UMLPackage.GENERAL_ORDERING__AFTER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERAL_ORDERING__AFTER, true, true);
+		return (OccurrenceSpecification) eDynamicGet(UMLPackage.GENERAL_ORDERING__AFTER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERAL_ORDERING__AFTER, true, true);
 	}
 
 	/**
@@ -145,9 +140,7 @@
 	 * @generated
 	 */
 	public OccurrenceSpecification basicGetAfter() {
-		return (OccurrenceSpecification) eDynamicGet(
-			UMLPackage.GENERAL_ORDERING__AFTER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERAL_ORDERING__AFTER, false, true);
+		return (OccurrenceSpecification) eDynamicGet(UMLPackage.GENERAL_ORDERING__AFTER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERAL_ORDERING__AFTER, false, true);
 	}
 
 	/**
@@ -157,8 +150,7 @@
 	 */
 	public NotificationChain basicSetAfter(OccurrenceSpecification newAfter,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newAfter,
-			UMLPackage.GENERAL_ORDERING__AFTER, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newAfter, UMLPackage.GENERAL_ORDERING__AFTER, msgs);
 		return msgs;
 	}
 
@@ -168,8 +160,7 @@
 	 * @generated
 	 */
 	public void setAfter(OccurrenceSpecification newAfter) {
-		eDynamicSet(UMLPackage.GENERAL_ORDERING__AFTER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERAL_ORDERING__AFTER, newAfter);
+		eDynamicSet(UMLPackage.GENERAL_ORDERING__AFTER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERAL_ORDERING__AFTER, newAfter);
 	}
 
 	/**
@@ -182,23 +173,18 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.GENERAL_ORDERING__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.GENERAL_ORDERING__AFTER :
-				OccurrenceSpecification after = basicGetAfter();
-				if (after != null)
-					msgs = ((InternalEObject) after).eInverseRemove(this,
-						UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE,
-						OccurrenceSpecification.class, msgs);
-				return basicSetAfter((OccurrenceSpecification) otherEnd, msgs);
-			case UMLPackage.GENERAL_ORDERING__BEFORE :
-				OccurrenceSpecification before = basicGetBefore();
-				if (before != null)
-					msgs = ((InternalEObject) before).eInverseRemove(this,
-						UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER,
-						OccurrenceSpecification.class, msgs);
-				return basicSetBefore((OccurrenceSpecification) otherEnd, msgs);
+		case UMLPackage.GENERAL_ORDERING__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.GENERAL_ORDERING__AFTER:
+			OccurrenceSpecification after = basicGetAfter();
+			if (after != null)
+				msgs = ((InternalEObject) after).eInverseRemove(this, UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE, OccurrenceSpecification.class, msgs);
+			return basicSetAfter((OccurrenceSpecification) otherEnd, msgs);
+		case UMLPackage.GENERAL_ORDERING__BEFORE:
+			OccurrenceSpecification before = basicGetBefore();
+			if (before != null)
+				msgs = ((InternalEObject) before).eInverseRemove(this, UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER, OccurrenceSpecification.class, msgs);
+			return basicSetBefore((OccurrenceSpecification) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -212,18 +198,16 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.GENERAL_ORDERING__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.GENERAL_ORDERING__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.GENERAL_ORDERING__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.GENERAL_ORDERING__AFTER :
-				return basicSetAfter(null, msgs);
-			case UMLPackage.GENERAL_ORDERING__BEFORE :
-				return basicSetBefore(null, msgs);
+		case UMLPackage.GENERAL_ORDERING__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.GENERAL_ORDERING__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.GENERAL_ORDERING__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.GENERAL_ORDERING__AFTER:
+			return basicSetAfter(null, msgs);
+		case UMLPackage.GENERAL_ORDERING__BEFORE:
+			return basicSetBefore(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -236,40 +220,40 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.GENERAL_ORDERING__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.GENERAL_ORDERING__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.GENERAL_ORDERING__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.GENERAL_ORDERING__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.GENERAL_ORDERING__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.GENERAL_ORDERING__NAME :
-				return getName();
-			case UMLPackage.GENERAL_ORDERING__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.GENERAL_ORDERING__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.GENERAL_ORDERING__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.GENERAL_ORDERING__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.GENERAL_ORDERING__AFTER :
-				if (resolve)
-					return getAfter();
-				return basicGetAfter();
-			case UMLPackage.GENERAL_ORDERING__BEFORE :
-				if (resolve)
-					return getBefore();
-				return basicGetBefore();
+		case UMLPackage.GENERAL_ORDERING__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.GENERAL_ORDERING__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.GENERAL_ORDERING__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.GENERAL_ORDERING__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.GENERAL_ORDERING__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.GENERAL_ORDERING__NAME:
+			return getName();
+		case UMLPackage.GENERAL_ORDERING__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.GENERAL_ORDERING__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.GENERAL_ORDERING__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.GENERAL_ORDERING__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.GENERAL_ORDERING__AFTER:
+			if (resolve)
+				return getAfter();
+			return basicGetAfter();
+		case UMLPackage.GENERAL_ORDERING__BEFORE:
+			if (resolve)
+				return getBefore();
+			return basicGetBefore();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -283,31 +267,29 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.GENERAL_ORDERING__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.GENERAL_ORDERING__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.GENERAL_ORDERING__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.GENERAL_ORDERING__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.GENERAL_ORDERING__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.GENERAL_ORDERING__AFTER :
-				setAfter((OccurrenceSpecification) newValue);
-				return;
-			case UMLPackage.GENERAL_ORDERING__BEFORE :
-				setBefore((OccurrenceSpecification) newValue);
-				return;
+		case UMLPackage.GENERAL_ORDERING__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.GENERAL_ORDERING__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.GENERAL_ORDERING__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.GENERAL_ORDERING__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.GENERAL_ORDERING__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.GENERAL_ORDERING__AFTER:
+			setAfter((OccurrenceSpecification) newValue);
+			return;
+		case UMLPackage.GENERAL_ORDERING__BEFORE:
+			setBefore((OccurrenceSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -320,27 +302,27 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.GENERAL_ORDERING__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.GENERAL_ORDERING__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.GENERAL_ORDERING__NAME :
-				unsetName();
-				return;
-			case UMLPackage.GENERAL_ORDERING__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.GENERAL_ORDERING__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.GENERAL_ORDERING__AFTER :
-				setAfter((OccurrenceSpecification) null);
-				return;
-			case UMLPackage.GENERAL_ORDERING__BEFORE :
-				setBefore((OccurrenceSpecification) null);
-				return;
+		case UMLPackage.GENERAL_ORDERING__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.GENERAL_ORDERING__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.GENERAL_ORDERING__NAME:
+			unsetName();
+			return;
+		case UMLPackage.GENERAL_ORDERING__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.GENERAL_ORDERING__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.GENERAL_ORDERING__AFTER:
+			setAfter((OccurrenceSpecification) null);
+			return;
+		case UMLPackage.GENERAL_ORDERING__BEFORE:
+			setBefore((OccurrenceSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -353,32 +335,30 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.GENERAL_ORDERING__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.GENERAL_ORDERING__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.GENERAL_ORDERING__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.GENERAL_ORDERING__OWNER :
-				return isSetOwner();
-			case UMLPackage.GENERAL_ORDERING__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.GENERAL_ORDERING__NAME :
-				return isSetName();
-			case UMLPackage.GENERAL_ORDERING__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.GENERAL_ORDERING__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.GENERAL_ORDERING__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.GENERAL_ORDERING__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.GENERAL_ORDERING__AFTER :
-				return basicGetAfter() != null;
-			case UMLPackage.GENERAL_ORDERING__BEFORE :
-				return basicGetBefore() != null;
+		case UMLPackage.GENERAL_ORDERING__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.GENERAL_ORDERING__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.GENERAL_ORDERING__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.GENERAL_ORDERING__OWNER:
+			return isSetOwner();
+		case UMLPackage.GENERAL_ORDERING__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.GENERAL_ORDERING__NAME:
+			return isSetName();
+		case UMLPackage.GENERAL_ORDERING__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.GENERAL_ORDERING__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.GENERAL_ORDERING__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.GENERAL_ORDERING__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.GENERAL_ORDERING__AFTER:
+			return basicGetAfter() != null;
+		case UMLPackage.GENERAL_ORDERING__BEFORE:
+			return basicGetBefore() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -393,129 +373,112 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.GENERAL_ORDERING___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GENERAL_ORDERING___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GENERAL_ORDERING___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.GENERAL_ORDERING___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.GENERAL_ORDERING___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.GENERAL_ORDERING___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.GENERAL_ORDERING___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.GENERAL_ORDERING___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___GET_MODEL :
-				return getModel();
-			case UMLPackage.GENERAL_ORDERING___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.GENERAL_ORDERING___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.GENERAL_ORDERING___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.GENERAL_ORDERING___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.GENERAL_ORDERING___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.GENERAL_ORDERING___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.GENERAL_ORDERING___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.GENERAL_ORDERING___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.GENERAL_ORDERING___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.GENERAL_ORDERING___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.GENERAL_ORDERING___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.GENERAL_ORDERING___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GENERAL_ORDERING___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GENERAL_ORDERING___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GENERAL_ORDERING___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___GET_LABEL :
-				return getLabel();
-			case UMLPackage.GENERAL_ORDERING___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.GENERAL_ORDERING___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.GENERAL_ORDERING___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.GENERAL_ORDERING___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.GENERAL_ORDERING___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.GENERAL_ORDERING___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.GENERAL_ORDERING___SEPARATOR :
-				return separator();
-			case UMLPackage.GENERAL_ORDERING___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.GENERAL_ORDERING___VALIDATE_IRREFLEXIVE_TRANSITIVE_CLOSURE__DIAGNOSTICCHAIN_MAP :
-				return validateIrreflexiveTransitiveClosure(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GENERAL_ORDERING___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GENERAL_ORDERING___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GENERAL_ORDERING___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.GENERAL_ORDERING___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.GENERAL_ORDERING___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.GENERAL_ORDERING___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.GENERAL_ORDERING___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.GENERAL_ORDERING___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___GET_MODEL:
+			return getModel();
+		case UMLPackage.GENERAL_ORDERING___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.GENERAL_ORDERING___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.GENERAL_ORDERING___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.GENERAL_ORDERING___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.GENERAL_ORDERING___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.GENERAL_ORDERING___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.GENERAL_ORDERING___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.GENERAL_ORDERING___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.GENERAL_ORDERING___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.GENERAL_ORDERING___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.GENERAL_ORDERING___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.GENERAL_ORDERING___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GENERAL_ORDERING___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GENERAL_ORDERING___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GENERAL_ORDERING___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___GET_LABEL:
+			return getLabel();
+		case UMLPackage.GENERAL_ORDERING___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.GENERAL_ORDERING___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.GENERAL_ORDERING___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.GENERAL_ORDERING___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.GENERAL_ORDERING___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.GENERAL_ORDERING___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.GENERAL_ORDERING___SEPARATOR:
+			return separator();
+		case UMLPackage.GENERAL_ORDERING___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.GENERAL_ORDERING___VALIDATE_IRREFLEXIVE_TRANSITIVE_CLOSURE__DIAGNOSTICCHAIN_MAP:
+			return validateIrreflexiveTransitiveClosure((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GeneralizationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GeneralizationImpl.java
index b2c3d50..b1c0b99 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GeneralizationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GeneralizationImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -15,6 +15,7 @@
 
 import java.util.Collection;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -23,8 +24,12 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -100,19 +105,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> targets = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			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>(
-						Element.class, this, UMLPackage.GENERALIZATION__TARGET,
-						TARGET_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET, targets = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.GENERALIZATION__TARGET, TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.GENERALIZATION__TARGET, TARGET_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.GENERALIZATION__TARGET, TARGET_ESUBSETS);
 	}
 
 	/**
@@ -126,19 +125,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> sources = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			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>(
-						Element.class, this, UMLPackage.GENERALIZATION__SOURCE,
-						SOURCE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE, sources = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.GENERALIZATION__SOURCE, SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.GENERALIZATION__SOURCE, SOURCE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.GENERALIZATION__SOURCE, SOURCE_ESUBSETS);
 	}
 
 	/**
@@ -147,9 +140,7 @@
 	 * @generated
 	 */
 	public boolean isSubstitutable() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.GENERALIZATION__IS_SUBSTITUTABLE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION__IS_SUBSTITUTABLE, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.GENERALIZATION__IS_SUBSTITUTABLE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION__IS_SUBSTITUTABLE, true, true);
 	}
 
 	/**
@@ -158,10 +149,7 @@
 	 * @generated
 	 */
 	public void setIsSubstitutable(boolean newIsSubstitutable) {
-		eDynamicSet(
-			UMLPackage.GENERALIZATION__IS_SUBSTITUTABLE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION__IS_SUBSTITUTABLE,
-			newIsSubstitutable);
+		eDynamicSet(UMLPackage.GENERALIZATION__IS_SUBSTITUTABLE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION__IS_SUBSTITUTABLE, newIsSubstitutable);
 	}
 
 	/**
@@ -170,9 +158,7 @@
 	 * @generated
 	 */
 	public Classifier getGeneral() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.GENERALIZATION__GENERAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION__GENERAL, true, true);
+		return (Classifier) eDynamicGet(UMLPackage.GENERALIZATION__GENERAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION__GENERAL, true, true);
 	}
 
 	/**
@@ -181,9 +167,7 @@
 	 * @generated
 	 */
 	public Classifier basicGetGeneral() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.GENERALIZATION__GENERAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION__GENERAL, false, true);
+		return (Classifier) eDynamicGet(UMLPackage.GENERALIZATION__GENERAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION__GENERAL, false, true);
 	}
 
 	/**
@@ -192,8 +176,7 @@
 	 * @generated
 	 */
 	public void setGeneral(Classifier newGeneral) {
-		eDynamicSet(UMLPackage.GENERALIZATION__GENERAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION__GENERAL, newGeneral);
+		eDynamicSet(UMLPackage.GENERALIZATION__GENERAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION__GENERAL, newGeneral);
 	}
 
 	/**
@@ -203,10 +186,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<GeneralizationSet> getGeneralizationSets() {
-		return (EList<GeneralizationSet>) eDynamicGet(
-			UMLPackage.GENERALIZATION__GENERALIZATION_SET
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION__GENERALIZATION_SET, true, true);
+		return (EList<GeneralizationSet>) eDynamicGet(UMLPackage.GENERALIZATION__GENERALIZATION_SET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION__GENERALIZATION_SET, true, true);
 	}
 
 	/**
@@ -225,10 +205,8 @@
 	 */
 	public GeneralizationSet getGeneralizationSet(String name,
 			boolean ignoreCase) {
-		generalizationSetLoop : for (GeneralizationSet generalizationSet : getGeneralizationSets()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(generalizationSet.getName())
-				: name.equals(generalizationSet.getName())))
+		generalizationSetLoop: for (GeneralizationSet generalizationSet : getGeneralizationSets()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(generalizationSet.getName()) : name.equals(generalizationSet.getName())))
 				continue generalizationSetLoop;
 			return generalizationSet;
 		}
@@ -241,9 +219,7 @@
 	 * @generated
 	 */
 	public Classifier getSpecific() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.GENERALIZATION__SPECIFIC - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION__SPECIFIC, true, true);
+		return (Classifier) eDynamicGet(UMLPackage.GENERALIZATION__SPECIFIC - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION__SPECIFIC, true, true);
 	}
 
 	/**
@@ -252,9 +228,7 @@
 	 * @generated
 	 */
 	public Classifier basicGetSpecific() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.GENERALIZATION__SPECIFIC - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION__SPECIFIC, false, true);
+		return (Classifier) eDynamicGet(UMLPackage.GENERALIZATION__SPECIFIC - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION__SPECIFIC, false, true);
 	}
 
 	/**
@@ -264,8 +238,7 @@
 	 */
 	public NotificationChain basicSetSpecific(Classifier newSpecific,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newSpecific,
-			UMLPackage.GENERALIZATION__SPECIFIC, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newSpecific, UMLPackage.GENERALIZATION__SPECIFIC, msgs);
 		return msgs;
 	}
 
@@ -275,8 +248,7 @@
 	 * @generated
 	 */
 	public void setSpecific(Classifier newSpecific) {
-		eDynamicSet(UMLPackage.GENERALIZATION__SPECIFIC - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION__SPECIFIC, newSpecific);
+		eDynamicSet(UMLPackage.GENERALIZATION__SPECIFIC - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION__SPECIFIC, newSpecific);
 	}
 
 	/**
@@ -289,16 +261,14 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.GENERALIZATION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.GENERALIZATION__GENERALIZATION_SET :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizationSets())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.GENERALIZATION__SPECIFIC :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetSpecific((Classifier) otherEnd, msgs);
+		case UMLPackage.GENERALIZATION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.GENERALIZATION__GENERALIZATION_SET:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizationSets()).basicAdd(otherEnd, msgs);
+		case UMLPackage.GENERALIZATION__SPECIFIC:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetSpecific((Classifier) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -312,17 +282,14 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.GENERALIZATION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.GENERALIZATION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.GENERALIZATION__GENERALIZATION_SET :
-				return ((InternalEList<?>) getGeneralizationSets())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.GENERALIZATION__SPECIFIC :
-				return basicSetSpecific(null, msgs);
+		case UMLPackage.GENERALIZATION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.GENERALIZATION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.GENERALIZATION__GENERALIZATION_SET:
+			return ((InternalEList<?>) getGeneralizationSets()).basicRemove(otherEnd, msgs);
+		case UMLPackage.GENERALIZATION__SPECIFIC:
+			return basicSetSpecific(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -336,10 +303,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.GENERALIZATION__SPECIFIC :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.CLASSIFIER__GENERALIZATION, Classifier.class,
-					msgs);
+		case UMLPackage.GENERALIZATION__SPECIFIC:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.CLASSIFIER__GENERALIZATION, Classifier.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -352,34 +317,34 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.GENERALIZATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.GENERALIZATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.GENERALIZATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.GENERALIZATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.GENERALIZATION__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.GENERALIZATION__SOURCE :
-				return getSources();
-			case UMLPackage.GENERALIZATION__TARGET :
-				return getTargets();
-			case UMLPackage.GENERALIZATION__GENERAL :
-				if (resolve)
-					return getGeneral();
-				return basicGetGeneral();
-			case UMLPackage.GENERALIZATION__GENERALIZATION_SET :
-				return getGeneralizationSets();
-			case UMLPackage.GENERALIZATION__IS_SUBSTITUTABLE :
-				return isSubstitutable();
-			case UMLPackage.GENERALIZATION__SPECIFIC :
-				if (resolve)
-					return getSpecific();
-				return basicGetSpecific();
+		case UMLPackage.GENERALIZATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.GENERALIZATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.GENERALIZATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.GENERALIZATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.GENERALIZATION__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.GENERALIZATION__SOURCE:
+			return getSources();
+		case UMLPackage.GENERALIZATION__TARGET:
+			return getTargets();
+		case UMLPackage.GENERALIZATION__GENERAL:
+			if (resolve)
+				return getGeneral();
+			return basicGetGeneral();
+		case UMLPackage.GENERALIZATION__GENERALIZATION_SET:
+			return getGeneralizationSets();
+		case UMLPackage.GENERALIZATION__IS_SUBSTITUTABLE:
+			return isSubstitutable();
+		case UMLPackage.GENERALIZATION__SPECIFIC:
+			if (resolve)
+				return getSpecific();
+			return basicGetSpecific();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -393,30 +358,27 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.GENERALIZATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.GENERALIZATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.GENERALIZATION__GENERAL :
-				setGeneral((Classifier) newValue);
-				return;
-			case UMLPackage.GENERALIZATION__GENERALIZATION_SET :
-				getGeneralizationSets().clear();
-				getGeneralizationSets()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.GENERALIZATION__IS_SUBSTITUTABLE :
-				setIsSubstitutable((Boolean) newValue);
-				return;
-			case UMLPackage.GENERALIZATION__SPECIFIC :
-				setSpecific((Classifier) newValue);
-				return;
+		case UMLPackage.GENERALIZATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.GENERALIZATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.GENERALIZATION__GENERAL:
+			setGeneral((Classifier) newValue);
+			return;
+		case UMLPackage.GENERALIZATION__GENERALIZATION_SET:
+			getGeneralizationSets().clear();
+			getGeneralizationSets().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.GENERALIZATION__IS_SUBSTITUTABLE:
+			setIsSubstitutable((Boolean) newValue);
+			return;
+		case UMLPackage.GENERALIZATION__SPECIFIC:
+			setSpecific((Classifier) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -429,24 +391,24 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.GENERALIZATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.GENERALIZATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.GENERALIZATION__GENERAL :
-				setGeneral((Classifier) null);
-				return;
-			case UMLPackage.GENERALIZATION__GENERALIZATION_SET :
-				getGeneralizationSets().clear();
-				return;
-			case UMLPackage.GENERALIZATION__IS_SUBSTITUTABLE :
-				setIsSubstitutable(IS_SUBSTITUTABLE_EDEFAULT);
-				return;
-			case UMLPackage.GENERALIZATION__SPECIFIC :
-				setSpecific((Classifier) null);
-				return;
+		case UMLPackage.GENERALIZATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.GENERALIZATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.GENERALIZATION__GENERAL:
+			setGeneral((Classifier) null);
+			return;
+		case UMLPackage.GENERALIZATION__GENERALIZATION_SET:
+			getGeneralizationSets().clear();
+			return;
+		case UMLPackage.GENERALIZATION__IS_SUBSTITUTABLE:
+			setIsSubstitutable(IS_SUBSTITUTABLE_EDEFAULT);
+			return;
+		case UMLPackage.GENERALIZATION__SPECIFIC:
+			setSpecific((Classifier) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -459,28 +421,28 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.GENERALIZATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.GENERALIZATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.GENERALIZATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.GENERALIZATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.GENERALIZATION__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.GENERALIZATION__SOURCE :
-				return isSetSources();
-			case UMLPackage.GENERALIZATION__TARGET :
-				return isSetTargets();
-			case UMLPackage.GENERALIZATION__GENERAL :
-				return basicGetGeneral() != null;
-			case UMLPackage.GENERALIZATION__GENERALIZATION_SET :
-				return !getGeneralizationSets().isEmpty();
-			case UMLPackage.GENERALIZATION__IS_SUBSTITUTABLE :
-				return isSubstitutable() != IS_SUBSTITUTABLE_EDEFAULT;
-			case UMLPackage.GENERALIZATION__SPECIFIC :
-				return basicGetSpecific() != null;
+		case UMLPackage.GENERALIZATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.GENERALIZATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.GENERALIZATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.GENERALIZATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.GENERALIZATION__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.GENERALIZATION__SOURCE:
+			return isSetSources();
+		case UMLPackage.GENERALIZATION__TARGET:
+			return isSetTargets();
+		case UMLPackage.GENERALIZATION__GENERAL:
+			return basicGetGeneral() != null;
+		case UMLPackage.GENERALIZATION__GENERALIZATION_SET:
+			return !getGeneralizationSets().isEmpty();
+		case UMLPackage.GENERALIZATION__IS_SUBSTITUTABLE:
+			return isSubstitutable() != IS_SUBSTITUTABLE_EDEFAULT;
+		case UMLPackage.GENERALIZATION__SPECIFIC:
+			return basicGetSpecific() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -493,8 +455,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] TARGET_ESUBSETS = new int[]{
-		UMLPackage.GENERALIZATION__GENERAL};
+	protected static final int[] TARGET_ESUBSETS = new int[] { UMLPackage.GENERALIZATION__GENERAL };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -504,7 +465,7 @@
 	@Override
 	public boolean isSetTargets() {
 		return super.isSetTargets()
-			|| eIsSet(UMLPackage.GENERALIZATION__GENERAL);
+				|| eIsSet(UMLPackage.GENERALIZATION__GENERAL);
 	}
 
 	/**
@@ -515,8 +476,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SOURCE_ESUBSETS = new int[]{
-		UMLPackage.GENERALIZATION__SPECIFIC};
+	protected static final int[] SOURCE_ESUBSETS = new int[] { UMLPackage.GENERALIZATION__SPECIFIC };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -526,9 +486,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -539,7 +497,7 @@
 	@Override
 	public boolean isSetSources() {
 		return super.isSetSources()
-			|| eIsSet(UMLPackage.GENERALIZATION__SPECIFIC);
+				|| eIsSet(UMLPackage.GENERALIZATION__SPECIFIC);
 	}
 
 	/**
@@ -564,7 +522,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.GENERALIZATION__SPECIFIC);
+				|| eIsSet(UMLPackage.GENERALIZATION__SPECIFIC);
 	}
 
 } //GeneralizationImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GeneralizationSetImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GeneralizationSetImpl.java
index 3063eaf..bb94328 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GeneralizationSetImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/GeneralizationSetImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,6 +29,9 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Classifier;
@@ -110,9 +114,7 @@
 	 * @generated
 	 */
 	public boolean isCovering() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.GENERALIZATION_SET__IS_COVERING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION_SET__IS_COVERING, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.GENERALIZATION_SET__IS_COVERING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION_SET__IS_COVERING, true, true);
 	}
 
 	/**
@@ -121,9 +123,7 @@
 	 * @generated
 	 */
 	public void setIsCovering(boolean newIsCovering) {
-		eDynamicSet(
-			UMLPackage.GENERALIZATION_SET__IS_COVERING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION_SET__IS_COVERING, newIsCovering);
+		eDynamicSet(UMLPackage.GENERALIZATION_SET__IS_COVERING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION_SET__IS_COVERING, newIsCovering);
 	}
 
 	/**
@@ -132,9 +132,7 @@
 	 * @generated
 	 */
 	public boolean isDisjoint() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.GENERALIZATION_SET__IS_DISJOINT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION_SET__IS_DISJOINT, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.GENERALIZATION_SET__IS_DISJOINT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION_SET__IS_DISJOINT, true, true);
 	}
 
 	/**
@@ -143,9 +141,7 @@
 	 * @generated
 	 */
 	public void setIsDisjoint(boolean newIsDisjoint) {
-		eDynamicSet(
-			UMLPackage.GENERALIZATION_SET__IS_DISJOINT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION_SET__IS_DISJOINT, newIsDisjoint);
+		eDynamicSet(UMLPackage.GENERALIZATION_SET__IS_DISJOINT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION_SET__IS_DISJOINT, newIsDisjoint);
 	}
 
 	/**
@@ -154,9 +150,7 @@
 	 * @generated
 	 */
 	public Classifier getPowertype() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.GENERALIZATION_SET__POWERTYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION_SET__POWERTYPE, true, true);
+		return (Classifier) eDynamicGet(UMLPackage.GENERALIZATION_SET__POWERTYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION_SET__POWERTYPE, true, true);
 	}
 
 	/**
@@ -165,9 +159,7 @@
 	 * @generated
 	 */
 	public Classifier basicGetPowertype() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.GENERALIZATION_SET__POWERTYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION_SET__POWERTYPE, false, true);
+		return (Classifier) eDynamicGet(UMLPackage.GENERALIZATION_SET__POWERTYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION_SET__POWERTYPE, false, true);
 	}
 
 	/**
@@ -177,8 +169,7 @@
 	 */
 	public NotificationChain basicSetPowertype(Classifier newPowertype,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newPowertype,
-			UMLPackage.GENERALIZATION_SET__POWERTYPE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newPowertype, UMLPackage.GENERALIZATION_SET__POWERTYPE, msgs);
 		return msgs;
 	}
 
@@ -188,9 +179,7 @@
 	 * @generated
 	 */
 	public void setPowertype(Classifier newPowertype) {
-		eDynamicSet(
-			UMLPackage.GENERALIZATION_SET__POWERTYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION_SET__POWERTYPE, newPowertype);
+		eDynamicSet(UMLPackage.GENERALIZATION_SET__POWERTYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION_SET__POWERTYPE, newPowertype);
 	}
 
 	/**
@@ -200,10 +189,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Generalization> getGeneralizations() {
-		return (EList<Generalization>) eDynamicGet(
-			UMLPackage.GENERALIZATION_SET__GENERALIZATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.GENERALIZATION_SET__GENERALIZATION, true, true);
+		return (EList<Generalization>) eDynamicGet(UMLPackage.GENERALIZATION_SET__GENERALIZATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.GENERALIZATION_SET__GENERALIZATION, true, true);
 	}
 
 	/**
@@ -212,7 +198,7 @@
 	 * @generated
 	 */
 	public Generalization getGeneralization(Classifier general) {
-		generalizationLoop : for (Generalization generalization : getGeneralizations()) {
+		generalizationLoop: for (Generalization generalization : getGeneralizations()) {
 			if (general != null && !general.equals(generalization.getGeneral()))
 				continue generalizationLoop;
 			return generalization;
@@ -227,8 +213,7 @@
 	 */
 	public boolean validateGeneralizationSameClassifier(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return GeneralizationSetOperations
-			.validateGeneralizationSameClassifier(this, diagnostics, context);
+		return GeneralizationSetOperations.validateGeneralizationSameClassifier(this, diagnostics, context);
 	}
 
 	/**
@@ -238,8 +223,7 @@
 	 */
 	public boolean validateMapsToGeneralizationSet(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return GeneralizationSetOperations.validateMapsToGeneralizationSet(this,
-			diagnostics, context);
+		return GeneralizationSetOperations.validateMapsToGeneralizationSet(this, diagnostics, context);
 	}
 
 	/**
@@ -252,33 +236,24 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.GENERALIZATION_SET__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.GENERALIZATION_SET__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.GENERALIZATION_SET__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.GENERALIZATION_SET__POWERTYPE :
-				Classifier powertype = basicGetPowertype();
-				if (powertype != null)
-					msgs = ((InternalEObject) powertype).eInverseRemove(this,
-						UMLPackage.CLASSIFIER__POWERTYPE_EXTENT,
-						Classifier.class, msgs);
-				return basicSetPowertype((Classifier) otherEnd, msgs);
-			case UMLPackage.GENERALIZATION_SET__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.GENERALIZATION_SET__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.GENERALIZATION_SET__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.GENERALIZATION_SET__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.GENERALIZATION_SET__POWERTYPE:
+			Classifier powertype = basicGetPowertype();
+			if (powertype != null)
+				msgs = ((InternalEObject) powertype).eInverseRemove(this, UMLPackage.CLASSIFIER__POWERTYPE_EXTENT, Classifier.class, msgs);
+			return basicSetPowertype((Classifier) otherEnd, msgs);
+		case UMLPackage.GENERALIZATION_SET__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -292,23 +267,20 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.GENERALIZATION_SET__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.GENERALIZATION_SET__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.GENERALIZATION_SET__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.GENERALIZATION_SET__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.GENERALIZATION_SET__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.GENERALIZATION_SET__POWERTYPE :
-				return basicSetPowertype(null, msgs);
-			case UMLPackage.GENERALIZATION_SET__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.GENERALIZATION_SET__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.GENERALIZATION_SET__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.GENERALIZATION_SET__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.GENERALIZATION_SET__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.GENERALIZATION_SET__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.GENERALIZATION_SET__POWERTYPE:
+			return basicSetPowertype(null, msgs);
+		case UMLPackage.GENERALIZATION_SET__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -321,50 +293,50 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.GENERALIZATION_SET__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.GENERALIZATION_SET__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.GENERALIZATION_SET__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.GENERALIZATION_SET__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.GENERALIZATION_SET__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.GENERALIZATION_SET__NAME :
-				return getName();
-			case UMLPackage.GENERALIZATION_SET__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.GENERALIZATION_SET__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.GENERALIZATION_SET__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.GENERALIZATION_SET__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.GENERALIZATION_SET__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.GENERALIZATION_SET__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.GENERALIZATION_SET__IS_COVERING :
-				return isCovering();
-			case UMLPackage.GENERALIZATION_SET__IS_DISJOINT :
-				return isDisjoint();
-			case UMLPackage.GENERALIZATION_SET__POWERTYPE :
-				if (resolve)
-					return getPowertype();
-				return basicGetPowertype();
-			case UMLPackage.GENERALIZATION_SET__GENERALIZATION :
-				return getGeneralizations();
+		case UMLPackage.GENERALIZATION_SET__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.GENERALIZATION_SET__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.GENERALIZATION_SET__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.GENERALIZATION_SET__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.GENERALIZATION_SET__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.GENERALIZATION_SET__NAME:
+			return getName();
+		case UMLPackage.GENERALIZATION_SET__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.GENERALIZATION_SET__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.GENERALIZATION_SET__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.GENERALIZATION_SET__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.GENERALIZATION_SET__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.GENERALIZATION_SET__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.GENERALIZATION_SET__IS_COVERING:
+			return isCovering();
+		case UMLPackage.GENERALIZATION_SET__IS_DISJOINT:
+			return isDisjoint();
+		case UMLPackage.GENERALIZATION_SET__POWERTYPE:
+			if (resolve)
+				return getPowertype();
+			return basicGetPowertype();
+		case UMLPackage.GENERALIZATION_SET__GENERALIZATION:
+			return getGeneralizations();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -378,45 +350,42 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.GENERALIZATION_SET__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.GENERALIZATION_SET__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.GENERALIZATION_SET__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.GENERALIZATION_SET__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.GENERALIZATION_SET__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.GENERALIZATION_SET__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.GENERALIZATION_SET__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.GENERALIZATION_SET__IS_COVERING :
-				setIsCovering((Boolean) newValue);
-				return;
-			case UMLPackage.GENERALIZATION_SET__IS_DISJOINT :
-				setIsDisjoint((Boolean) newValue);
-				return;
-			case UMLPackage.GENERALIZATION_SET__POWERTYPE :
-				setPowertype((Classifier) newValue);
-				return;
-			case UMLPackage.GENERALIZATION_SET__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
+		case UMLPackage.GENERALIZATION_SET__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.GENERALIZATION_SET__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.GENERALIZATION_SET__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.GENERALIZATION_SET__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.GENERALIZATION_SET__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.GENERALIZATION_SET__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.GENERALIZATION_SET__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.GENERALIZATION_SET__IS_COVERING:
+			setIsCovering((Boolean) newValue);
+			return;
+		case UMLPackage.GENERALIZATION_SET__IS_DISJOINT:
+			setIsDisjoint((Boolean) newValue);
+			return;
+		case UMLPackage.GENERALIZATION_SET__POWERTYPE:
+			setPowertype((Classifier) newValue);
+			return;
+		case UMLPackage.GENERALIZATION_SET__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -429,39 +398,39 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.GENERALIZATION_SET__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.GENERALIZATION_SET__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.GENERALIZATION_SET__NAME :
-				unsetName();
-				return;
-			case UMLPackage.GENERALIZATION_SET__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.GENERALIZATION_SET__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.GENERALIZATION_SET__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.GENERALIZATION_SET__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.GENERALIZATION_SET__IS_COVERING :
-				setIsCovering(IS_COVERING_EDEFAULT);
-				return;
-			case UMLPackage.GENERALIZATION_SET__IS_DISJOINT :
-				setIsDisjoint(IS_DISJOINT_EDEFAULT);
-				return;
-			case UMLPackage.GENERALIZATION_SET__POWERTYPE :
-				setPowertype((Classifier) null);
-				return;
-			case UMLPackage.GENERALIZATION_SET__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
+		case UMLPackage.GENERALIZATION_SET__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.GENERALIZATION_SET__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.GENERALIZATION_SET__NAME:
+			unsetName();
+			return;
+		case UMLPackage.GENERALIZATION_SET__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.GENERALIZATION_SET__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.GENERALIZATION_SET__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.GENERALIZATION_SET__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.GENERALIZATION_SET__IS_COVERING:
+			setIsCovering(IS_COVERING_EDEFAULT);
+			return;
+		case UMLPackage.GENERALIZATION_SET__IS_DISJOINT:
+			setIsDisjoint(IS_DISJOINT_EDEFAULT);
+			return;
+		case UMLPackage.GENERALIZATION_SET__POWERTYPE:
+			setPowertype((Classifier) null);
+			return;
+		case UMLPackage.GENERALIZATION_SET__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -474,40 +443,38 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.GENERALIZATION_SET__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.GENERALIZATION_SET__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.GENERALIZATION_SET__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.GENERALIZATION_SET__OWNER :
-				return isSetOwner();
-			case UMLPackage.GENERALIZATION_SET__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.GENERALIZATION_SET__NAME :
-				return isSetName();
-			case UMLPackage.GENERALIZATION_SET__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.GENERALIZATION_SET__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.GENERALIZATION_SET__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.GENERALIZATION_SET__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.GENERALIZATION_SET__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.GENERALIZATION_SET__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.GENERALIZATION_SET__IS_COVERING :
-				return isCovering() != IS_COVERING_EDEFAULT;
-			case UMLPackage.GENERALIZATION_SET__IS_DISJOINT :
-				return isDisjoint() != IS_DISJOINT_EDEFAULT;
-			case UMLPackage.GENERALIZATION_SET__POWERTYPE :
-				return basicGetPowertype() != null;
-			case UMLPackage.GENERALIZATION_SET__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
+		case UMLPackage.GENERALIZATION_SET__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.GENERALIZATION_SET__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.GENERALIZATION_SET__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.GENERALIZATION_SET__OWNER:
+			return isSetOwner();
+		case UMLPackage.GENERALIZATION_SET__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.GENERALIZATION_SET__NAME:
+			return isSetName();
+		case UMLPackage.GENERALIZATION_SET__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.GENERALIZATION_SET__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.GENERALIZATION_SET__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.GENERALIZATION_SET__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.GENERALIZATION_SET__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.GENERALIZATION_SET__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.GENERALIZATION_SET__IS_COVERING:
+			return isCovering() != IS_COVERING_EDEFAULT;
+		case UMLPackage.GENERALIZATION_SET__IS_DISJOINT:
+			return isDisjoint() != IS_DISJOINT_EDEFAULT;
+		case UMLPackage.GENERALIZATION_SET__POWERTYPE:
+			return basicGetPowertype() != null;
+		case UMLPackage.GENERALIZATION_SET__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -522,142 +489,120 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.GENERALIZATION_SET___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GENERALIZATION_SET___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GENERALIZATION_SET___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.GENERALIZATION_SET___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.GENERALIZATION_SET___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.GENERALIZATION_SET___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.GENERALIZATION_SET___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.GENERALIZATION_SET___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___GET_MODEL :
-				return getModel();
-			case UMLPackage.GENERALIZATION_SET___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.GENERALIZATION_SET___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.GENERALIZATION_SET___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.GENERALIZATION_SET___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.GENERALIZATION_SET___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.GENERALIZATION_SET___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.GENERALIZATION_SET___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.GENERALIZATION_SET___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.GENERALIZATION_SET___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.GENERALIZATION_SET___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.GENERALIZATION_SET___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.GENERALIZATION_SET___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GENERALIZATION_SET___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GENERALIZATION_SET___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GENERALIZATION_SET___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___GET_LABEL :
-				return getLabel();
-			case UMLPackage.GENERALIZATION_SET___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.GENERALIZATION_SET___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.GENERALIZATION_SET___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.GENERALIZATION_SET___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.GENERALIZATION_SET___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.GENERALIZATION_SET___SEPARATOR :
-				return separator();
-			case UMLPackage.GENERALIZATION_SET___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.GENERALIZATION_SET___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.GENERALIZATION_SET___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.GENERALIZATION_SET___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GENERALIZATION_SET___VALIDATE_GENERALIZATION_SAME_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateGeneralizationSameClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.GENERALIZATION_SET___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GENERALIZATION_SET___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GENERALIZATION_SET___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GENERALIZATION_SET___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.GENERALIZATION_SET___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.GENERALIZATION_SET___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.GENERALIZATION_SET___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.GENERALIZATION_SET___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.GENERALIZATION_SET___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___GET_MODEL:
+			return getModel();
+		case UMLPackage.GENERALIZATION_SET___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.GENERALIZATION_SET___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.GENERALIZATION_SET___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.GENERALIZATION_SET___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.GENERALIZATION_SET___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.GENERALIZATION_SET___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.GENERALIZATION_SET___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.GENERALIZATION_SET___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.GENERALIZATION_SET___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.GENERALIZATION_SET___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.GENERALIZATION_SET___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.GENERALIZATION_SET___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GENERALIZATION_SET___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GENERALIZATION_SET___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GENERALIZATION_SET___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___GET_LABEL:
+			return getLabel();
+		case UMLPackage.GENERALIZATION_SET___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.GENERALIZATION_SET___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.GENERALIZATION_SET___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.GENERALIZATION_SET___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.GENERALIZATION_SET___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.GENERALIZATION_SET___SEPARATOR:
+			return separator();
+		case UMLPackage.GENERALIZATION_SET___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.GENERALIZATION_SET___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.GENERALIZATION_SET___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.GENERALIZATION_SET___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GENERALIZATION_SET___VALIDATE_GENERALIZATION_SAME_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateGeneralizationSameClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.GENERALIZATION_SET___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ImageImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ImageImpl.java
index b6e00e9..7143d7b 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ImageImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ImageImpl.java
@@ -1,23 +1,27 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 451350, 485756
- *   Kenn Hussey - 519572
+ *   Kenn Hussey - 519572, 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.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.Image;
 import org.eclipse.uml2.uml.UMLPackage;
@@ -96,9 +100,7 @@
 	 * @generated
 	 */
 	public String getContent() {
-		return (String) eDynamicGet(
-			UMLPackage.IMAGE__CONTENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.IMAGE__CONTENT, true, true);
+		return (String) eDynamicGet(UMLPackage.IMAGE__CONTENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.IMAGE__CONTENT, true, true);
 	}
 
 	/**
@@ -107,8 +109,7 @@
 	 * @generated
 	 */
 	public void setContent(String newContent) {
-		eDynamicSet(UMLPackage.IMAGE__CONTENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.IMAGE__CONTENT, newContent);
+		eDynamicSet(UMLPackage.IMAGE__CONTENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.IMAGE__CONTENT, newContent);
 	}
 
 	/**
@@ -117,8 +118,7 @@
 	 * @generated
 	 */
 	public void unsetContent() {
-		eDynamicUnset(UMLPackage.IMAGE__CONTENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.IMAGE__CONTENT);
+		eDynamicUnset(UMLPackage.IMAGE__CONTENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.IMAGE__CONTENT);
 	}
 
 	/**
@@ -127,8 +127,7 @@
 	 * @generated
 	 */
 	public boolean isSetContent() {
-		return eDynamicIsSet(UMLPackage.IMAGE__CONTENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.IMAGE__CONTENT);
+		return eDynamicIsSet(UMLPackage.IMAGE__CONTENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.IMAGE__CONTENT);
 	}
 
 	/**
@@ -137,9 +136,7 @@
 	 * @generated
 	 */
 	public String getLocation() {
-		return (String) eDynamicGet(
-			UMLPackage.IMAGE__LOCATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.IMAGE__LOCATION, true, true);
+		return (String) eDynamicGet(UMLPackage.IMAGE__LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.IMAGE__LOCATION, true, true);
 	}
 
 	/**
@@ -148,8 +145,7 @@
 	 * @generated
 	 */
 	public void setLocation(String newLocation) {
-		eDynamicSet(UMLPackage.IMAGE__LOCATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.IMAGE__LOCATION, newLocation);
+		eDynamicSet(UMLPackage.IMAGE__LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.IMAGE__LOCATION, newLocation);
 	}
 
 	/**
@@ -158,8 +154,7 @@
 	 * @generated
 	 */
 	public void unsetLocation() {
-		eDynamicUnset(UMLPackage.IMAGE__LOCATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.IMAGE__LOCATION);
+		eDynamicUnset(UMLPackage.IMAGE__LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.IMAGE__LOCATION);
 	}
 
 	/**
@@ -168,8 +163,7 @@
 	 * @generated
 	 */
 	public boolean isSetLocation() {
-		return eDynamicIsSet(UMLPackage.IMAGE__LOCATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.IMAGE__LOCATION);
+		return eDynamicIsSet(UMLPackage.IMAGE__LOCATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.IMAGE__LOCATION);
 	}
 
 	/**
@@ -178,9 +172,7 @@
 	 * @generated
 	 */
 	public String getFormat() {
-		return (String) eDynamicGet(
-			UMLPackage.IMAGE__FORMAT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.IMAGE__FORMAT, true, true);
+		return (String) eDynamicGet(UMLPackage.IMAGE__FORMAT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.IMAGE__FORMAT, true, true);
 	}
 
 	/**
@@ -189,8 +181,7 @@
 	 * @generated
 	 */
 	public void setFormat(String newFormat) {
-		eDynamicSet(UMLPackage.IMAGE__FORMAT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.IMAGE__FORMAT, newFormat);
+		eDynamicSet(UMLPackage.IMAGE__FORMAT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.IMAGE__FORMAT, newFormat);
 	}
 
 	/**
@@ -199,8 +190,7 @@
 	 * @generated
 	 */
 	public void unsetFormat() {
-		eDynamicUnset(UMLPackage.IMAGE__FORMAT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.IMAGE__FORMAT);
+		eDynamicUnset(UMLPackage.IMAGE__FORMAT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.IMAGE__FORMAT);
 	}
 
 	/**
@@ -209,8 +199,7 @@
 	 * @generated
 	 */
 	public boolean isSetFormat() {
-		return eDynamicIsSet(UMLPackage.IMAGE__FORMAT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.IMAGE__FORMAT);
+		return eDynamicIsSet(UMLPackage.IMAGE__FORMAT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.IMAGE__FORMAT);
 	}
 
 	/**
@@ -221,22 +210,22 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.IMAGE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.IMAGE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.IMAGE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.IMAGE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.IMAGE__CONTENT :
-				return getContent();
-			case UMLPackage.IMAGE__FORMAT :
-				return getFormat();
-			case UMLPackage.IMAGE__LOCATION :
-				return getLocation();
+		case UMLPackage.IMAGE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.IMAGE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.IMAGE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.IMAGE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.IMAGE__CONTENT:
+			return getContent();
+		case UMLPackage.IMAGE__FORMAT:
+			return getFormat();
+		case UMLPackage.IMAGE__LOCATION:
+			return getLocation();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -250,25 +239,23 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.IMAGE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.IMAGE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.IMAGE__CONTENT :
-				setContent((String) newValue);
-				return;
-			case UMLPackage.IMAGE__FORMAT :
-				setFormat((String) newValue);
-				return;
-			case UMLPackage.IMAGE__LOCATION :
-				setLocation((String) newValue);
-				return;
+		case UMLPackage.IMAGE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.IMAGE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.IMAGE__CONTENT:
+			setContent((String) newValue);
+			return;
+		case UMLPackage.IMAGE__FORMAT:
+			setFormat((String) newValue);
+			return;
+		case UMLPackage.IMAGE__LOCATION:
+			setLocation((String) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -281,21 +268,21 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.IMAGE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.IMAGE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.IMAGE__CONTENT :
-				unsetContent();
-				return;
-			case UMLPackage.IMAGE__FORMAT :
-				unsetFormat();
-				return;
-			case UMLPackage.IMAGE__LOCATION :
-				unsetLocation();
-				return;
+		case UMLPackage.IMAGE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.IMAGE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.IMAGE__CONTENT:
+			unsetContent();
+			return;
+		case UMLPackage.IMAGE__FORMAT:
+			unsetFormat();
+			return;
+		case UMLPackage.IMAGE__LOCATION:
+			unsetLocation();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -308,20 +295,20 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.IMAGE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.IMAGE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.IMAGE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.IMAGE__OWNER :
-				return isSetOwner();
-			case UMLPackage.IMAGE__CONTENT :
-				return isSetContent();
-			case UMLPackage.IMAGE__FORMAT :
-				return isSetFormat();
-			case UMLPackage.IMAGE__LOCATION :
-				return isSetLocation();
+		case UMLPackage.IMAGE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.IMAGE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.IMAGE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.IMAGE__OWNER:
+			return isSetOwner();
+		case UMLPackage.IMAGE__CONTENT:
+			return isSetContent();
+		case UMLPackage.IMAGE__FORMAT:
+			return isSetFormat();
+		case UMLPackage.IMAGE__LOCATION:
+			return isSetLocation();
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/IncludeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/IncludeImpl.java
index 1e8edab..a127c38 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/IncludeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/IncludeImpl.java
@@ -1,18 +1,20 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -21,8 +23,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -90,21 +95,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> relatedElements = (EList<Element>) cache.get(
-				eResource, this,
-				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
+			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<Element>(
-						Element.class, this,
-						UMLPackage.INCLUDE__RELATED_ELEMENT,
-						RELATED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT, relatedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INCLUDE__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.INCLUDE__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INCLUDE__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -117,19 +114,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> sources = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			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>(
-						Element.class, this, UMLPackage.INCLUDE__SOURCE,
-						SOURCE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE, sources = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INCLUDE__SOURCE, SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.INCLUDE__SOURCE, SOURCE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INCLUDE__SOURCE, SOURCE_ESUBSETS);
 	}
 
 	/**
@@ -142,19 +133,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> targets = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			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>(
-						Element.class, this, UMLPackage.INCLUDE__TARGET,
-						TARGET_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET, targets = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INCLUDE__TARGET, TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.INCLUDE__TARGET, TARGET_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INCLUDE__TARGET, TARGET_ESUBSETS);
 	}
 
 	/**
@@ -163,9 +148,7 @@
 	 * @generated
 	 */
 	public UseCase getAddition() {
-		return (UseCase) eDynamicGet(
-			UMLPackage.INCLUDE__ADDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INCLUDE__ADDITION, true, true);
+		return (UseCase) eDynamicGet(UMLPackage.INCLUDE__ADDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INCLUDE__ADDITION, true, true);
 	}
 
 	/**
@@ -174,9 +157,7 @@
 	 * @generated
 	 */
 	public UseCase basicGetAddition() {
-		return (UseCase) eDynamicGet(
-			UMLPackage.INCLUDE__ADDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INCLUDE__ADDITION, false, true);
+		return (UseCase) eDynamicGet(UMLPackage.INCLUDE__ADDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INCLUDE__ADDITION, false, true);
 	}
 
 	/**
@@ -185,8 +166,7 @@
 	 * @generated
 	 */
 	public void setAddition(UseCase newAddition) {
-		eDynamicSet(UMLPackage.INCLUDE__ADDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INCLUDE__ADDITION, newAddition);
+		eDynamicSet(UMLPackage.INCLUDE__ADDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INCLUDE__ADDITION, newAddition);
 	}
 
 	/**
@@ -195,9 +175,7 @@
 	 * @generated
 	 */
 	public UseCase getIncludingCase() {
-		return (UseCase) eDynamicGet(
-			UMLPackage.INCLUDE__INCLUDING_CASE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INCLUDE__INCLUDING_CASE, true, true);
+		return (UseCase) eDynamicGet(UMLPackage.INCLUDE__INCLUDING_CASE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INCLUDE__INCLUDING_CASE, true, true);
 	}
 
 	/**
@@ -206,9 +184,7 @@
 	 * @generated
 	 */
 	public UseCase basicGetIncludingCase() {
-		return (UseCase) eDynamicGet(
-			UMLPackage.INCLUDE__INCLUDING_CASE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INCLUDE__INCLUDING_CASE, false, true);
+		return (UseCase) eDynamicGet(UMLPackage.INCLUDE__INCLUDING_CASE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INCLUDE__INCLUDING_CASE, false, true);
 	}
 
 	/**
@@ -218,8 +194,7 @@
 	 */
 	public NotificationChain basicSetIncludingCase(UseCase newIncludingCase,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newIncludingCase,
-			UMLPackage.INCLUDE__INCLUDING_CASE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newIncludingCase, UMLPackage.INCLUDE__INCLUDING_CASE, msgs);
 		return msgs;
 	}
 
@@ -229,8 +204,7 @@
 	 * @generated
 	 */
 	public void setIncludingCase(UseCase newIncludingCase) {
-		eDynamicSet(UMLPackage.INCLUDE__INCLUDING_CASE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INCLUDE__INCLUDING_CASE, newIncludingCase);
+		eDynamicSet(UMLPackage.INCLUDE__INCLUDING_CASE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INCLUDE__INCLUDING_CASE, newIncludingCase);
 	}
 
 	/**
@@ -243,13 +217,12 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INCLUDE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INCLUDE__INCLUDING_CASE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetIncludingCase((UseCase) otherEnd, msgs);
+		case UMLPackage.INCLUDE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INCLUDE__INCLUDING_CASE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetIncludingCase((UseCase) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -263,16 +236,14 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INCLUDE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INCLUDE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INCLUDE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.INCLUDE__INCLUDING_CASE :
-				return basicSetIncludingCase(null, msgs);
+		case UMLPackage.INCLUDE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INCLUDE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INCLUDE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.INCLUDE__INCLUDING_CASE:
+			return basicSetIncludingCase(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -286,9 +257,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.INCLUDE__INCLUDING_CASE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.USE_CASE__INCLUDE, UseCase.class, msgs);
+		case UMLPackage.INCLUDE__INCLUDING_CASE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.USE_CASE__INCLUDE, UseCase.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -301,46 +271,46 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INCLUDE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INCLUDE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INCLUDE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INCLUDE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INCLUDE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INCLUDE__NAME :
-				return getName();
-			case UMLPackage.INCLUDE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INCLUDE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INCLUDE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INCLUDE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INCLUDE__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.INCLUDE__SOURCE :
-				return getSources();
-			case UMLPackage.INCLUDE__TARGET :
-				return getTargets();
-			case UMLPackage.INCLUDE__ADDITION :
-				if (resolve)
-					return getAddition();
-				return basicGetAddition();
-			case UMLPackage.INCLUDE__INCLUDING_CASE :
-				if (resolve)
-					return getIncludingCase();
-				return basicGetIncludingCase();
+		case UMLPackage.INCLUDE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INCLUDE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INCLUDE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INCLUDE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INCLUDE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INCLUDE__NAME:
+			return getName();
+		case UMLPackage.INCLUDE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INCLUDE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INCLUDE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INCLUDE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INCLUDE__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.INCLUDE__SOURCE:
+			return getSources();
+		case UMLPackage.INCLUDE__TARGET:
+			return getTargets();
+		case UMLPackage.INCLUDE__ADDITION:
+			if (resolve)
+				return getAddition();
+			return basicGetAddition();
+		case UMLPackage.INCLUDE__INCLUDING_CASE:
+			if (resolve)
+				return getIncludingCase();
+			return basicGetIncludingCase();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -354,31 +324,29 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INCLUDE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INCLUDE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INCLUDE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INCLUDE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INCLUDE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INCLUDE__ADDITION :
-				setAddition((UseCase) newValue);
-				return;
-			case UMLPackage.INCLUDE__INCLUDING_CASE :
-				setIncludingCase((UseCase) newValue);
-				return;
+		case UMLPackage.INCLUDE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INCLUDE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INCLUDE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INCLUDE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INCLUDE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INCLUDE__ADDITION:
+			setAddition((UseCase) newValue);
+			return;
+		case UMLPackage.INCLUDE__INCLUDING_CASE:
+			setIncludingCase((UseCase) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -391,27 +359,27 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INCLUDE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INCLUDE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INCLUDE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INCLUDE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INCLUDE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INCLUDE__ADDITION :
-				setAddition((UseCase) null);
-				return;
-			case UMLPackage.INCLUDE__INCLUDING_CASE :
-				setIncludingCase((UseCase) null);
-				return;
+		case UMLPackage.INCLUDE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INCLUDE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INCLUDE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INCLUDE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INCLUDE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INCLUDE__ADDITION:
+			setAddition((UseCase) null);
+			return;
+		case UMLPackage.INCLUDE__INCLUDING_CASE:
+			setIncludingCase((UseCase) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -424,38 +392,36 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INCLUDE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INCLUDE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INCLUDE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INCLUDE__OWNER :
-				return isSetOwner();
-			case UMLPackage.INCLUDE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INCLUDE__NAME :
-				return isSetName();
-			case UMLPackage.INCLUDE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INCLUDE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INCLUDE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INCLUDE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INCLUDE__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.INCLUDE__SOURCE :
-				return isSetSources();
-			case UMLPackage.INCLUDE__TARGET :
-				return isSetTargets();
-			case UMLPackage.INCLUDE__ADDITION :
-				return basicGetAddition() != null;
-			case UMLPackage.INCLUDE__INCLUDING_CASE :
-				return basicGetIncludingCase() != null;
+		case UMLPackage.INCLUDE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INCLUDE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INCLUDE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INCLUDE__OWNER:
+			return isSetOwner();
+		case UMLPackage.INCLUDE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INCLUDE__NAME:
+			return isSetName();
+		case UMLPackage.INCLUDE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INCLUDE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INCLUDE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INCLUDE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INCLUDE__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.INCLUDE__SOURCE:
+			return isSetSources();
+		case UMLPackage.INCLUDE__TARGET:
+			return isSetTargets();
+		case UMLPackage.INCLUDE__ADDITION:
+			return basicGetAddition() != null;
+		case UMLPackage.INCLUDE__INCLUDING_CASE:
+			return basicGetIncludingCase() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -470,20 +436,20 @@
 			Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.INCLUDE__RELATED_ELEMENT :
-					return UMLPackage.RELATIONSHIP__RELATED_ELEMENT;
-				default :
-					return -1;
+			case UMLPackage.INCLUDE__RELATED_ELEMENT:
+				return UMLPackage.RELATIONSHIP__RELATED_ELEMENT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == DirectedRelationship.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.INCLUDE__SOURCE :
-					return UMLPackage.DIRECTED_RELATIONSHIP__SOURCE;
-				case UMLPackage.INCLUDE__TARGET :
-					return UMLPackage.DIRECTED_RELATIONSHIP__TARGET;
-				default :
-					return -1;
+			case UMLPackage.INCLUDE__SOURCE:
+				return UMLPackage.DIRECTED_RELATIONSHIP__SOURCE;
+			case UMLPackage.INCLUDE__TARGET:
+				return UMLPackage.DIRECTED_RELATIONSHIP__TARGET;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -499,20 +465,20 @@
 			Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.RELATIONSHIP__RELATED_ELEMENT :
-					return UMLPackage.INCLUDE__RELATED_ELEMENT;
-				default :
-					return -1;
+			case UMLPackage.RELATIONSHIP__RELATED_ELEMENT:
+				return UMLPackage.INCLUDE__RELATED_ELEMENT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == DirectedRelationship.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.DIRECTED_RELATIONSHIP__SOURCE :
-					return UMLPackage.INCLUDE__SOURCE;
-				case UMLPackage.DIRECTED_RELATIONSHIP__TARGET :
-					return UMLPackage.INCLUDE__TARGET;
-				default :
-					return -1;
+			case UMLPackage.DIRECTED_RELATIONSHIP__SOURCE:
+				return UMLPackage.INCLUDE__SOURCE;
+			case UMLPackage.DIRECTED_RELATIONSHIP__TARGET:
+				return UMLPackage.INCLUDE__TARGET;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -526,8 +492,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] RELATED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.INCLUDE__SOURCE, UMLPackage.INCLUDE__TARGET};
+	protected static final int[] RELATED_ELEMENT_ESUBSETS = new int[] { UMLPackage.INCLUDE__SOURCE, UMLPackage.INCLUDE__TARGET };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -535,7 +500,8 @@
 	 * @generated
 	 */
 	public boolean isSetRelatedElements() {
-		return isSetSources() || isSetTargets();
+		return isSetSources()
+				|| isSetTargets();
 	}
 
 	/**
@@ -546,8 +512,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SOURCE_ESUBSETS = new int[]{
-		UMLPackage.INCLUDE__INCLUDING_CASE};
+	protected static final int[] SOURCE_ESUBSETS = new int[] { UMLPackage.INCLUDE__INCLUDING_CASE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -566,8 +531,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] TARGET_ESUBSETS = new int[]{
-		UMLPackage.INCLUDE__ADDITION};
+	protected static final int[] TARGET_ESUBSETS = new int[] { UMLPackage.INCLUDE__ADDITION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -577,9 +541,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -613,7 +575,7 @@
 	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
-			|| eIsSet(UMLPackage.INCLUDE__INCLUDING_CASE);
+				|| eIsSet(UMLPackage.INCLUDE__INCLUDING_CASE);
 	}
 
 } //IncludeImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InformationFlowImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InformationFlowImpl.java
index a33cb35..e31a9b3 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InformationFlowImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InformationFlowImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -25,6 +25,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 
@@ -103,22 +105,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> relatedElements = (EList<Element>) cache.get(
-				eResource, this,
-				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
+			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<Element>(
-						Element.class, this,
-						UMLPackage.INFORMATION_FLOW__RELATED_ELEMENT,
-						RELATED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT, relatedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INFORMATION_FLOW__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.INFORMATION_FLOW__RELATED_ELEMENT,
-			RELATED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INFORMATION_FLOW__RELATED_ELEMENT, RELATED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -131,19 +124,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> sources = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			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>(
-						Element.class, this,
-						UMLPackage.INFORMATION_FLOW__SOURCE, SOURCE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE, sources = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INFORMATION_FLOW__SOURCE, SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.INFORMATION_FLOW__SOURCE, SOURCE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INFORMATION_FLOW__SOURCE, SOURCE_ESUBSETS);
 	}
 
 	/**
@@ -156,19 +143,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> targets = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			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>(
-						Element.class, this,
-						UMLPackage.INFORMATION_FLOW__TARGET, TARGET_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET, targets = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INFORMATION_FLOW__TARGET, TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.INFORMATION_FLOW__TARGET, TARGET_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INFORMATION_FLOW__TARGET, TARGET_ESUBSETS);
 	}
 
 	/**
@@ -178,9 +159,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Relationship> getRealizations() {
-		return (EList<Relationship>) eDynamicGet(
-			UMLPackage.INFORMATION_FLOW__REALIZATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INFORMATION_FLOW__REALIZATION, true, true);
+		return (EList<Relationship>) eDynamicGet(UMLPackage.INFORMATION_FLOW__REALIZATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INFORMATION_FLOW__REALIZATION, true, true);
 	}
 
 	/**
@@ -190,9 +169,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Classifier> getConveyeds() {
-		return (EList<Classifier>) eDynamicGet(
-			UMLPackage.INFORMATION_FLOW__CONVEYED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INFORMATION_FLOW__CONVEYED, true, true);
+		return (EList<Classifier>) eDynamicGet(UMLPackage.INFORMATION_FLOW__CONVEYED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INFORMATION_FLOW__CONVEYED, true, true);
 	}
 
 	/**
@@ -211,12 +188,10 @@
 	 */
 	public Classifier getConveyed(String name, boolean ignoreCase,
 			EClass eClass) {
-		conveyedLoop : for (Classifier conveyed : getConveyeds()) {
+		conveyedLoop: for (Classifier conveyed : getConveyeds()) {
 			if (eClass != null && !eClass.isInstance(conveyed))
 				continue conveyedLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(conveyed.getName())
-				: name.equals(conveyed.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(conveyed.getName()) : name.equals(conveyed.getName())))
 				continue conveyedLoop;
 			return conveyed;
 		}
@@ -230,11 +205,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<NamedElement> getInformationSources() {
-		return (EList<NamedElement>) eDynamicGet(
-			UMLPackage.INFORMATION_FLOW__INFORMATION_SOURCE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INFORMATION_FLOW__INFORMATION_SOURCE, true,
-			true);
+		return (EList<NamedElement>) eDynamicGet(UMLPackage.INFORMATION_FLOW__INFORMATION_SOURCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INFORMATION_FLOW__INFORMATION_SOURCE, true, true);
 	}
 
 	/**
@@ -253,12 +224,10 @@
 	 */
 	public NamedElement getInformationSource(String name, boolean ignoreCase,
 			EClass eClass) {
-		informationSourceLoop : for (NamedElement informationSource : getInformationSources()) {
+		informationSourceLoop: for (NamedElement informationSource : getInformationSources()) {
 			if (eClass != null && !eClass.isInstance(informationSource))
 				continue informationSourceLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(informationSource.getName())
-				: name.equals(informationSource.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(informationSource.getName()) : name.equals(informationSource.getName())))
 				continue informationSourceLoop;
 			return informationSource;
 		}
@@ -272,11 +241,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<NamedElement> getInformationTargets() {
-		return (EList<NamedElement>) eDynamicGet(
-			UMLPackage.INFORMATION_FLOW__INFORMATION_TARGET
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INFORMATION_FLOW__INFORMATION_TARGET, true,
-			true);
+		return (EList<NamedElement>) eDynamicGet(UMLPackage.INFORMATION_FLOW__INFORMATION_TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INFORMATION_FLOW__INFORMATION_TARGET, true, true);
 	}
 
 	/**
@@ -295,12 +260,10 @@
 	 */
 	public NamedElement getInformationTarget(String name, boolean ignoreCase,
 			EClass eClass) {
-		informationTargetLoop : for (NamedElement informationTarget : getInformationTargets()) {
+		informationTargetLoop: for (NamedElement informationTarget : getInformationTargets()) {
 			if (eClass != null && !eClass.isInstance(informationTarget))
 				continue informationTargetLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(informationTarget.getName())
-				: name.equals(informationTarget.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(informationTarget.getName()) : name.equals(informationTarget.getName())))
 				continue informationTargetLoop;
 			return informationTarget;
 		}
@@ -314,11 +277,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityEdge> getRealizingActivityEdges() {
-		return (EList<ActivityEdge>) eDynamicGet(
-			UMLPackage.INFORMATION_FLOW__REALIZING_ACTIVITY_EDGE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INFORMATION_FLOW__REALIZING_ACTIVITY_EDGE, true,
-			true);
+		return (EList<ActivityEdge>) eDynamicGet(UMLPackage.INFORMATION_FLOW__REALIZING_ACTIVITY_EDGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INFORMATION_FLOW__REALIZING_ACTIVITY_EDGE, true, true);
 	}
 
 	/**
@@ -337,12 +296,10 @@
 	 */
 	public ActivityEdge getRealizingActivityEdge(String name,
 			boolean ignoreCase, EClass eClass) {
-		realizingActivityEdgeLoop : for (ActivityEdge realizingActivityEdge : getRealizingActivityEdges()) {
+		realizingActivityEdgeLoop: for (ActivityEdge realizingActivityEdge : getRealizingActivityEdges()) {
 			if (eClass != null && !eClass.isInstance(realizingActivityEdge))
 				continue realizingActivityEdgeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(realizingActivityEdge.getName())
-				: name.equals(realizingActivityEdge.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(realizingActivityEdge.getName()) : name.equals(realizingActivityEdge.getName())))
 				continue realizingActivityEdgeLoop;
 			return realizingActivityEdge;
 		}
@@ -356,11 +313,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Connector> getRealizingConnectors() {
-		return (EList<Connector>) eDynamicGet(
-			UMLPackage.INFORMATION_FLOW__REALIZING_CONNECTOR
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INFORMATION_FLOW__REALIZING_CONNECTOR, true,
-			true);
+		return (EList<Connector>) eDynamicGet(UMLPackage.INFORMATION_FLOW__REALIZING_CONNECTOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INFORMATION_FLOW__REALIZING_CONNECTOR, true, true);
 	}
 
 	/**
@@ -378,10 +331,8 @@
 	 * @generated
 	 */
 	public Connector getRealizingConnector(String name, boolean ignoreCase) {
-		realizingConnectorLoop : for (Connector realizingConnector : getRealizingConnectors()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(realizingConnector.getName())
-				: name.equals(realizingConnector.getName())))
+		realizingConnectorLoop: for (Connector realizingConnector : getRealizingConnectors()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(realizingConnector.getName()) : name.equals(realizingConnector.getName())))
 				continue realizingConnectorLoop;
 			return realizingConnector;
 		}
@@ -395,11 +346,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Message> getRealizingMessages() {
-		return (EList<Message>) eDynamicGet(
-			UMLPackage.INFORMATION_FLOW__REALIZING_MESSAGE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INFORMATION_FLOW__REALIZING_MESSAGE, true,
-			true);
+		return (EList<Message>) eDynamicGet(UMLPackage.INFORMATION_FLOW__REALIZING_MESSAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INFORMATION_FLOW__REALIZING_MESSAGE, true, true);
 	}
 
 	/**
@@ -417,10 +364,8 @@
 	 * @generated
 	 */
 	public Message getRealizingMessage(String name, boolean ignoreCase) {
-		realizingMessageLoop : for (Message realizingMessage : getRealizingMessages()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(realizingMessage.getName())
-				: name.equals(realizingMessage.getName())))
+		realizingMessageLoop: for (Message realizingMessage : getRealizingMessages()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(realizingMessage.getName()) : name.equals(realizingMessage.getName())))
 				continue realizingMessageLoop;
 			return realizingMessage;
 		}
@@ -434,8 +379,7 @@
 	 */
 	public boolean validateSourcesAndTargetsKind(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InformationFlowOperations.validateSourcesAndTargetsKind(this,
-			diagnostics, context);
+		return InformationFlowOperations.validateSourcesAndTargetsKind(this, diagnostics, context);
 	}
 
 	/**
@@ -445,8 +389,7 @@
 	 */
 	public boolean validateMustConform(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InformationFlowOperations.validateMustConform(this, diagnostics,
-			context);
+		return InformationFlowOperations.validateMustConform(this, diagnostics, context);
 	}
 
 	/**
@@ -456,8 +399,7 @@
 	 */
 	public boolean validateConveyClassifiers(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InformationFlowOperations.validateConveyClassifiers(this,
-			diagnostics, context);
+		return InformationFlowOperations.validateConveyClassifiers(this, diagnostics, context);
 	}
 
 	/**
@@ -468,60 +410,60 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INFORMATION_FLOW__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INFORMATION_FLOW__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INFORMATION_FLOW__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INFORMATION_FLOW__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INFORMATION_FLOW__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INFORMATION_FLOW__NAME :
-				return getName();
-			case UMLPackage.INFORMATION_FLOW__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INFORMATION_FLOW__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INFORMATION_FLOW__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INFORMATION_FLOW__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INFORMATION_FLOW__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.INFORMATION_FLOW__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.INFORMATION_FLOW__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.INFORMATION_FLOW__SOURCE :
-				return getSources();
-			case UMLPackage.INFORMATION_FLOW__TARGET :
-				return getTargets();
-			case UMLPackage.INFORMATION_FLOW__CONVEYED :
-				return getConveyeds();
-			case UMLPackage.INFORMATION_FLOW__INFORMATION_SOURCE :
-				return getInformationSources();
-			case UMLPackage.INFORMATION_FLOW__INFORMATION_TARGET :
-				return getInformationTargets();
-			case UMLPackage.INFORMATION_FLOW__REALIZATION :
-				return getRealizations();
-			case UMLPackage.INFORMATION_FLOW__REALIZING_ACTIVITY_EDGE :
-				return getRealizingActivityEdges();
-			case UMLPackage.INFORMATION_FLOW__REALIZING_CONNECTOR :
-				return getRealizingConnectors();
-			case UMLPackage.INFORMATION_FLOW__REALIZING_MESSAGE :
-				return getRealizingMessages();
+		case UMLPackage.INFORMATION_FLOW__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INFORMATION_FLOW__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INFORMATION_FLOW__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INFORMATION_FLOW__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INFORMATION_FLOW__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INFORMATION_FLOW__NAME:
+			return getName();
+		case UMLPackage.INFORMATION_FLOW__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INFORMATION_FLOW__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INFORMATION_FLOW__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INFORMATION_FLOW__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INFORMATION_FLOW__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.INFORMATION_FLOW__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.INFORMATION_FLOW__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.INFORMATION_FLOW__SOURCE:
+			return getSources();
+		case UMLPackage.INFORMATION_FLOW__TARGET:
+			return getTargets();
+		case UMLPackage.INFORMATION_FLOW__CONVEYED:
+			return getConveyeds();
+		case UMLPackage.INFORMATION_FLOW__INFORMATION_SOURCE:
+			return getInformationSources();
+		case UMLPackage.INFORMATION_FLOW__INFORMATION_TARGET:
+			return getInformationTargets();
+		case UMLPackage.INFORMATION_FLOW__REALIZATION:
+			return getRealizations();
+		case UMLPackage.INFORMATION_FLOW__REALIZING_ACTIVITY_EDGE:
+			return getRealizingActivityEdges();
+		case UMLPackage.INFORMATION_FLOW__REALIZING_CONNECTOR:
+			return getRealizingConnectors();
+		case UMLPackage.INFORMATION_FLOW__REALIZING_MESSAGE:
+			return getRealizingMessages();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -535,66 +477,57 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INFORMATION_FLOW__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INFORMATION_FLOW__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INFORMATION_FLOW__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INFORMATION_FLOW__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INFORMATION_FLOW__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INFORMATION_FLOW__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INFORMATION_FLOW__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INFORMATION_FLOW__CONVEYED :
-				getConveyeds().clear();
-				getConveyeds()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.INFORMATION_FLOW__INFORMATION_SOURCE :
-				getInformationSources().clear();
-				getInformationSources()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.INFORMATION_FLOW__INFORMATION_TARGET :
-				getInformationTargets().clear();
-				getInformationTargets()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.INFORMATION_FLOW__REALIZATION :
-				getRealizations().clear();
-				getRealizations()
-					.addAll((Collection<? extends Relationship>) newValue);
-				return;
-			case UMLPackage.INFORMATION_FLOW__REALIZING_ACTIVITY_EDGE :
-				getRealizingActivityEdges().clear();
-				getRealizingActivityEdges()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.INFORMATION_FLOW__REALIZING_CONNECTOR :
-				getRealizingConnectors().clear();
-				getRealizingConnectors()
-					.addAll((Collection<? extends Connector>) newValue);
-				return;
-			case UMLPackage.INFORMATION_FLOW__REALIZING_MESSAGE :
-				getRealizingMessages().clear();
-				getRealizingMessages()
-					.addAll((Collection<? extends Message>) newValue);
-				return;
+		case UMLPackage.INFORMATION_FLOW__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INFORMATION_FLOW__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INFORMATION_FLOW__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INFORMATION_FLOW__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INFORMATION_FLOW__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INFORMATION_FLOW__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INFORMATION_FLOW__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INFORMATION_FLOW__CONVEYED:
+			getConveyeds().clear();
+			getConveyeds().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.INFORMATION_FLOW__INFORMATION_SOURCE:
+			getInformationSources().clear();
+			getInformationSources().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.INFORMATION_FLOW__INFORMATION_TARGET:
+			getInformationTargets().clear();
+			getInformationTargets().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.INFORMATION_FLOW__REALIZATION:
+			getRealizations().clear();
+			getRealizations().addAll((Collection<? extends Relationship>) newValue);
+			return;
+		case UMLPackage.INFORMATION_FLOW__REALIZING_ACTIVITY_EDGE:
+			getRealizingActivityEdges().clear();
+			getRealizingActivityEdges().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.INFORMATION_FLOW__REALIZING_CONNECTOR:
+			getRealizingConnectors().clear();
+			getRealizingConnectors().addAll((Collection<? extends Connector>) newValue);
+			return;
+		case UMLPackage.INFORMATION_FLOW__REALIZING_MESSAGE:
+			getRealizingMessages().clear();
+			getRealizingMessages().addAll((Collection<? extends Message>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -607,48 +540,48 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INFORMATION_FLOW__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INFORMATION_FLOW__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INFORMATION_FLOW__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INFORMATION_FLOW__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INFORMATION_FLOW__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INFORMATION_FLOW__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INFORMATION_FLOW__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INFORMATION_FLOW__CONVEYED :
-				getConveyeds().clear();
-				return;
-			case UMLPackage.INFORMATION_FLOW__INFORMATION_SOURCE :
-				getInformationSources().clear();
-				return;
-			case UMLPackage.INFORMATION_FLOW__INFORMATION_TARGET :
-				getInformationTargets().clear();
-				return;
-			case UMLPackage.INFORMATION_FLOW__REALIZATION :
-				getRealizations().clear();
-				return;
-			case UMLPackage.INFORMATION_FLOW__REALIZING_ACTIVITY_EDGE :
-				getRealizingActivityEdges().clear();
-				return;
-			case UMLPackage.INFORMATION_FLOW__REALIZING_CONNECTOR :
-				getRealizingConnectors().clear();
-				return;
-			case UMLPackage.INFORMATION_FLOW__REALIZING_MESSAGE :
-				getRealizingMessages().clear();
-				return;
+		case UMLPackage.INFORMATION_FLOW__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INFORMATION_FLOW__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INFORMATION_FLOW__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INFORMATION_FLOW__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INFORMATION_FLOW__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INFORMATION_FLOW__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INFORMATION_FLOW__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INFORMATION_FLOW__CONVEYED:
+			getConveyeds().clear();
+			return;
+		case UMLPackage.INFORMATION_FLOW__INFORMATION_SOURCE:
+			getInformationSources().clear();
+			return;
+		case UMLPackage.INFORMATION_FLOW__INFORMATION_TARGET:
+			getInformationTargets().clear();
+			return;
+		case UMLPackage.INFORMATION_FLOW__REALIZATION:
+			getRealizations().clear();
+			return;
+		case UMLPackage.INFORMATION_FLOW__REALIZING_ACTIVITY_EDGE:
+			getRealizingActivityEdges().clear();
+			return;
+		case UMLPackage.INFORMATION_FLOW__REALIZING_CONNECTOR:
+			getRealizingConnectors().clear();
+			return;
+		case UMLPackage.INFORMATION_FLOW__REALIZING_MESSAGE:
+			getRealizingMessages().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -661,52 +594,50 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INFORMATION_FLOW__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INFORMATION_FLOW__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INFORMATION_FLOW__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INFORMATION_FLOW__OWNER :
-				return isSetOwner();
-			case UMLPackage.INFORMATION_FLOW__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INFORMATION_FLOW__NAME :
-				return isSetName();
-			case UMLPackage.INFORMATION_FLOW__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INFORMATION_FLOW__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INFORMATION_FLOW__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INFORMATION_FLOW__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INFORMATION_FLOW__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.INFORMATION_FLOW__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.INFORMATION_FLOW__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.INFORMATION_FLOW__SOURCE :
-				return isSetSources();
-			case UMLPackage.INFORMATION_FLOW__TARGET :
-				return isSetTargets();
-			case UMLPackage.INFORMATION_FLOW__CONVEYED :
-				return !getConveyeds().isEmpty();
-			case UMLPackage.INFORMATION_FLOW__INFORMATION_SOURCE :
-				return !getInformationSources().isEmpty();
-			case UMLPackage.INFORMATION_FLOW__INFORMATION_TARGET :
-				return !getInformationTargets().isEmpty();
-			case UMLPackage.INFORMATION_FLOW__REALIZATION :
-				return !getRealizations().isEmpty();
-			case UMLPackage.INFORMATION_FLOW__REALIZING_ACTIVITY_EDGE :
-				return !getRealizingActivityEdges().isEmpty();
-			case UMLPackage.INFORMATION_FLOW__REALIZING_CONNECTOR :
-				return !getRealizingConnectors().isEmpty();
-			case UMLPackage.INFORMATION_FLOW__REALIZING_MESSAGE :
-				return !getRealizingMessages().isEmpty();
+		case UMLPackage.INFORMATION_FLOW__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INFORMATION_FLOW__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INFORMATION_FLOW__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INFORMATION_FLOW__OWNER:
+			return isSetOwner();
+		case UMLPackage.INFORMATION_FLOW__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INFORMATION_FLOW__NAME:
+			return isSetName();
+		case UMLPackage.INFORMATION_FLOW__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INFORMATION_FLOW__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INFORMATION_FLOW__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INFORMATION_FLOW__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INFORMATION_FLOW__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.INFORMATION_FLOW__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.INFORMATION_FLOW__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.INFORMATION_FLOW__SOURCE:
+			return isSetSources();
+		case UMLPackage.INFORMATION_FLOW__TARGET:
+			return isSetTargets();
+		case UMLPackage.INFORMATION_FLOW__CONVEYED:
+			return !getConveyeds().isEmpty();
+		case UMLPackage.INFORMATION_FLOW__INFORMATION_SOURCE:
+			return !getInformationSources().isEmpty();
+		case UMLPackage.INFORMATION_FLOW__INFORMATION_TARGET:
+			return !getInformationTargets().isEmpty();
+		case UMLPackage.INFORMATION_FLOW__REALIZATION:
+			return !getRealizations().isEmpty();
+		case UMLPackage.INFORMATION_FLOW__REALIZING_ACTIVITY_EDGE:
+			return !getRealizingActivityEdges().isEmpty();
+		case UMLPackage.INFORMATION_FLOW__REALIZING_CONNECTOR:
+			return !getRealizingConnectors().isEmpty();
+		case UMLPackage.INFORMATION_FLOW__REALIZING_MESSAGE:
+			return !getRealizingMessages().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -721,20 +652,20 @@
 			Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.INFORMATION_FLOW__RELATED_ELEMENT :
-					return UMLPackage.RELATIONSHIP__RELATED_ELEMENT;
-				default :
-					return -1;
+			case UMLPackage.INFORMATION_FLOW__RELATED_ELEMENT:
+				return UMLPackage.RELATIONSHIP__RELATED_ELEMENT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == DirectedRelationship.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.INFORMATION_FLOW__SOURCE :
-					return UMLPackage.DIRECTED_RELATIONSHIP__SOURCE;
-				case UMLPackage.INFORMATION_FLOW__TARGET :
-					return UMLPackage.DIRECTED_RELATIONSHIP__TARGET;
-				default :
-					return -1;
+			case UMLPackage.INFORMATION_FLOW__SOURCE:
+				return UMLPackage.DIRECTED_RELATIONSHIP__SOURCE;
+			case UMLPackage.INFORMATION_FLOW__TARGET:
+				return UMLPackage.DIRECTED_RELATIONSHIP__TARGET;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -750,20 +681,20 @@
 			Class<?> baseClass) {
 		if (baseClass == Relationship.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.RELATIONSHIP__RELATED_ELEMENT :
-					return UMLPackage.INFORMATION_FLOW__RELATED_ELEMENT;
-				default :
-					return -1;
+			case UMLPackage.RELATIONSHIP__RELATED_ELEMENT:
+				return UMLPackage.INFORMATION_FLOW__RELATED_ELEMENT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == DirectedRelationship.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.DIRECTED_RELATIONSHIP__SOURCE :
-					return UMLPackage.INFORMATION_FLOW__SOURCE;
-				case UMLPackage.DIRECTED_RELATIONSHIP__TARGET :
-					return UMLPackage.INFORMATION_FLOW__TARGET;
-				default :
-					return -1;
+			case UMLPackage.DIRECTED_RELATIONSHIP__SOURCE:
+				return UMLPackage.INFORMATION_FLOW__SOURCE;
+			case UMLPackage.DIRECTED_RELATIONSHIP__TARGET:
+				return UMLPackage.INFORMATION_FLOW__TARGET;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -779,145 +710,122 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.INFORMATION_FLOW___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_FLOW___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_FLOW___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.INFORMATION_FLOW___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.INFORMATION_FLOW___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.INFORMATION_FLOW___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.INFORMATION_FLOW___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INFORMATION_FLOW___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___GET_MODEL :
-				return getModel();
-			case UMLPackage.INFORMATION_FLOW___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.INFORMATION_FLOW___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.INFORMATION_FLOW___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.INFORMATION_FLOW___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.INFORMATION_FLOW___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.INFORMATION_FLOW___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.INFORMATION_FLOW___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INFORMATION_FLOW___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INFORMATION_FLOW___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.INFORMATION_FLOW___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.INFORMATION_FLOW___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.INFORMATION_FLOW___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_FLOW___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_FLOW___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_FLOW___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___GET_LABEL :
-				return getLabel();
-			case UMLPackage.INFORMATION_FLOW___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.INFORMATION_FLOW___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.INFORMATION_FLOW___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.INFORMATION_FLOW___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.INFORMATION_FLOW___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INFORMATION_FLOW___SEPARATOR :
-				return separator();
-			case UMLPackage.INFORMATION_FLOW___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.INFORMATION_FLOW___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.INFORMATION_FLOW___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.INFORMATION_FLOW___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_FLOW___VALIDATE_MUST_CONFORM__DIAGNOSTICCHAIN_MAP :
-				return validateMustConform((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_FLOW___VALIDATE_SOURCES_AND_TARGETS_KIND__DIAGNOSTICCHAIN_MAP :
-				return validateSourcesAndTargetsKind(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_FLOW___VALIDATE_CONVEY_CLASSIFIERS__DIAGNOSTICCHAIN_MAP :
-				return validateConveyClassifiers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_FLOW___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_FLOW___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_FLOW___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.INFORMATION_FLOW___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.INFORMATION_FLOW___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.INFORMATION_FLOW___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.INFORMATION_FLOW___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INFORMATION_FLOW___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___GET_MODEL:
+			return getModel();
+		case UMLPackage.INFORMATION_FLOW___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.INFORMATION_FLOW___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.INFORMATION_FLOW___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.INFORMATION_FLOW___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.INFORMATION_FLOW___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.INFORMATION_FLOW___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.INFORMATION_FLOW___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INFORMATION_FLOW___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INFORMATION_FLOW___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.INFORMATION_FLOW___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.INFORMATION_FLOW___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.INFORMATION_FLOW___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_FLOW___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_FLOW___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_FLOW___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___GET_LABEL:
+			return getLabel();
+		case UMLPackage.INFORMATION_FLOW___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.INFORMATION_FLOW___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.INFORMATION_FLOW___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.INFORMATION_FLOW___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.INFORMATION_FLOW___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INFORMATION_FLOW___SEPARATOR:
+			return separator();
+		case UMLPackage.INFORMATION_FLOW___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.INFORMATION_FLOW___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.INFORMATION_FLOW___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.INFORMATION_FLOW___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_FLOW___VALIDATE_MUST_CONFORM__DIAGNOSTICCHAIN_MAP:
+			return validateMustConform((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_FLOW___VALIDATE_SOURCES_AND_TARGETS_KIND__DIAGNOSTICCHAIN_MAP:
+			return validateSourcesAndTargetsKind((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_FLOW___VALIDATE_CONVEY_CLASSIFIERS__DIAGNOSTICCHAIN_MAP:
+			return validateConveyClassifiers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -930,9 +838,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] RELATED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.INFORMATION_FLOW__SOURCE,
-		UMLPackage.INFORMATION_FLOW__TARGET};
+	protected static final int[] RELATED_ELEMENT_ESUBSETS = new int[] { UMLPackage.INFORMATION_FLOW__SOURCE, UMLPackage.INFORMATION_FLOW__TARGET };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -940,7 +846,8 @@
 	 * @generated
 	 */
 	public boolean isSetRelatedElements() {
-		return isSetSources() || isSetTargets();
+		return isSetSources()
+				|| isSetTargets();
 	}
 
 	/**
@@ -951,8 +858,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SOURCE_ESUBSETS = new int[]{
-		UMLPackage.INFORMATION_FLOW__INFORMATION_SOURCE};
+	protected static final int[] SOURCE_ESUBSETS = new int[] { UMLPackage.INFORMATION_FLOW__INFORMATION_SOURCE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -971,8 +877,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] TARGET_ESUBSETS = new int[]{
-		UMLPackage.INFORMATION_FLOW__INFORMATION_TARGET};
+	protected static final int[] TARGET_ESUBSETS = new int[] { UMLPackage.INFORMATION_FLOW__INFORMATION_TARGET };
 
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InformationItemImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InformationItemImpl.java
index 1765629..99fd3da 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InformationItemImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InformationItemImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -23,6 +23,8 @@
 
 import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+
 import org.eclipse.uml2.uml.AggregationKind;
 import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
@@ -94,9 +96,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Classifier> getRepresenteds() {
-		return (EList<Classifier>) eDynamicGet(
-			UMLPackage.INFORMATION_ITEM__REPRESENTED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INFORMATION_ITEM__REPRESENTED, true, true);
+		return (EList<Classifier>) eDynamicGet(UMLPackage.INFORMATION_ITEM__REPRESENTED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INFORMATION_ITEM__REPRESENTED, true, true);
 	}
 
 	/**
@@ -115,12 +115,10 @@
 	 */
 	public Classifier getRepresented(String name, boolean ignoreCase,
 			EClass eClass) {
-		representedLoop : for (Classifier represented : getRepresenteds()) {
+		representedLoop: for (Classifier represented : getRepresenteds()) {
 			if (eClass != null && !eClass.isInstance(represented))
 				continue representedLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(represented.getName())
-				: name.equals(represented.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(represented.getName()) : name.equals(represented.getName())))
 				continue representedLoop;
 			return represented;
 		}
@@ -134,8 +132,7 @@
 	 */
 	public boolean validateSourcesAndTargets(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InformationItemOperations.validateSourcesAndTargets(this,
-			diagnostics, context);
+		return InformationItemOperations.validateSourcesAndTargets(this, diagnostics, context);
 	}
 
 	/**
@@ -145,8 +142,7 @@
 	 */
 	public boolean validateHasNo(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InformationItemOperations.validateHasNo(this, diagnostics,
-			context);
+		return InformationItemOperations.validateHasNo(this, diagnostics, context);
 	}
 
 	/**
@@ -156,8 +152,7 @@
 	 */
 	public boolean validateNotInstantiable(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InformationItemOperations.validateNotInstantiable(this,
-			diagnostics, context);
+		return InformationItemOperations.validateNotInstantiable(this, diagnostics, context);
 	}
 
 	/**
@@ -168,100 +163,100 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INFORMATION_ITEM__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INFORMATION_ITEM__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INFORMATION_ITEM__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INFORMATION_ITEM__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INFORMATION_ITEM__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INFORMATION_ITEM__NAME :
-				return getName();
-			case UMLPackage.INFORMATION_ITEM__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INFORMATION_ITEM__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INFORMATION_ITEM__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INFORMATION_ITEM__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INFORMATION_ITEM__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.INFORMATION_ITEM__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.INFORMATION_ITEM__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.INFORMATION_ITEM__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.INFORMATION_ITEM__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.INFORMATION_ITEM__MEMBER :
-				return getMembers();
-			case UMLPackage.INFORMATION_ITEM__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.INFORMATION_ITEM__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.INFORMATION_ITEM__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.INFORMATION_ITEM__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.INFORMATION_ITEM__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.INFORMATION_ITEM__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.INFORMATION_ITEM__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.INFORMATION_ITEM__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.INFORMATION_ITEM__FEATURE :
-				return getFeatures();
-			case UMLPackage.INFORMATION_ITEM__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.INFORMATION_ITEM__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.INFORMATION_ITEM__GENERAL :
-				return getGenerals();
-			case UMLPackage.INFORMATION_ITEM__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.INFORMATION_ITEM__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.INFORMATION_ITEM__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.INFORMATION_ITEM__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.INFORMATION_ITEM__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.INFORMATION_ITEM__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.INFORMATION_ITEM__USE_CASE :
-				return getUseCases();
-			case UMLPackage.INFORMATION_ITEM__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.INFORMATION_ITEM__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.INFORMATION_ITEM__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.INFORMATION_ITEM__REPRESENTED :
-				return getRepresenteds();
+		case UMLPackage.INFORMATION_ITEM__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INFORMATION_ITEM__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INFORMATION_ITEM__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INFORMATION_ITEM__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INFORMATION_ITEM__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INFORMATION_ITEM__NAME:
+			return getName();
+		case UMLPackage.INFORMATION_ITEM__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INFORMATION_ITEM__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INFORMATION_ITEM__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INFORMATION_ITEM__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INFORMATION_ITEM__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.INFORMATION_ITEM__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.INFORMATION_ITEM__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.INFORMATION_ITEM__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.INFORMATION_ITEM__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.INFORMATION_ITEM__MEMBER:
+			return getMembers();
+		case UMLPackage.INFORMATION_ITEM__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.INFORMATION_ITEM__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.INFORMATION_ITEM__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.INFORMATION_ITEM__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.INFORMATION_ITEM__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.INFORMATION_ITEM__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.INFORMATION_ITEM__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.INFORMATION_ITEM__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.INFORMATION_ITEM__FEATURE:
+			return getFeatures();
+		case UMLPackage.INFORMATION_ITEM__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.INFORMATION_ITEM__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.INFORMATION_ITEM__GENERAL:
+			return getGenerals();
+		case UMLPackage.INFORMATION_ITEM__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.INFORMATION_ITEM__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.INFORMATION_ITEM__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.INFORMATION_ITEM__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.INFORMATION_ITEM__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.INFORMATION_ITEM__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.INFORMATION_ITEM__USE_CASE:
+			return getUseCases();
+		case UMLPackage.INFORMATION_ITEM__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.INFORMATION_ITEM__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.INFORMATION_ITEM__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.INFORMATION_ITEM__REPRESENTED:
+			return getRepresenteds();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -275,113 +270,99 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INFORMATION_ITEM__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.INFORMATION_ITEM__REPRESENTED :
-				getRepresenteds().clear();
-				getRepresenteds()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
+		case UMLPackage.INFORMATION_ITEM__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.INFORMATION_ITEM__REPRESENTED:
+			getRepresenteds().clear();
+			getRepresenteds().addAll((Collection<? extends Classifier>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -394,84 +375,84 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INFORMATION_ITEM__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INFORMATION_ITEM__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INFORMATION_ITEM__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INFORMATION_ITEM__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INFORMATION_ITEM__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INFORMATION_ITEM__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.INFORMATION_ITEM__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.INFORMATION_ITEM__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.INFORMATION_ITEM__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.INFORMATION_ITEM__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INFORMATION_ITEM__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INFORMATION_ITEM__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.INFORMATION_ITEM__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.INFORMATION_ITEM__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.INFORMATION_ITEM__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.INFORMATION_ITEM__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.INFORMATION_ITEM__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.INFORMATION_ITEM__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.INFORMATION_ITEM__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.INFORMATION_ITEM__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.INFORMATION_ITEM__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.INFORMATION_ITEM__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.INFORMATION_ITEM__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.INFORMATION_ITEM__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.INFORMATION_ITEM__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.INFORMATION_ITEM__REPRESENTED :
-				getRepresenteds().clear();
-				return;
+		case UMLPackage.INFORMATION_ITEM__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INFORMATION_ITEM__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INFORMATION_ITEM__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INFORMATION_ITEM__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INFORMATION_ITEM__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INFORMATION_ITEM__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.INFORMATION_ITEM__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.INFORMATION_ITEM__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.INFORMATION_ITEM__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.INFORMATION_ITEM__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INFORMATION_ITEM__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INFORMATION_ITEM__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.INFORMATION_ITEM__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.INFORMATION_ITEM__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.INFORMATION_ITEM__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.INFORMATION_ITEM__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.INFORMATION_ITEM__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.INFORMATION_ITEM__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.INFORMATION_ITEM__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.INFORMATION_ITEM__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.INFORMATION_ITEM__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.INFORMATION_ITEM__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.INFORMATION_ITEM__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.INFORMATION_ITEM__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.INFORMATION_ITEM__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.INFORMATION_ITEM__REPRESENTED:
+			getRepresenteds().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -484,86 +465,84 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INFORMATION_ITEM__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INFORMATION_ITEM__OWNER :
-				return isSetOwner();
-			case UMLPackage.INFORMATION_ITEM__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__NAME :
-				return isSetName();
-			case UMLPackage.INFORMATION_ITEM__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INFORMATION_ITEM__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INFORMATION_ITEM__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INFORMATION_ITEM__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INFORMATION_ITEM__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.INFORMATION_ITEM__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__MEMBER :
-				return isSetMembers();
-			case UMLPackage.INFORMATION_ITEM__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.INFORMATION_ITEM__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.INFORMATION_ITEM__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.INFORMATION_ITEM__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.INFORMATION_ITEM__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.INFORMATION_ITEM__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.INFORMATION_ITEM__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.INFORMATION_ITEM__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.INFORMATION_ITEM__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.INFORMATION_ITEM__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__GENERAL :
-				return !getGenerals().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.INFORMATION_ITEM__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.INFORMATION_ITEM__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.INFORMATION_ITEM__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.INFORMATION_ITEM__REPRESENTED :
-				return !getRepresenteds().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INFORMATION_ITEM__OWNER:
+			return isSetOwner();
+		case UMLPackage.INFORMATION_ITEM__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__NAME:
+			return isSetName();
+		case UMLPackage.INFORMATION_ITEM__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INFORMATION_ITEM__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INFORMATION_ITEM__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INFORMATION_ITEM__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INFORMATION_ITEM__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.INFORMATION_ITEM__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__MEMBER:
+			return isSetMembers();
+		case UMLPackage.INFORMATION_ITEM__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.INFORMATION_ITEM__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.INFORMATION_ITEM__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.INFORMATION_ITEM__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.INFORMATION_ITEM__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.INFORMATION_ITEM__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.INFORMATION_ITEM__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.INFORMATION_ITEM__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.INFORMATION_ITEM__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.INFORMATION_ITEM__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__GENERAL:
+			return !getGenerals().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.INFORMATION_ITEM__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.INFORMATION_ITEM__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.INFORMATION_ITEM__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.INFORMATION_ITEM__REPRESENTED:
+			return !getRepresenteds().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -578,283 +557,223 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.INFORMATION_ITEM___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.INFORMATION_ITEM___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.INFORMATION_ITEM___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.INFORMATION_ITEM___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.INFORMATION_ITEM___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___GET_MODEL :
-				return getModel();
-			case UMLPackage.INFORMATION_ITEM___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.INFORMATION_ITEM___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.INFORMATION_ITEM___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.INFORMATION_ITEM___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.INFORMATION_ITEM___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.INFORMATION_ITEM___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.INFORMATION_ITEM___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.INFORMATION_ITEM___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.INFORMATION_ITEM___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___GET_LABEL :
-				return getLabel();
-			case UMLPackage.INFORMATION_ITEM___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.INFORMATION_ITEM___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.INFORMATION_ITEM___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.INFORMATION_ITEM___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INFORMATION_ITEM___SEPARATOR :
-				return separator();
-			case UMLPackage.INFORMATION_ITEM___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.INFORMATION_ITEM___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.INFORMATION_ITEM___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.INFORMATION_ITEM___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.INFORMATION_ITEM___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.INFORMATION_ITEM___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.INFORMATION_ITEM___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.INFORMATION_ITEM___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.INFORMATION_ITEM___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.INFORMATION_ITEM___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.INFORMATION_ITEM___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.INFORMATION_ITEM___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.INFORMATION_ITEM___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.INFORMATION_ITEM___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.INFORMATION_ITEM___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.INFORMATION_ITEM___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.INFORMATION_ITEM___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.INFORMATION_ITEM___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.INFORMATION_ITEM___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___PARENTS :
-				return parents();
-			case UMLPackage.INFORMATION_ITEM___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.INFORMATION_ITEM___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.INFORMATION_ITEM___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.INFORMATION_ITEM___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.INFORMATION_ITEM___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.INFORMATION_ITEM___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.INFORMATION_ITEM___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_SOURCES_AND_TARGETS__DIAGNOSTICCHAIN_MAP :
-				return validateSourcesAndTargets(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_HAS_NO__DIAGNOSTICCHAIN_MAP :
-				return validateHasNo((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INFORMATION_ITEM___VALIDATE_NOT_INSTANTIABLE__DIAGNOSTICCHAIN_MAP :
-				return validateNotInstantiable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.INFORMATION_ITEM___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.INFORMATION_ITEM___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.INFORMATION_ITEM___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.INFORMATION_ITEM___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___GET_MODEL:
+			return getModel();
+		case UMLPackage.INFORMATION_ITEM___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.INFORMATION_ITEM___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.INFORMATION_ITEM___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.INFORMATION_ITEM___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.INFORMATION_ITEM___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.INFORMATION_ITEM___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.INFORMATION_ITEM___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.INFORMATION_ITEM___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.INFORMATION_ITEM___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___GET_LABEL:
+			return getLabel();
+		case UMLPackage.INFORMATION_ITEM___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.INFORMATION_ITEM___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.INFORMATION_ITEM___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.INFORMATION_ITEM___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INFORMATION_ITEM___SEPARATOR:
+			return separator();
+		case UMLPackage.INFORMATION_ITEM___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.INFORMATION_ITEM___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.INFORMATION_ITEM___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.INFORMATION_ITEM___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.INFORMATION_ITEM___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.INFORMATION_ITEM___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.INFORMATION_ITEM___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.INFORMATION_ITEM___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.INFORMATION_ITEM___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.INFORMATION_ITEM___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.INFORMATION_ITEM___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.INFORMATION_ITEM___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.INFORMATION_ITEM___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.INFORMATION_ITEM___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.INFORMATION_ITEM___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.INFORMATION_ITEM___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.INFORMATION_ITEM___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.INFORMATION_ITEM___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.INFORMATION_ITEM___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___PARENTS:
+			return parents();
+		case UMLPackage.INFORMATION_ITEM___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.INFORMATION_ITEM___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.INFORMATION_ITEM___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.INFORMATION_ITEM___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.INFORMATION_ITEM___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.INFORMATION_ITEM___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.INFORMATION_ITEM___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_SOURCES_AND_TARGETS__DIAGNOSTICCHAIN_MAP:
+			return validateSourcesAndTargets((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_HAS_NO__DIAGNOSTICCHAIN_MAP:
+			return validateHasNo((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INFORMATION_ITEM___VALIDATE_NOT_INSTANTIABLE__DIAGNOSTICCHAIN_MAP:
+			return validateNotInstantiable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InitialNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InitialNodeImpl.java
index b4eb69d..23aa50f 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InitialNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InitialNodeImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -67,8 +67,7 @@
 	 */
 	public boolean validateNoIncomingEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InitialNodeOperations.validateNoIncomingEdges(this, diagnostics,
-			context);
+		return InitialNodeOperations.validateNoIncomingEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -78,8 +77,7 @@
 	 */
 	public boolean validateControlEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InitialNodeOperations.validateControlEdges(this, diagnostics,
-			context);
+		return InitialNodeOperations.validateControlEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -92,151 +90,126 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.INITIAL_NODE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INITIAL_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INITIAL_NODE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.INITIAL_NODE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.INITIAL_NODE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.INITIAL_NODE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.INITIAL_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INITIAL_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___GET_MODEL :
-				return getModel();
-			case UMLPackage.INITIAL_NODE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.INITIAL_NODE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.INITIAL_NODE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.INITIAL_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.INITIAL_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.INITIAL_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.INITIAL_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INITIAL_NODE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INITIAL_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.INITIAL_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.INITIAL_NODE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.INITIAL_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INITIAL_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INITIAL_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INITIAL_NODE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.INITIAL_NODE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.INITIAL_NODE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.INITIAL_NODE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.INITIAL_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.INITIAL_NODE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INITIAL_NODE___SEPARATOR :
-				return separator();
-			case UMLPackage.INITIAL_NODE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.INITIAL_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INITIAL_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INITIAL_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INITIAL_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.INITIAL_NODE___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.INITIAL_NODE___VALIDATE_NO_INCOMING_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateNoIncomingEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INITIAL_NODE___VALIDATE_CONTROL_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateControlEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INITIAL_NODE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INITIAL_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INITIAL_NODE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.INITIAL_NODE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.INITIAL_NODE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.INITIAL_NODE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.INITIAL_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INITIAL_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___GET_MODEL:
+			return getModel();
+		case UMLPackage.INITIAL_NODE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.INITIAL_NODE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.INITIAL_NODE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.INITIAL_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.INITIAL_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.INITIAL_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.INITIAL_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INITIAL_NODE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INITIAL_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.INITIAL_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.INITIAL_NODE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.INITIAL_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INITIAL_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INITIAL_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INITIAL_NODE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.INITIAL_NODE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.INITIAL_NODE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.INITIAL_NODE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.INITIAL_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.INITIAL_NODE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INITIAL_NODE___SEPARATOR:
+			return separator();
+		case UMLPackage.INITIAL_NODE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.INITIAL_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INITIAL_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INITIAL_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INITIAL_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.INITIAL_NODE___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.INITIAL_NODE___VALIDATE_NO_INCOMING_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateNoIncomingEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INITIAL_NODE___VALIDATE_CONTROL_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateControlEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InputPinImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InputPinImpl.java
index ce855c8..ff471e4 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InputPinImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InputPinImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -68,8 +68,7 @@
 	 */
 	public boolean validateOutgoingEdgesStructuredOnly(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return InputPinOperations.validateOutgoingEdgesStructuredOnly(this,
-			diagnostics, context);
+		return InputPinOperations.validateOutgoingEdgesStructuredOnly(this, diagnostics, context);
 	}
 
 	/**
@@ -82,212 +81,168 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.INPUT_PIN___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.INPUT_PIN___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.INPUT_PIN___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INPUT_PIN___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.INPUT_PIN___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.INPUT_PIN___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.INPUT_PIN___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.INPUT_PIN___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.INPUT_PIN___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.INPUT_PIN___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.INPUT_PIN___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INPUT_PIN___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.INPUT_PIN___GET_MODEL :
-				return getModel();
-			case UMLPackage.INPUT_PIN___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.INPUT_PIN___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.INPUT_PIN___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.INPUT_PIN___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.INPUT_PIN___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.INPUT_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.INPUT_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INPUT_PIN___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.INPUT_PIN___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.INPUT_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.INPUT_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INPUT_PIN___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INPUT_PIN___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.INPUT_PIN___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INPUT_PIN___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.INPUT_PIN___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.INPUT_PIN___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.INPUT_PIN___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.INPUT_PIN___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.INPUT_PIN___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INPUT_PIN___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.INPUT_PIN___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.INPUT_PIN___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.INPUT_PIN___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.INPUT_PIN___GET_LABEL :
-				return getLabel();
-			case UMLPackage.INPUT_PIN___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.INPUT_PIN___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.INPUT_PIN___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.INPUT_PIN___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.INPUT_PIN___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.INPUT_PIN___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INPUT_PIN___SEPARATOR :
-				return separator();
-			case UMLPackage.INPUT_PIN___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.INPUT_PIN___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.INPUT_PIN___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.INPUT_PIN___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.INPUT_PIN___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP :
-				return validateInputOutputParameter(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateSelectionBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateObjectFlowEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-				return validateUpperGeLower((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-				return validateLowerGe0((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationNoSideEffects(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationConstant(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-				return validateLowerIsInteger(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-				return validateUpperIsUnlimitedNatural(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___SET_LOWER__INT :
-				setLower((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.INPUT_PIN___SET_UPPER__INT :
-				setUpper((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.INPUT_PIN___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-				return compatibleWith((MultiplicityElement) arguments.get(0));
-			case UMLPackage.INPUT_PIN___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-				return includesMultiplicity(
-					(MultiplicityElement) arguments.get(0));
-			case UMLPackage.INPUT_PIN___IS__INT_INT :
-				return is((Integer) arguments.get(0),
-					(Integer) arguments.get(1));
-			case UMLPackage.INPUT_PIN___IS_MULTIVALUED :
-				return isMultivalued();
-			case UMLPackage.INPUT_PIN___GET_LOWER :
-				return getLower();
-			case UMLPackage.INPUT_PIN___LOWER_BOUND :
-				return lowerBound();
-			case UMLPackage.INPUT_PIN___GET_UPPER :
-				return getUpper();
-			case UMLPackage.INPUT_PIN___UPPER_BOUND :
-				return upperBound();
-			case UMLPackage.INPUT_PIN___VALIDATE_CONTROL_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateControlPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___VALIDATE_NOT_UNIQUE__DIAGNOSTICCHAIN_MAP :
-				return validateNotUnique((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INPUT_PIN___VALIDATE_OUTGOING_EDGES_STRUCTURED_ONLY__DIAGNOSTICCHAIN_MAP :
-				return validateOutgoingEdgesStructuredOnly(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.INPUT_PIN___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.INPUT_PIN___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INPUT_PIN___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.INPUT_PIN___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.INPUT_PIN___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.INPUT_PIN___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.INPUT_PIN___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.INPUT_PIN___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.INPUT_PIN___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.INPUT_PIN___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INPUT_PIN___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.INPUT_PIN___GET_MODEL:
+			return getModel();
+		case UMLPackage.INPUT_PIN___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.INPUT_PIN___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.INPUT_PIN___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.INPUT_PIN___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.INPUT_PIN___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.INPUT_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.INPUT_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INPUT_PIN___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.INPUT_PIN___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.INPUT_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.INPUT_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INPUT_PIN___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INPUT_PIN___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.INPUT_PIN___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INPUT_PIN___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.INPUT_PIN___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.INPUT_PIN___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.INPUT_PIN___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.INPUT_PIN___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.INPUT_PIN___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INPUT_PIN___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.INPUT_PIN___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.INPUT_PIN___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.INPUT_PIN___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.INPUT_PIN___GET_LABEL:
+			return getLabel();
+		case UMLPackage.INPUT_PIN___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.INPUT_PIN___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.INPUT_PIN___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.INPUT_PIN___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.INPUT_PIN___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.INPUT_PIN___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INPUT_PIN___SEPARATOR:
+			return separator();
+		case UMLPackage.INPUT_PIN___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.INPUT_PIN___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.INPUT_PIN___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.INPUT_PIN___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.INPUT_PIN___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP:
+			return validateInputOutputParameter((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateSelectionBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateObjectFlowEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+			return validateUpperGeLower((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+			return validateLowerGe0((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationConstant((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+			return validateLowerIsInteger((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+			return validateUpperIsUnlimitedNatural((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___SET_LOWER__INT:
+			setLower((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.INPUT_PIN___SET_UPPER__INT:
+			setUpper((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.INPUT_PIN___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+			return compatibleWith((MultiplicityElement) arguments.get(0));
+		case UMLPackage.INPUT_PIN___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+			return includesMultiplicity((MultiplicityElement) arguments.get(0));
+		case UMLPackage.INPUT_PIN___IS__INT_INT:
+			return is((Integer) arguments.get(0), (Integer) arguments.get(1));
+		case UMLPackage.INPUT_PIN___IS_MULTIVALUED:
+			return isMultivalued();
+		case UMLPackage.INPUT_PIN___GET_LOWER:
+			return getLower();
+		case UMLPackage.INPUT_PIN___LOWER_BOUND:
+			return lowerBound();
+		case UMLPackage.INPUT_PIN___GET_UPPER:
+			return getUpper();
+		case UMLPackage.INPUT_PIN___UPPER_BOUND:
+			return upperBound();
+		case UMLPackage.INPUT_PIN___VALIDATE_CONTROL_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateControlPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___VALIDATE_NOT_UNIQUE__DIAGNOSTICCHAIN_MAP:
+			return validateNotUnique((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INPUT_PIN___VALIDATE_OUTGOING_EDGES_STRUCTURED_ONLY__DIAGNOSTICCHAIN_MAP:
+			return validateOutgoingEdgesStructuredOnly((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InstanceSpecificationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InstanceSpecificationImpl.java
index d1e7a5d..9e68cc3 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InstanceSpecificationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InstanceSpecificationImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 454400, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,8 +29,13 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -109,9 +115,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -120,11 +124,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true,
-			true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -133,11 +133,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -147,13 +143,11 @@
 	 */
 	public NotificationChain basicSetTemplateParameter(
 			TemplateParameter newTemplateParameter, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter,
-			UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter, UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			TemplateParameter owningTemplateParameter = basicGetOwningTemplateParameter();
-			if (owningTemplateParameter != null
-				&& owningTemplateParameter != newTemplateParameter) {
+			if (owningTemplateParameter != null && owningTemplateParameter != newTemplateParameter) {
 				setOwningTemplateParameter(null);
 			}
 		}
@@ -166,16 +160,11 @@
 	 * @generated
 	 */
 	public void setTemplateParameter(TemplateParameter newTemplateParameter) {
-		eDynamicSet(
-			UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			newTemplateParameter);
+		eDynamicSet(UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, newTemplateParameter);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			TemplateParameter owningTemplateParameter = basicGetOwningTemplateParameter();
-			if (owningTemplateParameter != null
-				&& owningTemplateParameter != newTemplateParameter) {
+			if (owningTemplateParameter != null && owningTemplateParameter != newTemplateParameter) {
 				setOwningTemplateParameter(null);
 			}
 		}
@@ -187,11 +176,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			true, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -200,11 +185,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -215,8 +196,7 @@
 	public NotificationChain basicSetOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter,
-			UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter, UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -235,11 +215,7 @@
 	 */
 	public void setOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter) {
-		eDynamicSet(
-			UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			newOwningTemplateParameter);
+		eDynamicSet(UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, newOwningTemplateParameter);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -257,10 +233,7 @@
 	 */
 	@Override
 	public VisibilityKind getVisibility() {
-		return (VisibilityKind) eDynamicGet(
-			UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, true, true);
+		return (VisibilityKind) eDynamicGet(UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, true, true);
 	}
 
 	/**
@@ -270,10 +243,7 @@
 	 */
 	@Override
 	public void setVisibility(VisibilityKind newVisibility) {
-		eDynamicSet(
-			UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, newVisibility);
+		eDynamicSet(UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, newVisibility);
 	}
 
 	/**
@@ -283,10 +253,7 @@
 	 */
 	@Override
 	public void unsetVisibility() {
-		eDynamicUnset(
-			UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
+		eDynamicUnset(UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
 	}
 
 	/**
@@ -296,10 +263,7 @@
 	 */
 	@Override
 	public boolean isSetVisibility() {
-		return eDynamicIsSet(
-			UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
+		return eDynamicIsSet(UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
 	}
 
 	/**
@@ -313,21 +277,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.INSTANCE_SPECIFICATION__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INSTANCE_SPECIFICATION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.INSTANCE_SPECIFICATION__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INSTANCE_SPECIFICATION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -337,10 +293,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Classifier> getClassifiers() {
-		return (EList<Classifier>) eDynamicGet(
-			UMLPackage.INSTANCE_SPECIFICATION__CLASSIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INSTANCE_SPECIFICATION__CLASSIFIER, true, true);
+		return (EList<Classifier>) eDynamicGet(UMLPackage.INSTANCE_SPECIFICATION__CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INSTANCE_SPECIFICATION__CLASSIFIER, true, true);
 	}
 
 	/**
@@ -359,12 +312,10 @@
 	 */
 	public Classifier getClassifier(String name, boolean ignoreCase,
 			EClass eClass) {
-		classifierLoop : for (Classifier classifier : getClassifiers()) {
+		classifierLoop: for (Classifier classifier : getClassifiers()) {
 			if (eClass != null && !eClass.isInstance(classifier))
 				continue classifierLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(classifier.getName())
-				: name.equals(classifier.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(classifier.getName()) : name.equals(classifier.getName())))
 				continue classifierLoop;
 			return classifier;
 		}
@@ -377,11 +328,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getSpecification() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INSTANCE_SPECIFICATION__SPECIFICATION, true,
-			true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INSTANCE_SPECIFICATION__SPECIFICATION, true, true);
 	}
 
 	/**
@@ -390,11 +337,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetSpecification() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INSTANCE_SPECIFICATION__SPECIFICATION, false,
-			true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INSTANCE_SPECIFICATION__SPECIFICATION, false, true);
 	}
 
 	/**
@@ -404,8 +347,7 @@
 	 */
 	public NotificationChain basicSetSpecification(
 			ValueSpecification newSpecification, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newSpecification,
-			UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newSpecification, UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION, msgs);
 		return msgs;
 	}
 
@@ -415,11 +357,7 @@
 	 * @generated
 	 */
 	public void setSpecification(ValueSpecification newSpecification) {
-		eDynamicSet(
-			UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INSTANCE_SPECIFICATION__SPECIFICATION,
-			newSpecification);
+		eDynamicSet(UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INSTANCE_SPECIFICATION__SPECIFICATION, newSpecification);
 	}
 
 	/**
@@ -429,8 +367,7 @@
 	 */
 	public ValueSpecification createSpecification(String name, Type type,
 			EClass eClass) {
-		ValueSpecification newSpecification = (ValueSpecification) create(
-			eClass);
+		ValueSpecification newSpecification = (ValueSpecification) create(eClass);
 		setSpecification(newSpecification);
 		if (name != null)
 			newSpecification.setName(name);
@@ -446,9 +383,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Slot> getSlots() {
-		return (EList<Slot>) eDynamicGet(
-			UMLPackage.INSTANCE_SPECIFICATION__SLOT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INSTANCE_SPECIFICATION__SLOT, true, true);
+		return (EList<Slot>) eDynamicGet(UMLPackage.INSTANCE_SPECIFICATION__SLOT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INSTANCE_SPECIFICATION__SLOT, true, true);
 	}
 
 	/**
@@ -487,8 +422,7 @@
 	 */
 	public boolean validateNamespaceNeedsVisibility(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PackageableElementOperations
-			.validateNamespaceNeedsVisibility(this, diagnostics, context);
+		return PackageableElementOperations.validateNamespaceNeedsVisibility(this, diagnostics, context);
 	}
 
 	/**
@@ -498,8 +432,7 @@
 	 */
 	public boolean validateDefiningFeature(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InstanceSpecificationOperations.validateDefiningFeature(this,
-			diagnostics, context);
+		return InstanceSpecificationOperations.validateDefiningFeature(this, diagnostics, context);
 	}
 
 	/**
@@ -509,8 +442,7 @@
 	 */
 	public boolean validateStructuralFeature(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InstanceSpecificationOperations.validateStructuralFeature(this,
-			diagnostics, context);
+		return InstanceSpecificationOperations.validateStructuralFeature(this, diagnostics, context);
 	}
 
 	/**
@@ -520,8 +452,7 @@
 	 */
 	public boolean validateDeploymentTarget(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InstanceSpecificationOperations.validateDeploymentTarget(this,
-			diagnostics, context);
+		return InstanceSpecificationOperations.validateDeploymentTarget(this, diagnostics, context);
 	}
 
 	/**
@@ -531,8 +462,7 @@
 	 */
 	public boolean validateDeploymentArtifact(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InstanceSpecificationOperations.validateDeploymentArtifact(this,
-			diagnostics, context);
+		return InstanceSpecificationOperations.validateDeploymentArtifact(this, diagnostics, context);
 	}
 
 	/**
@@ -545,29 +475,21 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getDeployments())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.INSTANCE_SPECIFICATION__SLOT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSlots())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getDeployments()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.INSTANCE_SPECIFICATION__SLOT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSlots()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -581,26 +503,22 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INSTANCE_SPECIFICATION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INSTANCE_SPECIFICATION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT :
-				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);
-			case UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION :
-				return basicSetSpecification(null, msgs);
+		case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INSTANCE_SPECIFICATION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INSTANCE_SPECIFICATION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT:
+			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);
+		case UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION:
+			return basicSetSpecification(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -614,10 +532,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
+		case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -630,52 +546,52 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INSTANCE_SPECIFICATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INSTANCE_SPECIFICATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INSTANCE_SPECIFICATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INSTANCE_SPECIFICATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INSTANCE_SPECIFICATION__NAME :
-				return getName();
-			case UMLPackage.INSTANCE_SPECIFICATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INSTANCE_SPECIFICATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INSTANCE_SPECIFICATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYED_ELEMENT :
-				return getDeployedElements();
-			case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT :
-				return getDeployments();
-			case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.INSTANCE_SPECIFICATION__CLASSIFIER :
-				return getClassifiers();
-			case UMLPackage.INSTANCE_SPECIFICATION__SLOT :
-				return getSlots();
-			case UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION :
-				if (resolve)
-					return getSpecification();
-				return basicGetSpecification();
+		case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INSTANCE_SPECIFICATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INSTANCE_SPECIFICATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INSTANCE_SPECIFICATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INSTANCE_SPECIFICATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INSTANCE_SPECIFICATION__NAME:
+			return getName();
+		case UMLPackage.INSTANCE_SPECIFICATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INSTANCE_SPECIFICATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INSTANCE_SPECIFICATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYED_ELEMENT:
+			return getDeployedElements();
+		case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT:
+			return getDeployments();
+		case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.INSTANCE_SPECIFICATION__CLASSIFIER:
+			return getClassifiers();
+		case UMLPackage.INSTANCE_SPECIFICATION__SLOT:
+			return getSlots();
+		case UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION:
+			if (resolve)
+				return getSpecification();
+			return basicGetSpecification();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -689,48 +605,44 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT :
-				getDeployments().clear();
-				getDeployments()
-					.addAll((Collection<? extends Deployment>) newValue);
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__CLASSIFIER :
-				getClassifiers().clear();
-				getClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__SLOT :
-				getSlots().clear();
-				getSlots().addAll((Collection<? extends Slot>) newValue);
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION :
-				setSpecification((ValueSpecification) newValue);
-				return;
+		case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT:
+			getDeployments().clear();
+			getDeployments().addAll((Collection<? extends Deployment>) newValue);
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__CLASSIFIER:
+			getClassifiers().clear();
+			getClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__SLOT:
+			getSlots().clear();
+			getSlots().addAll((Collection<? extends Slot>) newValue);
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION:
+			setSpecification((ValueSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -743,39 +655,39 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT :
-				getDeployments().clear();
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__CLASSIFIER :
-				getClassifiers().clear();
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__SLOT :
-				getSlots().clear();
-				return;
-			case UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION :
-				setSpecification((ValueSpecification) null);
-				return;
+		case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT:
+			getDeployments().clear();
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__CLASSIFIER:
+			getClassifiers().clear();
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__SLOT:
+			getSlots().clear();
+			return;
+		case UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION:
+			setSpecification((ValueSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -788,42 +700,40 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INSTANCE_SPECIFICATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INSTANCE_SPECIFICATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INSTANCE_SPECIFICATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.INSTANCE_SPECIFICATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INSTANCE_SPECIFICATION__NAME :
-				return isSetName();
-			case UMLPackage.INSTANCE_SPECIFICATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INSTANCE_SPECIFICATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INSTANCE_SPECIFICATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYED_ELEMENT :
-				return !getDeployedElements().isEmpty();
-			case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT :
-				return !getDeployments().isEmpty();
-			case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.INSTANCE_SPECIFICATION__CLASSIFIER :
-				return !getClassifiers().isEmpty();
-			case UMLPackage.INSTANCE_SPECIFICATION__SLOT :
-				return !getSlots().isEmpty();
-			case UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION :
-				return basicGetSpecification() != null;
+		case UMLPackage.INSTANCE_SPECIFICATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INSTANCE_SPECIFICATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INSTANCE_SPECIFICATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INSTANCE_SPECIFICATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.INSTANCE_SPECIFICATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INSTANCE_SPECIFICATION__NAME:
+			return isSetName();
+		case UMLPackage.INSTANCE_SPECIFICATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INSTANCE_SPECIFICATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INSTANCE_SPECIFICATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INSTANCE_SPECIFICATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYED_ELEMENT:
+			return !getDeployedElements().isEmpty();
+		case UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT:
+			return !getDeployments().isEmpty();
+		case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.INSTANCE_SPECIFICATION__CLASSIFIER:
+			return !getClassifiers().isEmpty();
+		case UMLPackage.INSTANCE_SPECIFICATION__SLOT:
+			return !getSlots().isEmpty();
+		case UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION:
+			return basicGetSpecification() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -838,24 +748,24 @@
 			Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-					return UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
-				case UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER :
-					return UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+				return UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
+			case UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER:
+				return UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == PackageableElement.class) {
 			switch (derivedFeatureID) {
-				default :
-					return -1;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == DeployedArtifact.class) {
 			switch (derivedFeatureID) {
-				default :
-					return -1;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -871,24 +781,24 @@
 			Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-					return UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER;
-				case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER :
-					return UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+				return UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER;
+			case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER:
+				return UMLPackage.INSTANCE_SPECIFICATION__TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == PackageableElement.class) {
 			switch (baseFeatureID) {
-				default :
-					return -1;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == DeployedArtifact.class) {
 			switch (baseFeatureID) {
-				default :
-					return -1;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -903,26 +813,26 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-					return UMLPackage.INSTANCE_SPECIFICATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT;
-				case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER :
-					return UMLPackage.INSTANCE_SPECIFICATION___IS_TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+				return UMLPackage.INSTANCE_SPECIFICATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT;
+			case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER:
+				return UMLPackage.INSTANCE_SPECIFICATION___IS_TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == PackageableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP;
-				default :
-					return -1;
+			case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == DeployedArtifact.class) {
 			switch (baseOperationID) {
-				default :
-					return -1;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -938,152 +848,126 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INSTANCE_SPECIFICATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INSTANCE_SPECIFICATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INSTANCE_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.INSTANCE_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.INSTANCE_SPECIFICATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INSTANCE_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.INSTANCE_SPECIFICATION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.INSTANCE_SPECIFICATION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.INSTANCE_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INSTANCE_SPECIFICATION___SEPARATOR :
-				return separator();
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.INSTANCE_SPECIFICATION___GET_DEPLOYED_ELEMENTS :
-				return getDeployedElements();
-			case UMLPackage.INSTANCE_SPECIFICATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.INSTANCE_SPECIFICATION___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_DEPLOYMENT_ARTIFACT__DIAGNOSTICCHAIN_MAP :
-				return validateDeploymentArtifact(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_STRUCTURAL_FEATURE__DIAGNOSTICCHAIN_MAP :
-				return validateStructuralFeature(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_DEFINING_FEATURE__DIAGNOSTICCHAIN_MAP :
-				return validateDefiningFeature(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_DEPLOYMENT_TARGET__DIAGNOSTICCHAIN_MAP :
-				return validateDeploymentTarget(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_SPECIFICATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INSTANCE_SPECIFICATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INSTANCE_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.INSTANCE_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.INSTANCE_SPECIFICATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.INSTANCE_SPECIFICATION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.INSTANCE_SPECIFICATION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.INSTANCE_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INSTANCE_SPECIFICATION___SEPARATOR:
+			return separator();
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.INSTANCE_SPECIFICATION___GET_DEPLOYED_ELEMENTS:
+			return getDeployedElements();
+		case UMLPackage.INSTANCE_SPECIFICATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.INSTANCE_SPECIFICATION___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_DEPLOYMENT_ARTIFACT__DIAGNOSTICCHAIN_MAP:
+			return validateDeploymentArtifact((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_STRUCTURAL_FEATURE__DIAGNOSTICCHAIN_MAP:
+			return validateStructuralFeature((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_DEFINING_FEATURE__DIAGNOSTICCHAIN_MAP:
+			return validateDefiningFeature((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_SPECIFICATION___VALIDATE_DEPLOYMENT_TARGET__DIAGNOSTICCHAIN_MAP:
+			return validateDeploymentTarget((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1109,8 +993,8 @@
 	 */
 	@Override
 	public boolean isSetOwner() {
-		return super.isSetOwner() || eIsSet(
-			UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER);
+		return super.isSetOwner()
+				|| eIsSet(UMLPackage.INSTANCE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER);
 	}
 
 	/**
@@ -1121,12 +1005,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.INSTANCE_SPECIFICATION__OWNED_COMMENT,
-		UMLPackage.INSTANCE_SPECIFICATION__NAME_EXPRESSION,
-		UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT,
-		UMLPackage.INSTANCE_SPECIFICATION__SLOT,
-		UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.INSTANCE_SPECIFICATION__OWNED_COMMENT, UMLPackage.INSTANCE_SPECIFICATION__NAME_EXPRESSION, UMLPackage.INSTANCE_SPECIFICATION__DEPLOYMENT, UMLPackage.INSTANCE_SPECIFICATION__SLOT,
+			UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1136,8 +1016,8 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.INSTANCE_SPECIFICATION__SLOT)
-			|| eIsSet(UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION);
+				|| eIsSet(UMLPackage.INSTANCE_SPECIFICATION__SLOT)
+				|| eIsSet(UMLPackage.INSTANCE_SPECIFICATION__SPECIFICATION);
 	}
 
 } //InstanceSpecificationImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InstanceValueImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InstanceValueImpl.java
index 1207396..7094aa7 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InstanceValueImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InstanceValueImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -16,10 +16,16 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.InstanceSpecification;
 import org.eclipse.uml2.uml.InstanceValue;
@@ -77,9 +83,7 @@
 	 * @generated
 	 */
 	public InstanceSpecification getInstance() {
-		return (InstanceSpecification) eDynamicGet(
-			UMLPackage.INSTANCE_VALUE__INSTANCE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INSTANCE_VALUE__INSTANCE, true, true);
+		return (InstanceSpecification) eDynamicGet(UMLPackage.INSTANCE_VALUE__INSTANCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INSTANCE_VALUE__INSTANCE, true, true);
 	}
 
 	/**
@@ -88,9 +92,7 @@
 	 * @generated
 	 */
 	public InstanceSpecification basicGetInstance() {
-		return (InstanceSpecification) eDynamicGet(
-			UMLPackage.INSTANCE_VALUE__INSTANCE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INSTANCE_VALUE__INSTANCE, false, true);
+		return (InstanceSpecification) eDynamicGet(UMLPackage.INSTANCE_VALUE__INSTANCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INSTANCE_VALUE__INSTANCE, false, true);
 	}
 
 	/**
@@ -99,8 +101,7 @@
 	 * @generated
 	 */
 	public void setInstance(InstanceSpecification newInstance) {
-		eDynamicSet(UMLPackage.INSTANCE_VALUE__INSTANCE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INSTANCE_VALUE__INSTANCE, newInstance);
+		eDynamicSet(UMLPackage.INSTANCE_VALUE__INSTANCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INSTANCE_VALUE__INSTANCE, newInstance);
 	}
 
 	/**
@@ -121,48 +122,48 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INSTANCE_VALUE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INSTANCE_VALUE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INSTANCE_VALUE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INSTANCE_VALUE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INSTANCE_VALUE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INSTANCE_VALUE__NAME :
-				return getName();
-			case UMLPackage.INSTANCE_VALUE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INSTANCE_VALUE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INSTANCE_VALUE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INSTANCE_VALUE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INSTANCE_VALUE__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.INSTANCE_VALUE__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.INSTANCE_VALUE__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.INSTANCE_VALUE__INSTANCE :
-				if (resolve)
-					return getInstance();
-				return basicGetInstance();
+		case UMLPackage.INSTANCE_VALUE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INSTANCE_VALUE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INSTANCE_VALUE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INSTANCE_VALUE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INSTANCE_VALUE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INSTANCE_VALUE__NAME:
+			return getName();
+		case UMLPackage.INSTANCE_VALUE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INSTANCE_VALUE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INSTANCE_VALUE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INSTANCE_VALUE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INSTANCE_VALUE__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.INSTANCE_VALUE__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.INSTANCE_VALUE__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.INSTANCE_VALUE__INSTANCE:
+			if (resolve)
+				return getInstance();
+			return basicGetInstance();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -176,37 +177,35 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INSTANCE_VALUE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INSTANCE_VALUE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INSTANCE_VALUE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INSTANCE_VALUE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INSTANCE_VALUE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INSTANCE_VALUE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INSTANCE_VALUE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INSTANCE_VALUE__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.INSTANCE_VALUE__INSTANCE :
-				setInstance((InstanceSpecification) newValue);
-				return;
+		case UMLPackage.INSTANCE_VALUE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INSTANCE_VALUE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INSTANCE_VALUE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INSTANCE_VALUE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INSTANCE_VALUE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INSTANCE_VALUE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INSTANCE_VALUE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INSTANCE_VALUE__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.INSTANCE_VALUE__INSTANCE:
+			setInstance((InstanceSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -219,33 +218,33 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INSTANCE_VALUE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INSTANCE_VALUE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INSTANCE_VALUE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INSTANCE_VALUE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INSTANCE_VALUE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INSTANCE_VALUE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INSTANCE_VALUE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INSTANCE_VALUE__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.INSTANCE_VALUE__INSTANCE :
-				setInstance((InstanceSpecification) null);
-				return;
+		case UMLPackage.INSTANCE_VALUE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INSTANCE_VALUE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INSTANCE_VALUE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INSTANCE_VALUE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INSTANCE_VALUE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INSTANCE_VALUE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INSTANCE_VALUE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INSTANCE_VALUE__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.INSTANCE_VALUE__INSTANCE:
+			setInstance((InstanceSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -258,36 +257,34 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INSTANCE_VALUE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INSTANCE_VALUE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INSTANCE_VALUE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INSTANCE_VALUE__OWNER :
-				return isSetOwner();
-			case UMLPackage.INSTANCE_VALUE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INSTANCE_VALUE__NAME :
-				return isSetName();
-			case UMLPackage.INSTANCE_VALUE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INSTANCE_VALUE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INSTANCE_VALUE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INSTANCE_VALUE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INSTANCE_VALUE__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.INSTANCE_VALUE__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.INSTANCE_VALUE__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.INSTANCE_VALUE__INSTANCE :
-				return basicGetInstance() != null;
+		case UMLPackage.INSTANCE_VALUE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INSTANCE_VALUE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INSTANCE_VALUE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INSTANCE_VALUE__OWNER:
+			return isSetOwner();
+		case UMLPackage.INSTANCE_VALUE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INSTANCE_VALUE__NAME:
+			return isSetName();
+		case UMLPackage.INSTANCE_VALUE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INSTANCE_VALUE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INSTANCE_VALUE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INSTANCE_VALUE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INSTANCE_VALUE__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.INSTANCE_VALUE__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.INSTANCE_VALUE__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.INSTANCE_VALUE__INSTANCE:
+			return basicGetInstance() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -302,148 +299,130 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.INSTANCE_VALUE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INSTANCE_VALUE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INSTANCE_VALUE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.INSTANCE_VALUE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.INSTANCE_VALUE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.INSTANCE_VALUE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.INSTANCE_VALUE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INSTANCE_VALUE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___GET_MODEL :
-				return getModel();
-			case UMLPackage.INSTANCE_VALUE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.INSTANCE_VALUE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.INSTANCE_VALUE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.INSTANCE_VALUE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.INSTANCE_VALUE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.INSTANCE_VALUE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.INSTANCE_VALUE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INSTANCE_VALUE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INSTANCE_VALUE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.INSTANCE_VALUE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.INSTANCE_VALUE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.INSTANCE_VALUE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INSTANCE_VALUE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INSTANCE_VALUE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INSTANCE_VALUE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.INSTANCE_VALUE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.INSTANCE_VALUE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.INSTANCE_VALUE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.INSTANCE_VALUE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.INSTANCE_VALUE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INSTANCE_VALUE___SEPARATOR :
-				return separator();
-			case UMLPackage.INSTANCE_VALUE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.INSTANCE_VALUE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.INSTANCE_VALUE___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.INSTANCE_VALUE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INSTANCE_VALUE___BOOLEAN_VALUE :
-				return booleanValue();
-			case UMLPackage.INSTANCE_VALUE___INTEGER_VALUE :
-				return integerValue();
-			case UMLPackage.INSTANCE_VALUE___IS_COMPUTABLE :
-				return isComputable();
-			case UMLPackage.INSTANCE_VALUE___IS_NULL :
-				return isNull();
-			case UMLPackage.INSTANCE_VALUE___REAL_VALUE :
-				return realValue();
-			case UMLPackage.INSTANCE_VALUE___STRING_VALUE :
-				return stringValue();
-			case UMLPackage.INSTANCE_VALUE___UNLIMITED_VALUE :
-				return unlimitedValue();
+		case UMLPackage.INSTANCE_VALUE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_VALUE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_VALUE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.INSTANCE_VALUE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.INSTANCE_VALUE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.INSTANCE_VALUE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.INSTANCE_VALUE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INSTANCE_VALUE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___GET_MODEL:
+			return getModel();
+		case UMLPackage.INSTANCE_VALUE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.INSTANCE_VALUE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.INSTANCE_VALUE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.INSTANCE_VALUE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.INSTANCE_VALUE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.INSTANCE_VALUE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.INSTANCE_VALUE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INSTANCE_VALUE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INSTANCE_VALUE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.INSTANCE_VALUE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.INSTANCE_VALUE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.INSTANCE_VALUE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_VALUE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_VALUE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_VALUE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.INSTANCE_VALUE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.INSTANCE_VALUE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.INSTANCE_VALUE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.INSTANCE_VALUE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.INSTANCE_VALUE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INSTANCE_VALUE___SEPARATOR:
+			return separator();
+		case UMLPackage.INSTANCE_VALUE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.INSTANCE_VALUE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.INSTANCE_VALUE___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.INSTANCE_VALUE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INSTANCE_VALUE___BOOLEAN_VALUE:
+			return booleanValue();
+		case UMLPackage.INSTANCE_VALUE___INTEGER_VALUE:
+			return integerValue();
+		case UMLPackage.INSTANCE_VALUE___IS_COMPUTABLE:
+			return isComputable();
+		case UMLPackage.INSTANCE_VALUE___IS_NULL:
+			return isNull();
+		case UMLPackage.INSTANCE_VALUE___REAL_VALUE:
+			return realValue();
+		case UMLPackage.INSTANCE_VALUE___STRING_VALUE:
+			return stringValue();
+		case UMLPackage.INSTANCE_VALUE___UNLIMITED_VALUE:
+			return unlimitedValue();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionConstraintImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionConstraintImpl.java
index 2003628..4402d8a 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionConstraintImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionConstraintImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -99,21 +102,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.INTERACTION_CONSTRAINT__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INTERACTION_CONSTRAINT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.INTERACTION_CONSTRAINT__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INTERACTION_CONSTRAINT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -122,9 +117,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getMinint() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.INTERACTION_CONSTRAINT__MININT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_CONSTRAINT__MININT, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.INTERACTION_CONSTRAINT__MININT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_CONSTRAINT__MININT, true, true);
 	}
 
 	/**
@@ -133,9 +126,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetMinint() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.INTERACTION_CONSTRAINT__MININT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_CONSTRAINT__MININT, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.INTERACTION_CONSTRAINT__MININT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_CONSTRAINT__MININT, false, true);
 	}
 
 	/**
@@ -145,8 +136,7 @@
 	 */
 	public NotificationChain basicSetMinint(ValueSpecification newMinint,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newMinint,
-			UMLPackage.INTERACTION_CONSTRAINT__MININT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newMinint, UMLPackage.INTERACTION_CONSTRAINT__MININT, msgs);
 		return msgs;
 	}
 
@@ -156,9 +146,7 @@
 	 * @generated
 	 */
 	public void setMinint(ValueSpecification newMinint) {
-		eDynamicSet(
-			UMLPackage.INTERACTION_CONSTRAINT__MININT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_CONSTRAINT__MININT, newMinint);
+		eDynamicSet(UMLPackage.INTERACTION_CONSTRAINT__MININT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_CONSTRAINT__MININT, newMinint);
 	}
 
 	/**
@@ -183,9 +171,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getMaxint() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.INTERACTION_CONSTRAINT__MAXINT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_CONSTRAINT__MAXINT, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.INTERACTION_CONSTRAINT__MAXINT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_CONSTRAINT__MAXINT, true, true);
 	}
 
 	/**
@@ -194,9 +180,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetMaxint() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.INTERACTION_CONSTRAINT__MAXINT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_CONSTRAINT__MAXINT, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.INTERACTION_CONSTRAINT__MAXINT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_CONSTRAINT__MAXINT, false, true);
 	}
 
 	/**
@@ -206,8 +190,7 @@
 	 */
 	public NotificationChain basicSetMaxint(ValueSpecification newMaxint,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newMaxint,
-			UMLPackage.INTERACTION_CONSTRAINT__MAXINT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newMaxint, UMLPackage.INTERACTION_CONSTRAINT__MAXINT, msgs);
 		return msgs;
 	}
 
@@ -217,9 +200,7 @@
 	 * @generated
 	 */
 	public void setMaxint(ValueSpecification newMaxint) {
-		eDynamicSet(
-			UMLPackage.INTERACTION_CONSTRAINT__MAXINT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_CONSTRAINT__MAXINT, newMaxint);
+		eDynamicSet(UMLPackage.INTERACTION_CONSTRAINT__MAXINT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_CONSTRAINT__MAXINT, newMaxint);
 	}
 
 	/**
@@ -245,8 +226,7 @@
 	 */
 	public boolean validateDynamicVariables(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InteractionConstraintOperations.validateDynamicVariables(this,
-			diagnostics, context);
+		return InteractionConstraintOperations.validateDynamicVariables(this, diagnostics, context);
 	}
 
 	/**
@@ -256,8 +236,7 @@
 	 */
 	public boolean validateGlobalData(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InteractionConstraintOperations.validateGlobalData(this,
-			diagnostics, context);
+		return InteractionConstraintOperations.validateGlobalData(this, diagnostics, context);
 	}
 
 	/**
@@ -267,8 +246,7 @@
 	 */
 	public boolean validateMinintMaxint(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InteractionConstraintOperations.validateMinintMaxint(this,
-			diagnostics, context);
+		return InteractionConstraintOperations.validateMinintMaxint(this, diagnostics, context);
 	}
 
 	/**
@@ -278,8 +256,7 @@
 	 */
 	public boolean validateMinintNonNegative(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InteractionConstraintOperations.validateMinintNonNegative(this,
-			diagnostics, context);
+		return InteractionConstraintOperations.validateMinintNonNegative(this, diagnostics, context);
 	}
 
 	/**
@@ -289,8 +266,7 @@
 	 */
 	public boolean validateMaxintPositive(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InteractionConstraintOperations.validateMaxintPositive(this,
-			diagnostics, context);
+		return InteractionConstraintOperations.validateMaxintPositive(this, diagnostics, context);
 	}
 
 	/**
@@ -300,8 +276,7 @@
 	 */
 	public boolean validateMaxintGreaterEqualMinint(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InteractionConstraintOperations
-			.validateMaxintGreaterEqualMinint(this, diagnostics, context);
+		return InteractionConstraintOperations.validateMaxintGreaterEqualMinint(this, diagnostics, context);
 	}
 
 	/**
@@ -313,26 +288,24 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_CONSTRAINT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION_CONSTRAINT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION_CONSTRAINT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.INTERACTION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.INTERACTION_CONSTRAINT__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.INTERACTION_CONSTRAINT__CONTEXT :
-				return basicSetContext(null, msgs);
-			case UMLPackage.INTERACTION_CONSTRAINT__SPECIFICATION :
-				return basicSetSpecification(null, msgs);
-			case UMLPackage.INTERACTION_CONSTRAINT__MAXINT :
-				return basicSetMaxint(null, msgs);
-			case UMLPackage.INTERACTION_CONSTRAINT__MININT :
-				return basicSetMinint(null, msgs);
+		case UMLPackage.INTERACTION_CONSTRAINT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_CONSTRAINT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_CONSTRAINT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.INTERACTION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.INTERACTION_CONSTRAINT__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.INTERACTION_CONSTRAINT__CONTEXT:
+			return basicSetContext(null, msgs);
+		case UMLPackage.INTERACTION_CONSTRAINT__SPECIFICATION:
+			return basicSetSpecification(null, msgs);
+		case UMLPackage.INTERACTION_CONSTRAINT__MAXINT:
+			return basicSetMaxint(null, msgs);
+		case UMLPackage.INTERACTION_CONSTRAINT__MININT:
+			return basicSetMinint(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -345,58 +318,58 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_CONSTRAINT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INTERACTION_CONSTRAINT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INTERACTION_CONSTRAINT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INTERACTION_CONSTRAINT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INTERACTION_CONSTRAINT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INTERACTION_CONSTRAINT__NAME :
-				return getName();
-			case UMLPackage.INTERACTION_CONSTRAINT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INTERACTION_CONSTRAINT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INTERACTION_CONSTRAINT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERACTION_CONSTRAINT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INTERACTION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.INTERACTION_CONSTRAINT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.INTERACTION_CONSTRAINT__CONSTRAINED_ELEMENT :
-				return getConstrainedElements();
-			case UMLPackage.INTERACTION_CONSTRAINT__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.INTERACTION_CONSTRAINT__SPECIFICATION :
-				if (resolve)
-					return getSpecification();
-				return basicGetSpecification();
-			case UMLPackage.INTERACTION_CONSTRAINT__MAXINT :
-				if (resolve)
-					return getMaxint();
-				return basicGetMaxint();
-			case UMLPackage.INTERACTION_CONSTRAINT__MININT :
-				if (resolve)
-					return getMinint();
-				return basicGetMinint();
+		case UMLPackage.INTERACTION_CONSTRAINT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INTERACTION_CONSTRAINT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INTERACTION_CONSTRAINT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INTERACTION_CONSTRAINT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INTERACTION_CONSTRAINT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INTERACTION_CONSTRAINT__NAME:
+			return getName();
+		case UMLPackage.INTERACTION_CONSTRAINT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INTERACTION_CONSTRAINT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INTERACTION_CONSTRAINT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERACTION_CONSTRAINT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INTERACTION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.INTERACTION_CONSTRAINT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.INTERACTION_CONSTRAINT__CONSTRAINED_ELEMENT:
+			return getConstrainedElements();
+		case UMLPackage.INTERACTION_CONSTRAINT__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.INTERACTION_CONSTRAINT__SPECIFICATION:
+			if (resolve)
+				return getSpecification();
+			return basicGetSpecification();
+		case UMLPackage.INTERACTION_CONSTRAINT__MAXINT:
+			if (resolve)
+				return getMaxint();
+			return basicGetMaxint();
+		case UMLPackage.INTERACTION_CONSTRAINT__MININT:
+			if (resolve)
+				return getMinint();
+			return basicGetMinint();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -410,48 +383,45 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_CONSTRAINT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__CONSTRAINED_ELEMENT :
-				getConstrainedElements().clear();
-				getConstrainedElements()
-					.addAll((Collection<? extends Element>) newValue);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__CONTEXT :
-				setContext((Namespace) newValue);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__SPECIFICATION :
-				setSpecification((ValueSpecification) newValue);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__MAXINT :
-				setMaxint((ValueSpecification) newValue);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__MININT :
-				setMinint((ValueSpecification) newValue);
-				return;
+		case UMLPackage.INTERACTION_CONSTRAINT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__CONSTRAINED_ELEMENT:
+			getConstrainedElements().clear();
+			getConstrainedElements().addAll((Collection<? extends Element>) newValue);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__CONTEXT:
+			setContext((Namespace) newValue);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__SPECIFICATION:
+			setSpecification((ValueSpecification) newValue);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__MAXINT:
+			setMaxint((ValueSpecification) newValue);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__MININT:
+			setMinint((ValueSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -464,42 +434,42 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_CONSTRAINT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__CONSTRAINED_ELEMENT :
-				getConstrainedElements().clear();
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__CONTEXT :
-				setContext((Namespace) null);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__SPECIFICATION :
-				setSpecification((ValueSpecification) null);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__MAXINT :
-				setMaxint((ValueSpecification) null);
-				return;
-			case UMLPackage.INTERACTION_CONSTRAINT__MININT :
-				setMinint((ValueSpecification) null);
-				return;
+		case UMLPackage.INTERACTION_CONSTRAINT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__CONSTRAINED_ELEMENT:
+			getConstrainedElements().clear();
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__CONTEXT:
+			setContext((Namespace) null);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__SPECIFICATION:
+			setSpecification((ValueSpecification) null);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__MAXINT:
+			setMaxint((ValueSpecification) null);
+			return;
+		case UMLPackage.INTERACTION_CONSTRAINT__MININT:
+			setMinint((ValueSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -512,42 +482,40 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_CONSTRAINT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INTERACTION_CONSTRAINT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INTERACTION_CONSTRAINT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INTERACTION_CONSTRAINT__OWNER :
-				return isSetOwner();
-			case UMLPackage.INTERACTION_CONSTRAINT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INTERACTION_CONSTRAINT__NAME :
-				return isSetName();
-			case UMLPackage.INTERACTION_CONSTRAINT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INTERACTION_CONSTRAINT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INTERACTION_CONSTRAINT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INTERACTION_CONSTRAINT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INTERACTION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.INTERACTION_CONSTRAINT__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.INTERACTION_CONSTRAINT__CONSTRAINED_ELEMENT :
-				return !getConstrainedElements().isEmpty();
-			case UMLPackage.INTERACTION_CONSTRAINT__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.INTERACTION_CONSTRAINT__SPECIFICATION :
-				return basicGetSpecification() != null;
-			case UMLPackage.INTERACTION_CONSTRAINT__MAXINT :
-				return basicGetMaxint() != null;
-			case UMLPackage.INTERACTION_CONSTRAINT__MININT :
-				return basicGetMinint() != null;
+		case UMLPackage.INTERACTION_CONSTRAINT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INTERACTION_CONSTRAINT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INTERACTION_CONSTRAINT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INTERACTION_CONSTRAINT__OWNER:
+			return isSetOwner();
+		case UMLPackage.INTERACTION_CONSTRAINT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INTERACTION_CONSTRAINT__NAME:
+			return isSetName();
+		case UMLPackage.INTERACTION_CONSTRAINT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INTERACTION_CONSTRAINT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INTERACTION_CONSTRAINT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INTERACTION_CONSTRAINT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INTERACTION_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.INTERACTION_CONSTRAINT__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.INTERACTION_CONSTRAINT__CONSTRAINED_ELEMENT:
+			return !getConstrainedElements().isEmpty();
+		case UMLPackage.INTERACTION_CONSTRAINT__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.INTERACTION_CONSTRAINT__SPECIFICATION:
+			return basicGetSpecification() != null;
+		case UMLPackage.INTERACTION_CONSTRAINT__MAXINT:
+			return basicGetMaxint() != null;
+		case UMLPackage.INTERACTION_CONSTRAINT__MININT:
+			return basicGetMinint() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -562,166 +530,134 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_MODEL :
-				return getModel();
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.INTERACTION_CONSTRAINT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.INTERACTION_CONSTRAINT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_LABEL :
-				return getLabel();
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.INTERACTION_CONSTRAINT___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.INTERACTION_CONSTRAINT___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.INTERACTION_CONSTRAINT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERACTION_CONSTRAINT___SEPARATOR :
-				return separator();
-			case UMLPackage.INTERACTION_CONSTRAINT___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.INTERACTION_CONSTRAINT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.INTERACTION_CONSTRAINT___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_BOOLEAN_VALUE__DIAGNOSTICCHAIN_MAP :
-				return validateBooleanValue((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateNoSideEffects((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_NOT_APPLY_TO_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotApplyToSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_MININT_MAXINT__DIAGNOSTICCHAIN_MAP :
-				return validateMinintMaxint((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_MININT_NON_NEGATIVE__DIAGNOSTICCHAIN_MAP :
-				return validateMinintNonNegative(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_MAXINT_POSITIVE__DIAGNOSTICCHAIN_MAP :
-				return validateMaxintPositive(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_DYNAMIC_VARIABLES__DIAGNOSTICCHAIN_MAP :
-				return validateDynamicVariables(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_GLOBAL_DATA__DIAGNOSTICCHAIN_MAP :
-				return validateGlobalData((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_MAXINT_GREATER_EQUAL_MININT__DIAGNOSTICCHAIN_MAP :
-				return validateMaxintGreaterEqualMinint(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_MODEL:
+			return getModel();
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.INTERACTION_CONSTRAINT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.INTERACTION_CONSTRAINT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_LABEL:
+			return getLabel();
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.INTERACTION_CONSTRAINT___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.INTERACTION_CONSTRAINT___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.INTERACTION_CONSTRAINT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERACTION_CONSTRAINT___SEPARATOR:
+			return separator();
+		case UMLPackage.INTERACTION_CONSTRAINT___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.INTERACTION_CONSTRAINT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.INTERACTION_CONSTRAINT___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_BOOLEAN_VALUE__DIAGNOSTICCHAIN_MAP:
+			return validateBooleanValue((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_NOT_APPLY_TO_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotApplyToSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_MININT_MAXINT__DIAGNOSTICCHAIN_MAP:
+			return validateMinintMaxint((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_MININT_NON_NEGATIVE__DIAGNOSTICCHAIN_MAP:
+			return validateMinintNonNegative((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_MAXINT_POSITIVE__DIAGNOSTICCHAIN_MAP:
+			return validateMaxintPositive((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_DYNAMIC_VARIABLES__DIAGNOSTICCHAIN_MAP:
+			return validateDynamicVariables((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_GLOBAL_DATA__DIAGNOSTICCHAIN_MAP:
+			return validateGlobalData((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_CONSTRAINT___VALIDATE_MAXINT_GREATER_EQUAL_MININT__DIAGNOSTICCHAIN_MAP:
+			return validateMaxintGreaterEqualMinint((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -734,12 +670,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.INTERACTION_CONSTRAINT__OWNED_COMMENT,
-		UMLPackage.INTERACTION_CONSTRAINT__NAME_EXPRESSION,
-		UMLPackage.INTERACTION_CONSTRAINT__SPECIFICATION,
-		UMLPackage.INTERACTION_CONSTRAINT__MAXINT,
-		UMLPackage.INTERACTION_CONSTRAINT__MININT};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.INTERACTION_CONSTRAINT__OWNED_COMMENT, UMLPackage.INTERACTION_CONSTRAINT__NAME_EXPRESSION, UMLPackage.INTERACTION_CONSTRAINT__SPECIFICATION,
+			UMLPackage.INTERACTION_CONSTRAINT__MAXINT, UMLPackage.INTERACTION_CONSTRAINT__MININT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -749,8 +681,8 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.INTERACTION_CONSTRAINT__MAXINT)
-			|| eIsSet(UMLPackage.INTERACTION_CONSTRAINT__MININT);
+				|| eIsSet(UMLPackage.INTERACTION_CONSTRAINT__MAXINT)
+				|| eIsSet(UMLPackage.INTERACTION_CONSTRAINT__MININT);
 	}
 
 } //InteractionConstraintImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionFragmentImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionFragmentImpl.java
index bb1fa96..e3856f8 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionFragmentImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionFragmentImpl.java
@@ -1,18 +1,20 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -21,8 +23,13 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -92,21 +99,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.INTERACTION_FRAGMENT__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INTERACTION_FRAGMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.INTERACTION_FRAGMENT__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INTERACTION_FRAGMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -116,9 +115,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Lifeline> getCovereds() {
-		return (EList<Lifeline>) eDynamicGet(
-			UMLPackage.INTERACTION_FRAGMENT__COVERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__COVERED, true, true);
+		return (EList<Lifeline>) eDynamicGet(UMLPackage.INTERACTION_FRAGMENT__COVERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__COVERED, true, true);
 	}
 
 	/**
@@ -136,10 +133,8 @@
 	 * @generated
 	 */
 	public Lifeline getCovered(String name, boolean ignoreCase) {
-		coveredLoop : for (Lifeline covered : getCovereds()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(covered.getName())
-				: name.equals(covered.getName())))
+		coveredLoop: for (Lifeline covered : getCovereds()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(covered.getName()) : name.equals(covered.getName())))
 				continue coveredLoop;
 			return covered;
 		}
@@ -153,11 +148,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<GeneralOrdering> getGeneralOrderings() {
-		return (EList<GeneralOrdering>) eDynamicGet(
-			UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__GENERAL_ORDERING, true,
-			true);
+		return (EList<GeneralOrdering>) eDynamicGet(UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__GENERAL_ORDERING, true, true);
 	}
 
 	/**
@@ -166,8 +157,7 @@
 	 * @generated
 	 */
 	public GeneralOrdering createGeneralOrdering(String name) {
-		GeneralOrdering newGeneralOrdering = (GeneralOrdering) create(
-			UMLPackage.Literals.GENERAL_ORDERING);
+		GeneralOrdering newGeneralOrdering = (GeneralOrdering) create(UMLPackage.Literals.GENERAL_ORDERING);
 		getGeneralOrderings().add(newGeneralOrdering);
 		if (name != null)
 			newGeneralOrdering.setName(name);
@@ -190,16 +180,12 @@
 	 */
 	public GeneralOrdering getGeneralOrdering(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		generalOrderingLoop : for (GeneralOrdering generalOrdering : getGeneralOrderings()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(generalOrdering.getName())
-				: name.equals(generalOrdering.getName())))
+		generalOrderingLoop: for (GeneralOrdering generalOrdering : getGeneralOrderings()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(generalOrdering.getName()) : name.equals(generalOrdering.getName())))
 				continue generalOrderingLoop;
 			return generalOrdering;
 		}
-		return createOnDemand
-			? createGeneralOrdering(name)
-			: null;
+		return createOnDemand ? createGeneralOrdering(name) : null;
 	}
 
 	/**
@@ -208,11 +194,7 @@
 	 * @generated
 	 */
 	public Interaction getEnclosingInteraction() {
-		return (Interaction) eDynamicGet(
-			UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION,
-			true, true);
+		return (Interaction) eDynamicGet(UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION, true, true);
 	}
 
 	/**
@@ -221,11 +203,7 @@
 	 * @generated
 	 */
 	public Interaction basicGetEnclosingInteraction() {
-		return (Interaction) eDynamicGet(
-			UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION,
-			false, true);
+		return (Interaction) eDynamicGet(UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION, false, true);
 	}
 
 	/**
@@ -235,8 +213,7 @@
 	 */
 	public NotificationChain basicSetEnclosingInteraction(
 			Interaction newEnclosingInteraction, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newEnclosingInteraction,
-			UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newEnclosingInteraction, UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION, msgs);
 		return msgs;
 	}
 
@@ -246,11 +223,7 @@
 	 * @generated
 	 */
 	public void setEnclosingInteraction(Interaction newEnclosingInteraction) {
-		eDynamicSet(
-			UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION,
-			newEnclosingInteraction);
+		eDynamicSet(UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION, newEnclosingInteraction);
 	}
 
 	/**
@@ -259,11 +232,7 @@
 	 * @generated
 	 */
 	public InteractionOperand getEnclosingOperand() {
-		return (InteractionOperand) eDynamicGet(
-			UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, true,
-			true);
+		return (InteractionOperand) eDynamicGet(UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, true, true);
 	}
 
 	/**
@@ -272,11 +241,7 @@
 	 * @generated
 	 */
 	public InteractionOperand basicGetEnclosingOperand() {
-		return (InteractionOperand) eDynamicGet(
-			UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, false,
-			true);
+		return (InteractionOperand) eDynamicGet(UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, false, true);
 	}
 
 	/**
@@ -286,8 +251,7 @@
 	 */
 	public NotificationChain basicSetEnclosingOperand(
 			InteractionOperand newEnclosingOperand, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newEnclosingOperand,
-			UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newEnclosingOperand, UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, msgs);
 		return msgs;
 	}
 
@@ -297,11 +261,7 @@
 	 * @generated
 	 */
 	public void setEnclosingOperand(InteractionOperand newEnclosingOperand) {
-		eDynamicSet(
-			UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND,
-			newEnclosingOperand);
+		eDynamicSet(UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, newEnclosingOperand);
 	}
 
 	/**
@@ -314,22 +274,18 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION_FRAGMENT__COVERED :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getCovereds())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetEnclosingOperand((InteractionOperand) otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetEnclosingInteraction((Interaction) otherEnd,
-					msgs);
+		case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION_FRAGMENT__COVERED:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getCovereds()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetEnclosingOperand((InteractionOperand) otherEnd, msgs);
+		case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetEnclosingInteraction((Interaction) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -343,24 +299,20 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION_FRAGMENT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION_FRAGMENT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.INTERACTION_FRAGMENT__COVERED :
-				return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND :
-				return basicSetEnclosingOperand(null, msgs);
-			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION :
-				return basicSetEnclosingInteraction(null, msgs);
-			case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING :
-				return ((InternalEList<?>) getGeneralOrderings())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_FRAGMENT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_FRAGMENT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.INTERACTION_FRAGMENT__COVERED:
+			return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND:
+			return basicSetEnclosingOperand(null, msgs);
+		case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION:
+			return basicSetEnclosingInteraction(null, msgs);
+		case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING:
+			return ((InternalEList<?>) getGeneralOrderings()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -374,13 +326,10 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.INTERACTION_OPERAND__FRAGMENT,
-					InteractionOperand.class, msgs);
-			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.INTERACTION__FRAGMENT, Interaction.class, msgs);
+		case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.INTERACTION_OPERAND__FRAGMENT, InteractionOperand.class, msgs);
+		case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.INTERACTION__FRAGMENT, Interaction.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -393,44 +342,44 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INTERACTION_FRAGMENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INTERACTION_FRAGMENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INTERACTION_FRAGMENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INTERACTION_FRAGMENT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INTERACTION_FRAGMENT__NAME :
-				return getName();
-			case UMLPackage.INTERACTION_FRAGMENT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INTERACTION_FRAGMENT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INTERACTION_FRAGMENT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERACTION_FRAGMENT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INTERACTION_FRAGMENT__COVERED :
-				return getCovereds();
-			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND :
-				if (resolve)
-					return getEnclosingOperand();
-				return basicGetEnclosingOperand();
-			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION :
-				if (resolve)
-					return getEnclosingInteraction();
-				return basicGetEnclosingInteraction();
-			case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING :
-				return getGeneralOrderings();
+		case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INTERACTION_FRAGMENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INTERACTION_FRAGMENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INTERACTION_FRAGMENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INTERACTION_FRAGMENT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INTERACTION_FRAGMENT__NAME:
+			return getName();
+		case UMLPackage.INTERACTION_FRAGMENT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INTERACTION_FRAGMENT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INTERACTION_FRAGMENT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERACTION_FRAGMENT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INTERACTION_FRAGMENT__COVERED:
+			return getCovereds();
+		case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND:
+			if (resolve)
+				return getEnclosingOperand();
+			return basicGetEnclosingOperand();
+		case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION:
+			if (resolve)
+				return getEnclosingInteraction();
+			return basicGetEnclosingInteraction();
+		case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING:
+			return getGeneralOrderings();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -444,40 +393,37 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__COVERED :
-				getCovereds().clear();
-				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) newValue);
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				getGeneralOrderings()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
+		case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__COVERED:
+			getCovereds().clear();
+			getCovereds().addAll((Collection<? extends Lifeline>) newValue);
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) newValue);
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			getGeneralOrderings().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -490,33 +436,33 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__COVERED :
-				getCovereds().clear();
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) null);
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) null);
-				return;
-			case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				return;
+		case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__COVERED:
+			getCovereds().clear();
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) null);
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) null);
+			return;
+		case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -529,36 +475,34 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INTERACTION_FRAGMENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INTERACTION_FRAGMENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INTERACTION_FRAGMENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.INTERACTION_FRAGMENT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INTERACTION_FRAGMENT__NAME :
-				return isSetName();
-			case UMLPackage.INTERACTION_FRAGMENT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INTERACTION_FRAGMENT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INTERACTION_FRAGMENT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INTERACTION_FRAGMENT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INTERACTION_FRAGMENT__COVERED :
-				return !getCovereds().isEmpty();
-			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND :
-				return basicGetEnclosingOperand() != null;
-			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION :
-				return basicGetEnclosingInteraction() != null;
-			case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING :
-				return !getGeneralOrderings().isEmpty();
+		case UMLPackage.INTERACTION_FRAGMENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INTERACTION_FRAGMENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INTERACTION_FRAGMENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INTERACTION_FRAGMENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.INTERACTION_FRAGMENT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INTERACTION_FRAGMENT__NAME:
+			return isSetName();
+		case UMLPackage.INTERACTION_FRAGMENT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INTERACTION_FRAGMENT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INTERACTION_FRAGMENT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INTERACTION_FRAGMENT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INTERACTION_FRAGMENT__COVERED:
+			return !getCovereds().isEmpty();
+		case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND:
+			return basicGetEnclosingOperand() != null;
+		case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION:
+			return basicGetEnclosingInteraction() != null;
+		case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING:
+			return !getGeneralOrderings().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -571,10 +515,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.INTERACTION_FRAGMENT__OWNED_COMMENT,
-		UMLPackage.INTERACTION_FRAGMENT__NAME_EXPRESSION,
-		UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.INTERACTION_FRAGMENT__OWNED_COMMENT, UMLPackage.INTERACTION_FRAGMENT__NAME_EXPRESSION, UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -584,9 +525,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -597,7 +536,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING);
+				|| eIsSet(UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING);
 	}
 
 	/**
@@ -626,8 +565,8 @@
 	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
-			|| eIsSet(UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND)
-			|| eIsSet(UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION);
+				|| eIsSet(UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND)
+				|| eIsSet(UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION);
 	}
 
 } //InteractionFragmentImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionImpl.java
index f8b5718..ed84dc9 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionImpl.java
@@ -1,13 +1,14 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -15,6 +16,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -24,8 +26,14 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -133,20 +141,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.INTERACTION__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INTERACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.INTERACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INTERACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -156,9 +157,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Lifeline> getCovereds() {
-		return (EList<Lifeline>) eDynamicGet(
-			UMLPackage.INTERACTION__COVERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__COVERED, true, true);
+		return (EList<Lifeline>) eDynamicGet(UMLPackage.INTERACTION__COVERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__COVERED, true, true);
 	}
 
 	/**
@@ -176,10 +175,8 @@
 	 * @generated
 	 */
 	public Lifeline getCovered(String name, boolean ignoreCase) {
-		coveredLoop : for (Lifeline covered : getCovereds()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(covered.getName())
-				: name.equals(covered.getName())))
+		coveredLoop: for (Lifeline covered : getCovereds()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(covered.getName()) : name.equals(covered.getName())))
 				continue coveredLoop;
 			return covered;
 		}
@@ -193,10 +190,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<GeneralOrdering> getGeneralOrderings() {
-		return (EList<GeneralOrdering>) eDynamicGet(
-			UMLPackage.INTERACTION__GENERAL_ORDERING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__GENERAL_ORDERING, true,
-			true);
+		return (EList<GeneralOrdering>) eDynamicGet(UMLPackage.INTERACTION__GENERAL_ORDERING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__GENERAL_ORDERING, true, true);
 	}
 
 	/**
@@ -205,8 +199,7 @@
 	 * @generated
 	 */
 	public GeneralOrdering createGeneralOrdering(String name) {
-		GeneralOrdering newGeneralOrdering = (GeneralOrdering) create(
-			UMLPackage.Literals.GENERAL_ORDERING);
+		GeneralOrdering newGeneralOrdering = (GeneralOrdering) create(UMLPackage.Literals.GENERAL_ORDERING);
 		getGeneralOrderings().add(newGeneralOrdering);
 		if (name != null)
 			newGeneralOrdering.setName(name);
@@ -229,16 +222,12 @@
 	 */
 	public GeneralOrdering getGeneralOrdering(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		generalOrderingLoop : for (GeneralOrdering generalOrdering : getGeneralOrderings()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(generalOrdering.getName())
-				: name.equals(generalOrdering.getName())))
+		generalOrderingLoop: for (GeneralOrdering generalOrdering : getGeneralOrderings()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(generalOrdering.getName()) : name.equals(generalOrdering.getName())))
 				continue generalOrderingLoop;
 			return generalOrdering;
 		}
-		return createOnDemand
-			? createGeneralOrdering(name)
-			: null;
+		return createOnDemand ? createGeneralOrdering(name) : null;
 	}
 
 	/**
@@ -247,11 +236,7 @@
 	 * @generated
 	 */
 	public Interaction getEnclosingInteraction() {
-		return (Interaction) eDynamicGet(
-			UMLPackage.INTERACTION__ENCLOSING_INTERACTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION,
-			true, true);
+		return (Interaction) eDynamicGet(UMLPackage.INTERACTION__ENCLOSING_INTERACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION, true, true);
 	}
 
 	/**
@@ -260,11 +245,7 @@
 	 * @generated
 	 */
 	public Interaction basicGetEnclosingInteraction() {
-		return (Interaction) eDynamicGet(
-			UMLPackage.INTERACTION__ENCLOSING_INTERACTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION,
-			false, true);
+		return (Interaction) eDynamicGet(UMLPackage.INTERACTION__ENCLOSING_INTERACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION, false, true);
 	}
 
 	/**
@@ -274,8 +255,7 @@
 	 */
 	public NotificationChain basicSetEnclosingInteraction(
 			Interaction newEnclosingInteraction, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newEnclosingInteraction,
-			UMLPackage.INTERACTION__ENCLOSING_INTERACTION, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newEnclosingInteraction, UMLPackage.INTERACTION__ENCLOSING_INTERACTION, msgs);
 		return msgs;
 	}
 
@@ -285,11 +265,7 @@
 	 * @generated
 	 */
 	public void setEnclosingInteraction(Interaction newEnclosingInteraction) {
-		eDynamicSet(
-			UMLPackage.INTERACTION__ENCLOSING_INTERACTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION,
-			newEnclosingInteraction);
+		eDynamicSet(UMLPackage.INTERACTION__ENCLOSING_INTERACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION, newEnclosingInteraction);
 	}
 
 	/**
@@ -298,10 +274,7 @@
 	 * @generated
 	 */
 	public InteractionOperand getEnclosingOperand() {
-		return (InteractionOperand) eDynamicGet(
-			UMLPackage.INTERACTION__ENCLOSING_OPERAND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, true,
-			true);
+		return (InteractionOperand) eDynamicGet(UMLPackage.INTERACTION__ENCLOSING_OPERAND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, true, true);
 	}
 
 	/**
@@ -310,10 +283,7 @@
 	 * @generated
 	 */
 	public InteractionOperand basicGetEnclosingOperand() {
-		return (InteractionOperand) eDynamicGet(
-			UMLPackage.INTERACTION__ENCLOSING_OPERAND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, false,
-			true);
+		return (InteractionOperand) eDynamicGet(UMLPackage.INTERACTION__ENCLOSING_OPERAND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, false, true);
 	}
 
 	/**
@@ -323,8 +293,7 @@
 	 */
 	public NotificationChain basicSetEnclosingOperand(
 			InteractionOperand newEnclosingOperand, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newEnclosingOperand,
-			UMLPackage.INTERACTION__ENCLOSING_OPERAND, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newEnclosingOperand, UMLPackage.INTERACTION__ENCLOSING_OPERAND, msgs);
 		return msgs;
 	}
 
@@ -334,10 +303,7 @@
 	 * @generated
 	 */
 	public void setEnclosingOperand(InteractionOperand newEnclosingOperand) {
-		eDynamicSet(
-			UMLPackage.INTERACTION__ENCLOSING_OPERAND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND,
-			newEnclosingOperand);
+		eDynamicSet(UMLPackage.INTERACTION__ENCLOSING_OPERAND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, newEnclosingOperand);
 	}
 
 	/**
@@ -351,20 +317,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.INTERACTION__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.INTERACTION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.INTERACTION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.INTERACTION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -374,9 +333,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Lifeline> getLifelines() {
-		return (EList<Lifeline>) eDynamicGet(
-			UMLPackage.INTERACTION__LIFELINE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION__LIFELINE, true, true);
+		return (EList<Lifeline>) eDynamicGet(UMLPackage.INTERACTION__LIFELINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION__LIFELINE, true, true);
 	}
 
 	/**
@@ -408,16 +365,12 @@
 	 */
 	public Lifeline getLifeline(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		lifelineLoop : for (Lifeline lifeline : getLifelines()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(lifeline.getName())
-				: name.equals(lifeline.getName())))
+		lifelineLoop: for (Lifeline lifeline : getLifelines()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(lifeline.getName()) : name.equals(lifeline.getName())))
 				continue lifelineLoop;
 			return lifeline;
 		}
-		return createOnDemand
-			? createLifeline(name)
-			: null;
+		return createOnDemand ? createLifeline(name) : null;
 	}
 
 	/**
@@ -427,9 +380,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<InteractionFragment> getFragments() {
-		return (EList<InteractionFragment>) eDynamicGet(
-			UMLPackage.INTERACTION__FRAGMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION__FRAGMENT, true, true);
+		return (EList<InteractionFragment>) eDynamicGet(UMLPackage.INTERACTION__FRAGMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION__FRAGMENT, true, true);
 	}
 
 	/**
@@ -461,18 +412,14 @@
 	 */
 	public InteractionFragment getFragment(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		fragmentLoop : for (InteractionFragment fragment : getFragments()) {
+		fragmentLoop: for (InteractionFragment fragment : getFragments()) {
 			if (eClass != null && !eClass.isInstance(fragment))
 				continue fragmentLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(fragment.getName())
-				: name.equals(fragment.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(fragment.getName()) : name.equals(fragment.getName())))
 				continue fragmentLoop;
 			return fragment;
 		}
-		return createOnDemand && eClass != null
-			? createFragment(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createFragment(name, eClass) : null;
 	}
 
 	/**
@@ -482,9 +429,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Action> getActions() {
-		return (EList<Action>) eDynamicGet(
-			UMLPackage.INTERACTION__ACTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION__ACTION, true, true);
+		return (EList<Action>) eDynamicGet(UMLPackage.INTERACTION__ACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION__ACTION, true, true);
 	}
 
 	/**
@@ -516,18 +461,14 @@
 	 */
 	public Action getAction(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		actionLoop : for (Action action : getActions()) {
+		actionLoop: for (Action action : getActions()) {
 			if (eClass != null && !eClass.isInstance(action))
 				continue actionLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(action.getName())
-				: name.equals(action.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(action.getName()) : name.equals(action.getName())))
 				continue actionLoop;
 			return action;
 		}
-		return createOnDemand && eClass != null
-			? createAction(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createAction(name, eClass) : null;
 	}
 
 	/**
@@ -537,9 +478,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Gate> getFormalGates() {
-		return (EList<Gate>) eDynamicGet(
-			UMLPackage.INTERACTION__FORMAL_GATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION__FORMAL_GATE, true, true);
+		return (EList<Gate>) eDynamicGet(UMLPackage.INTERACTION__FORMAL_GATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION__FORMAL_GATE, true, true);
 	}
 
 	/**
@@ -571,16 +510,12 @@
 	 */
 	public Gate getFormalGate(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		formalGateLoop : for (Gate formalGate : getFormalGates()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(formalGate.getName())
-				: name.equals(formalGate.getName())))
+		formalGateLoop: for (Gate formalGate : getFormalGates()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(formalGate.getName()) : name.equals(formalGate.getName())))
 				continue formalGateLoop;
 			return formalGate;
 		}
-		return createOnDemand
-			? createFormalGate(name)
-			: null;
+		return createOnDemand ? createFormalGate(name) : null;
 	}
 
 	/**
@@ -590,9 +525,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Message> getMessages() {
-		return (EList<Message>) eDynamicGet(
-			UMLPackage.INTERACTION__MESSAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION__MESSAGE, true, true);
+		return (EList<Message>) eDynamicGet(UMLPackage.INTERACTION__MESSAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION__MESSAGE, true, true);
 	}
 
 	/**
@@ -624,16 +557,12 @@
 	 */
 	public Message getMessage(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		messageLoop : for (Message message : getMessages()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(message.getName())
-				: name.equals(message.getName())))
+		messageLoop: for (Message message : getMessages()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(message.getName()) : name.equals(message.getName())))
 				continue messageLoop;
 			return message;
 		}
-		return createOnDemand
-			? createMessage(name)
-			: null;
+		return createOnDemand ? createMessage(name) : null;
 	}
 
 	/**
@@ -643,8 +572,7 @@
 	 */
 	public boolean validateNotContained(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InteractionOperations.validateNotContained(this, diagnostics,
-			context);
+		return InteractionOperations.validateNotContained(this, diagnostics, context);
 	}
 
 	/**
@@ -657,92 +585,63 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.INTERACTION__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.INTERACTION__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION__INTERFACE_REALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION__OWNED_OPERATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION__SPECIFICATION :
-				BehavioralFeature specification = basicGetSpecification();
-				if (specification != null)
-					msgs = ((InternalEObject) specification).eInverseRemove(
-						this, UMLPackage.BEHAVIORAL_FEATURE__METHOD,
-						BehavioralFeature.class, msgs);
-				return basicSetSpecification((BehavioralFeature) otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION__COVERED :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getCovereds())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION__ENCLOSING_OPERAND :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetEnclosingOperand((InteractionOperand) otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION__ENCLOSING_INTERACTION :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetEnclosingInteraction((Interaction) otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION__LIFELINE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getLifelines())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION__FRAGMENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getFragments())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION__MESSAGE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getMessages())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.INTERACTION__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.INTERACTION__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.INTERACTION__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION__INTERFACE_REALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION__OWNED_OPERATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION__SPECIFICATION:
+			BehavioralFeature specification = basicGetSpecification();
+			if (specification != null)
+				msgs = ((InternalEObject) specification).eInverseRemove(this, UMLPackage.BEHAVIORAL_FEATURE__METHOD, BehavioralFeature.class, msgs);
+			return basicSetSpecification((BehavioralFeature) otherEnd, msgs);
+		case UMLPackage.INTERACTION__COVERED:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getCovereds()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION__ENCLOSING_OPERAND:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetEnclosingOperand((InteractionOperand) otherEnd, msgs);
+		case UMLPackage.INTERACTION__ENCLOSING_INTERACTION:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetEnclosingInteraction((Interaction) otherEnd, msgs);
+		case UMLPackage.INTERACTION__LIFELINE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getLifelines()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION__FRAGMENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getFragments()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION__MESSAGE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getMessages()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -756,104 +655,76 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.INTERACTION__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.INTERACTION__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__OWNED_CONNECTOR :
-				return ((InternalEList<?>) getOwnedConnectors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__INTERFACE_REALIZATION :
-				return ((InternalEList<?>) getInterfaceRealizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__OWNED_BEHAVIOR :
-				return ((InternalEList<?>) getOwnedBehaviors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__OWNED_OPERATION :
-				return ((InternalEList<?>) getOwnedOperations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__NESTED_CLASSIFIER :
-				return ((InternalEList<?>) getNestedClassifiers())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__OWNED_RECEPTION :
-				return ((InternalEList<?>) getOwnedReceptions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__SPECIFICATION :
-				return basicSetSpecification(null, msgs);
-			case UMLPackage.INTERACTION__OWNED_PARAMETER :
-				return ((InternalEList<?>) getOwnedParameters())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__OWNED_PARAMETER_SET :
-				return ((InternalEList<?>) getOwnedParameterSets())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__COVERED :
-				return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION__ENCLOSING_OPERAND :
-				return basicSetEnclosingOperand(null, msgs);
-			case UMLPackage.INTERACTION__ENCLOSING_INTERACTION :
-				return basicSetEnclosingInteraction(null, msgs);
-			case UMLPackage.INTERACTION__GENERAL_ORDERING :
-				return ((InternalEList<?>) getGeneralOrderings())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__LIFELINE :
-				return ((InternalEList<?>) getLifelines()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION__FRAGMENT :
-				return ((InternalEList<?>) getFragments()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION__ACTION :
-				return ((InternalEList<?>) getActions()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION__FORMAL_GATE :
-				return ((InternalEList<?>) getFormalGates())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION__MESSAGE :
-				return ((InternalEList<?>) getMessages()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.INTERACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.INTERACTION__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.INTERACTION__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__OWNED_CONNECTOR:
+			return ((InternalEList<?>) getOwnedConnectors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__INTERFACE_REALIZATION:
+			return ((InternalEList<?>) getInterfaceRealizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__OWNED_BEHAVIOR:
+			return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__OWNED_OPERATION:
+			return ((InternalEList<?>) getOwnedOperations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__NESTED_CLASSIFIER:
+			return ((InternalEList<?>) getNestedClassifiers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__OWNED_RECEPTION:
+			return ((InternalEList<?>) getOwnedReceptions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__SPECIFICATION:
+			return basicSetSpecification(null, msgs);
+		case UMLPackage.INTERACTION__OWNED_PARAMETER:
+			return ((InternalEList<?>) getOwnedParameters()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__OWNED_PARAMETER_SET:
+			return ((InternalEList<?>) getOwnedParameterSets()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__COVERED:
+			return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__ENCLOSING_OPERAND:
+			return basicSetEnclosingOperand(null, msgs);
+		case UMLPackage.INTERACTION__ENCLOSING_INTERACTION:
+			return basicSetEnclosingInteraction(null, msgs);
+		case UMLPackage.INTERACTION__GENERAL_ORDERING:
+			return ((InternalEList<?>) getGeneralOrderings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__LIFELINE:
+			return ((InternalEList<?>) getLifelines()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__FRAGMENT:
+			return ((InternalEList<?>) getFragments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__ACTION:
+			return ((InternalEList<?>) getActions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__FORMAL_GATE:
+			return ((InternalEList<?>) getFormalGates()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION__MESSAGE:
+			return ((InternalEList<?>) getMessages()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -867,17 +738,12 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.INTERACTION__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
-			case UMLPackage.INTERACTION__ENCLOSING_OPERAND :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.INTERACTION_OPERAND__FRAGMENT,
-					InteractionOperand.class, msgs);
-			case UMLPackage.INTERACTION__ENCLOSING_INTERACTION :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.INTERACTION__FRAGMENT, Interaction.class, msgs);
+		case UMLPackage.INTERACTION__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+		case UMLPackage.INTERACTION__ENCLOSING_OPERAND:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.INTERACTION_OPERAND__FRAGMENT, InteractionOperand.class, msgs);
+		case UMLPackage.INTERACTION__ENCLOSING_INTERACTION:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.INTERACTION__FRAGMENT, Interaction.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -890,170 +756,170 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INTERACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INTERACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INTERACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INTERACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INTERACTION__NAME :
-				return getName();
-			case UMLPackage.INTERACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INTERACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INTERACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INTERACTION__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.INTERACTION__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.INTERACTION__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.INTERACTION__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.INTERACTION__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.INTERACTION__MEMBER :
-				return getMembers();
-			case UMLPackage.INTERACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.INTERACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.INTERACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.INTERACTION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.INTERACTION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.INTERACTION__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.INTERACTION__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.INTERACTION__FEATURE :
-				return getFeatures();
-			case UMLPackage.INTERACTION__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.INTERACTION__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.INTERACTION__GENERAL :
-				return getGenerals();
-			case UMLPackage.INTERACTION__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.INTERACTION__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.INTERACTION__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.INTERACTION__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.INTERACTION__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.INTERACTION__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.INTERACTION__USE_CASE :
-				return getUseCases();
-			case UMLPackage.INTERACTION__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.INTERACTION__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.INTERACTION__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.INTERACTION__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.INTERACTION__OWNED_CONNECTOR :
-				return getOwnedConnectors();
-			case UMLPackage.INTERACTION__PART :
-				return getParts();
-			case UMLPackage.INTERACTION__ROLE :
-				return getRoles();
-			case UMLPackage.INTERACTION__OWNED_PORT :
-				return getOwnedPorts();
-			case UMLPackage.INTERACTION__CLASSIFIER_BEHAVIOR :
-				if (resolve)
-					return getClassifierBehavior();
-				return basicGetClassifierBehavior();
-			case UMLPackage.INTERACTION__INTERFACE_REALIZATION :
-				return getInterfaceRealizations();
-			case UMLPackage.INTERACTION__OWNED_BEHAVIOR :
-				return getOwnedBehaviors();
-			case UMLPackage.INTERACTION__OWNED_OPERATION :
-				return getOwnedOperations();
-			case UMLPackage.INTERACTION__EXTENSION :
-				return getExtensions();
-			case UMLPackage.INTERACTION__IS_ACTIVE :
-				return isActive();
-			case UMLPackage.INTERACTION__NESTED_CLASSIFIER :
-				return getNestedClassifiers();
-			case UMLPackage.INTERACTION__OWNED_RECEPTION :
-				return getOwnedReceptions();
-			case UMLPackage.INTERACTION__SUPER_CLASS :
-				return getSuperClasses();
-			case UMLPackage.INTERACTION__SPECIFICATION :
-				if (resolve)
-					return getSpecification();
-				return basicGetSpecification();
-			case UMLPackage.INTERACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.INTERACTION__IS_REENTRANT :
-				return isReentrant();
-			case UMLPackage.INTERACTION__OWNED_PARAMETER :
-				return getOwnedParameters();
-			case UMLPackage.INTERACTION__OWNED_PARAMETER_SET :
-				return getOwnedParameterSets();
-			case UMLPackage.INTERACTION__POSTCONDITION :
-				return getPostconditions();
-			case UMLPackage.INTERACTION__PRECONDITION :
-				return getPreconditions();
-			case UMLPackage.INTERACTION__REDEFINED_BEHAVIOR :
-				return getRedefinedBehaviors();
-			case UMLPackage.INTERACTION__COVERED :
-				return getCovereds();
-			case UMLPackage.INTERACTION__ENCLOSING_OPERAND :
-				if (resolve)
-					return getEnclosingOperand();
-				return basicGetEnclosingOperand();
-			case UMLPackage.INTERACTION__ENCLOSING_INTERACTION :
-				if (resolve)
-					return getEnclosingInteraction();
-				return basicGetEnclosingInteraction();
-			case UMLPackage.INTERACTION__GENERAL_ORDERING :
-				return getGeneralOrderings();
-			case UMLPackage.INTERACTION__LIFELINE :
-				return getLifelines();
-			case UMLPackage.INTERACTION__FRAGMENT :
-				return getFragments();
-			case UMLPackage.INTERACTION__ACTION :
-				return getActions();
-			case UMLPackage.INTERACTION__FORMAL_GATE :
-				return getFormalGates();
-			case UMLPackage.INTERACTION__MESSAGE :
-				return getMessages();
+		case UMLPackage.INTERACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INTERACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INTERACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INTERACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INTERACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INTERACTION__NAME:
+			return getName();
+		case UMLPackage.INTERACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INTERACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INTERACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INTERACTION__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.INTERACTION__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.INTERACTION__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.INTERACTION__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.INTERACTION__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.INTERACTION__MEMBER:
+			return getMembers();
+		case UMLPackage.INTERACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.INTERACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.INTERACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.INTERACTION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.INTERACTION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.INTERACTION__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.INTERACTION__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.INTERACTION__FEATURE:
+			return getFeatures();
+		case UMLPackage.INTERACTION__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.INTERACTION__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.INTERACTION__GENERAL:
+			return getGenerals();
+		case UMLPackage.INTERACTION__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.INTERACTION__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.INTERACTION__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.INTERACTION__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.INTERACTION__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.INTERACTION__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.INTERACTION__USE_CASE:
+			return getUseCases();
+		case UMLPackage.INTERACTION__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.INTERACTION__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.INTERACTION__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.INTERACTION__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.INTERACTION__OWNED_CONNECTOR:
+			return getOwnedConnectors();
+		case UMLPackage.INTERACTION__PART:
+			return getParts();
+		case UMLPackage.INTERACTION__ROLE:
+			return getRoles();
+		case UMLPackage.INTERACTION__OWNED_PORT:
+			return getOwnedPorts();
+		case UMLPackage.INTERACTION__CLASSIFIER_BEHAVIOR:
+			if (resolve)
+				return getClassifierBehavior();
+			return basicGetClassifierBehavior();
+		case UMLPackage.INTERACTION__INTERFACE_REALIZATION:
+			return getInterfaceRealizations();
+		case UMLPackage.INTERACTION__OWNED_BEHAVIOR:
+			return getOwnedBehaviors();
+		case UMLPackage.INTERACTION__OWNED_OPERATION:
+			return getOwnedOperations();
+		case UMLPackage.INTERACTION__EXTENSION:
+			return getExtensions();
+		case UMLPackage.INTERACTION__IS_ACTIVE:
+			return isActive();
+		case UMLPackage.INTERACTION__NESTED_CLASSIFIER:
+			return getNestedClassifiers();
+		case UMLPackage.INTERACTION__OWNED_RECEPTION:
+			return getOwnedReceptions();
+		case UMLPackage.INTERACTION__SUPER_CLASS:
+			return getSuperClasses();
+		case UMLPackage.INTERACTION__SPECIFICATION:
+			if (resolve)
+				return getSpecification();
+			return basicGetSpecification();
+		case UMLPackage.INTERACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.INTERACTION__IS_REENTRANT:
+			return isReentrant();
+		case UMLPackage.INTERACTION__OWNED_PARAMETER:
+			return getOwnedParameters();
+		case UMLPackage.INTERACTION__OWNED_PARAMETER_SET:
+			return getOwnedParameterSets();
+		case UMLPackage.INTERACTION__POSTCONDITION:
+			return getPostconditions();
+		case UMLPackage.INTERACTION__PRECONDITION:
+			return getPreconditions();
+		case UMLPackage.INTERACTION__REDEFINED_BEHAVIOR:
+			return getRedefinedBehaviors();
+		case UMLPackage.INTERACTION__COVERED:
+			return getCovereds();
+		case UMLPackage.INTERACTION__ENCLOSING_OPERAND:
+			if (resolve)
+				return getEnclosingOperand();
+			return basicGetEnclosingOperand();
+		case UMLPackage.INTERACTION__ENCLOSING_INTERACTION:
+			if (resolve)
+				return getEnclosingInteraction();
+			return basicGetEnclosingInteraction();
+		case UMLPackage.INTERACTION__GENERAL_ORDERING:
+			return getGeneralOrderings();
+		case UMLPackage.INTERACTION__LIFELINE:
+			return getLifelines();
+		case UMLPackage.INTERACTION__FRAGMENT:
+			return getFragments();
+		case UMLPackage.INTERACTION__ACTION:
+			return getActions();
+		case UMLPackage.INTERACTION__FORMAL_GATE:
+			return getFormalGates();
+		case UMLPackage.INTERACTION__MESSAGE:
+			return getMessages();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -1067,222 +933,193 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INTERACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INTERACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INTERACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INTERACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INTERACTION__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.INTERACTION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.INTERACTION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.INTERACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.INTERACTION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INTERACTION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INTERACTION__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.INTERACTION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.INTERACTION__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.INTERACTION__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.INTERACTION__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.INTERACTION__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.INTERACTION__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.INTERACTION__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.INTERACTION__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.INTERACTION__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.INTERACTION__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.INTERACTION__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.INTERACTION__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.INTERACTION__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.INTERACTION__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				getOwnedConnectors()
-					.addAll((Collection<? extends Connector>) newValue);
-				return;
-			case UMLPackage.INTERACTION__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) newValue);
-				return;
-			case UMLPackage.INTERACTION__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll(
-					(Collection<? extends InterfaceRealization>) newValue);
-				return;
-			case UMLPackage.INTERACTION__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				getOwnedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.INTERACTION__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
-			case UMLPackage.INTERACTION__IS_ACTIVE :
-				setIsActive((Boolean) newValue);
-				return;
-			case UMLPackage.INTERACTION__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				getNestedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.INTERACTION__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				getOwnedReceptions()
-					.addAll((Collection<? extends Reception>) newValue);
-				return;
-			case UMLPackage.INTERACTION__SUPER_CLASS :
-				getSuperClasses().clear();
-				getSuperClasses().addAll(
-					(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
-				return;
-			case UMLPackage.INTERACTION__SPECIFICATION :
-				setSpecification((BehavioralFeature) newValue);
-				return;
-			case UMLPackage.INTERACTION__IS_REENTRANT :
-				setIsReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.INTERACTION__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				getOwnedParameters()
-					.addAll((Collection<? extends Parameter>) newValue);
-				return;
-			case UMLPackage.INTERACTION__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				getOwnedParameterSets()
-					.addAll((Collection<? extends ParameterSet>) newValue);
-				return;
-			case UMLPackage.INTERACTION__POSTCONDITION :
-				getPostconditions().clear();
-				getPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.INTERACTION__PRECONDITION :
-				getPreconditions().clear();
-				getPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.INTERACTION__REDEFINED_BEHAVIOR :
-				getRedefinedBehaviors().clear();
-				getRedefinedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.INTERACTION__COVERED :
-				getCovereds().clear();
-				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
-				return;
-			case UMLPackage.INTERACTION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) newValue);
-				return;
-			case UMLPackage.INTERACTION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.INTERACTION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				getGeneralOrderings()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.INTERACTION__LIFELINE :
-				getLifelines().clear();
-				getLifelines()
-					.addAll((Collection<? extends Lifeline>) newValue);
-				return;
-			case UMLPackage.INTERACTION__FRAGMENT :
-				getFragments().clear();
-				getFragments().addAll(
-					(Collection<? extends InteractionFragment>) newValue);
-				return;
-			case UMLPackage.INTERACTION__ACTION :
-				getActions().clear();
-				getActions().addAll((Collection<? extends Action>) newValue);
-				return;
-			case UMLPackage.INTERACTION__FORMAL_GATE :
-				getFormalGates().clear();
-				getFormalGates().addAll((Collection<? extends Gate>) newValue);
-				return;
-			case UMLPackage.INTERACTION__MESSAGE :
-				getMessages().clear();
-				getMessages().addAll((Collection<? extends Message>) newValue);
-				return;
+		case UMLPackage.INTERACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INTERACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INTERACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INTERACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INTERACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INTERACTION__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.INTERACTION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.INTERACTION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.INTERACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.INTERACTION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INTERACTION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INTERACTION__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.INTERACTION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.INTERACTION__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.INTERACTION__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.INTERACTION__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.INTERACTION__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.INTERACTION__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.INTERACTION__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.INTERACTION__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.INTERACTION__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.INTERACTION__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.INTERACTION__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.INTERACTION__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.INTERACTION__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.INTERACTION__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			getOwnedConnectors().addAll((Collection<? extends Connector>) newValue);
+			return;
+		case UMLPackage.INTERACTION__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) newValue);
+			return;
+		case UMLPackage.INTERACTION__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			getInterfaceRealizations().addAll((Collection<? extends InterfaceRealization>) newValue);
+			return;
+		case UMLPackage.INTERACTION__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			getOwnedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.INTERACTION__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
+		case UMLPackage.INTERACTION__IS_ACTIVE:
+			setIsActive((Boolean) newValue);
+			return;
+		case UMLPackage.INTERACTION__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			getNestedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.INTERACTION__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			getOwnedReceptions().addAll((Collection<? extends Reception>) newValue);
+			return;
+		case UMLPackage.INTERACTION__SUPER_CLASS:
+			getSuperClasses().clear();
+			getSuperClasses().addAll((Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
+			return;
+		case UMLPackage.INTERACTION__SPECIFICATION:
+			setSpecification((BehavioralFeature) newValue);
+			return;
+		case UMLPackage.INTERACTION__IS_REENTRANT:
+			setIsReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.INTERACTION__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			getOwnedParameters().addAll((Collection<? extends Parameter>) newValue);
+			return;
+		case UMLPackage.INTERACTION__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			getOwnedParameterSets().addAll((Collection<? extends ParameterSet>) newValue);
+			return;
+		case UMLPackage.INTERACTION__POSTCONDITION:
+			getPostconditions().clear();
+			getPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.INTERACTION__PRECONDITION:
+			getPreconditions().clear();
+			getPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.INTERACTION__REDEFINED_BEHAVIOR:
+			getRedefinedBehaviors().clear();
+			getRedefinedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.INTERACTION__COVERED:
+			getCovereds().clear();
+			getCovereds().addAll((Collection<? extends Lifeline>) newValue);
+			return;
+		case UMLPackage.INTERACTION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) newValue);
+			return;
+		case UMLPackage.INTERACTION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.INTERACTION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			getGeneralOrderings().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.INTERACTION__LIFELINE:
+			getLifelines().clear();
+			getLifelines().addAll((Collection<? extends Lifeline>) newValue);
+			return;
+		case UMLPackage.INTERACTION__FRAGMENT:
+			getFragments().clear();
+			getFragments().addAll((Collection<? extends InteractionFragment>) newValue);
+			return;
+		case UMLPackage.INTERACTION__ACTION:
+			getActions().clear();
+			getActions().addAll((Collection<? extends Action>) newValue);
+			return;
+		case UMLPackage.INTERACTION__FORMAL_GATE:
+			getFormalGates().clear();
+			getFormalGates().addAll((Collection<? extends Gate>) newValue);
+			return;
+		case UMLPackage.INTERACTION__MESSAGE:
+			getMessages().clear();
+			getMessages().addAll((Collection<? extends Message>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -1295,159 +1132,159 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INTERACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INTERACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INTERACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INTERACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INTERACTION__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.INTERACTION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.INTERACTION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.INTERACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.INTERACTION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INTERACTION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INTERACTION__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.INTERACTION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.INTERACTION__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.INTERACTION__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.INTERACTION__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.INTERACTION__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.INTERACTION__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.INTERACTION__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.INTERACTION__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.INTERACTION__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.INTERACTION__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.INTERACTION__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.INTERACTION__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.INTERACTION__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.INTERACTION__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				return;
-			case UMLPackage.INTERACTION__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) null);
-				return;
-			case UMLPackage.INTERACTION__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				return;
-			case UMLPackage.INTERACTION__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				return;
-			case UMLPackage.INTERACTION__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
-			case UMLPackage.INTERACTION__IS_ACTIVE :
-				setIsActive(IS_ACTIVE_EDEFAULT);
-				return;
-			case UMLPackage.INTERACTION__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				return;
-			case UMLPackage.INTERACTION__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				return;
-			case UMLPackage.INTERACTION__SUPER_CLASS :
-				getSuperClasses().clear();
-				return;
-			case UMLPackage.INTERACTION__SPECIFICATION :
-				setSpecification((BehavioralFeature) null);
-				return;
-			case UMLPackage.INTERACTION__IS_REENTRANT :
-				unsetIsReentrant();
-				return;
-			case UMLPackage.INTERACTION__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				return;
-			case UMLPackage.INTERACTION__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				return;
-			case UMLPackage.INTERACTION__POSTCONDITION :
-				getPostconditions().clear();
-				return;
-			case UMLPackage.INTERACTION__PRECONDITION :
-				getPreconditions().clear();
-				return;
-			case UMLPackage.INTERACTION__REDEFINED_BEHAVIOR :
-				getRedefinedBehaviors().clear();
-				return;
-			case UMLPackage.INTERACTION__COVERED :
-				getCovereds().clear();
-				return;
-			case UMLPackage.INTERACTION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) null);
-				return;
-			case UMLPackage.INTERACTION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) null);
-				return;
-			case UMLPackage.INTERACTION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				return;
-			case UMLPackage.INTERACTION__LIFELINE :
-				getLifelines().clear();
-				return;
-			case UMLPackage.INTERACTION__FRAGMENT :
-				getFragments().clear();
-				return;
-			case UMLPackage.INTERACTION__ACTION :
-				getActions().clear();
-				return;
-			case UMLPackage.INTERACTION__FORMAL_GATE :
-				getFormalGates().clear();
-				return;
-			case UMLPackage.INTERACTION__MESSAGE :
-				getMessages().clear();
-				return;
+		case UMLPackage.INTERACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INTERACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INTERACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INTERACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INTERACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INTERACTION__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.INTERACTION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.INTERACTION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.INTERACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.INTERACTION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INTERACTION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INTERACTION__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.INTERACTION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.INTERACTION__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.INTERACTION__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.INTERACTION__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.INTERACTION__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.INTERACTION__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.INTERACTION__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.INTERACTION__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.INTERACTION__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.INTERACTION__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.INTERACTION__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.INTERACTION__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.INTERACTION__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.INTERACTION__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			return;
+		case UMLPackage.INTERACTION__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) null);
+			return;
+		case UMLPackage.INTERACTION__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			return;
+		case UMLPackage.INTERACTION__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			return;
+		case UMLPackage.INTERACTION__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
+		case UMLPackage.INTERACTION__IS_ACTIVE:
+			setIsActive(IS_ACTIVE_EDEFAULT);
+			return;
+		case UMLPackage.INTERACTION__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			return;
+		case UMLPackage.INTERACTION__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			return;
+		case UMLPackage.INTERACTION__SUPER_CLASS:
+			getSuperClasses().clear();
+			return;
+		case UMLPackage.INTERACTION__SPECIFICATION:
+			setSpecification((BehavioralFeature) null);
+			return;
+		case UMLPackage.INTERACTION__IS_REENTRANT:
+			unsetIsReentrant();
+			return;
+		case UMLPackage.INTERACTION__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			return;
+		case UMLPackage.INTERACTION__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			return;
+		case UMLPackage.INTERACTION__POSTCONDITION:
+			getPostconditions().clear();
+			return;
+		case UMLPackage.INTERACTION__PRECONDITION:
+			getPreconditions().clear();
+			return;
+		case UMLPackage.INTERACTION__REDEFINED_BEHAVIOR:
+			getRedefinedBehaviors().clear();
+			return;
+		case UMLPackage.INTERACTION__COVERED:
+			getCovereds().clear();
+			return;
+		case UMLPackage.INTERACTION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) null);
+			return;
+		case UMLPackage.INTERACTION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) null);
+			return;
+		case UMLPackage.INTERACTION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			return;
+		case UMLPackage.INTERACTION__LIFELINE:
+			getLifelines().clear();
+			return;
+		case UMLPackage.INTERACTION__FRAGMENT:
+			getFragments().clear();
+			return;
+		case UMLPackage.INTERACTION__ACTION:
+			getActions().clear();
+			return;
+		case UMLPackage.INTERACTION__FORMAL_GATE:
+			getFormalGates().clear();
+			return;
+		case UMLPackage.INTERACTION__MESSAGE:
+			getMessages().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1460,146 +1297,144 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INTERACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INTERACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INTERACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.INTERACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INTERACTION__NAME :
-				return isSetName();
-			case UMLPackage.INTERACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INTERACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INTERACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INTERACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INTERACTION__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.INTERACTION__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.INTERACTION__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.INTERACTION__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.INTERACTION__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.INTERACTION__MEMBER :
-				return isSetMembers();
-			case UMLPackage.INTERACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.INTERACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.INTERACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.INTERACTION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.INTERACTION__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.INTERACTION__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.INTERACTION__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.INTERACTION__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.INTERACTION__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.INTERACTION__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.INTERACTION__GENERAL :
-				return isSetGenerals();
-			case UMLPackage.INTERACTION__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.INTERACTION__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.INTERACTION__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.INTERACTION__IS_ABSTRACT :
-				return isSetIsAbstract();
-			case UMLPackage.INTERACTION__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.INTERACTION__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.INTERACTION__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.INTERACTION__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.INTERACTION__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.INTERACTION__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.INTERACTION__OWNED_ATTRIBUTE :
-				return isSetOwnedAttributes();
-			case UMLPackage.INTERACTION__OWNED_CONNECTOR :
-				return !getOwnedConnectors().isEmpty();
-			case UMLPackage.INTERACTION__PART :
-				return !getParts().isEmpty();
-			case UMLPackage.INTERACTION__ROLE :
-				return isSetRoles();
-			case UMLPackage.INTERACTION__OWNED_PORT :
-				return !getOwnedPorts().isEmpty();
-			case UMLPackage.INTERACTION__CLASSIFIER_BEHAVIOR :
-				return basicGetClassifierBehavior() != null;
-			case UMLPackage.INTERACTION__INTERFACE_REALIZATION :
-				return !getInterfaceRealizations().isEmpty();
-			case UMLPackage.INTERACTION__OWNED_BEHAVIOR :
-				return !getOwnedBehaviors().isEmpty();
-			case UMLPackage.INTERACTION__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
-			case UMLPackage.INTERACTION__EXTENSION :
-				return !getExtensions().isEmpty();
-			case UMLPackage.INTERACTION__IS_ACTIVE :
-				return isActive() != IS_ACTIVE_EDEFAULT;
-			case UMLPackage.INTERACTION__NESTED_CLASSIFIER :
-				return !getNestedClassifiers().isEmpty();
-			case UMLPackage.INTERACTION__OWNED_RECEPTION :
-				return !getOwnedReceptions().isEmpty();
-			case UMLPackage.INTERACTION__SUPER_CLASS :
-				return isSetSuperClasses();
-			case UMLPackage.INTERACTION__SPECIFICATION :
-				return basicGetSpecification() != null;
-			case UMLPackage.INTERACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.INTERACTION__IS_REENTRANT :
-				return isSetIsReentrant();
-			case UMLPackage.INTERACTION__OWNED_PARAMETER :
-				return !getOwnedParameters().isEmpty();
-			case UMLPackage.INTERACTION__OWNED_PARAMETER_SET :
-				return !getOwnedParameterSets().isEmpty();
-			case UMLPackage.INTERACTION__POSTCONDITION :
-				return !getPostconditions().isEmpty();
-			case UMLPackage.INTERACTION__PRECONDITION :
-				return !getPreconditions().isEmpty();
-			case UMLPackage.INTERACTION__REDEFINED_BEHAVIOR :
-				return !getRedefinedBehaviors().isEmpty();
-			case UMLPackage.INTERACTION__COVERED :
-				return !getCovereds().isEmpty();
-			case UMLPackage.INTERACTION__ENCLOSING_OPERAND :
-				return basicGetEnclosingOperand() != null;
-			case UMLPackage.INTERACTION__ENCLOSING_INTERACTION :
-				return basicGetEnclosingInteraction() != null;
-			case UMLPackage.INTERACTION__GENERAL_ORDERING :
-				return !getGeneralOrderings().isEmpty();
-			case UMLPackage.INTERACTION__LIFELINE :
-				return !getLifelines().isEmpty();
-			case UMLPackage.INTERACTION__FRAGMENT :
-				return !getFragments().isEmpty();
-			case UMLPackage.INTERACTION__ACTION :
-				return !getActions().isEmpty();
-			case UMLPackage.INTERACTION__FORMAL_GATE :
-				return !getFormalGates().isEmpty();
-			case UMLPackage.INTERACTION__MESSAGE :
-				return !getMessages().isEmpty();
+		case UMLPackage.INTERACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INTERACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INTERACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INTERACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.INTERACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INTERACTION__NAME:
+			return isSetName();
+		case UMLPackage.INTERACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INTERACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INTERACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INTERACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INTERACTION__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.INTERACTION__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.INTERACTION__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.INTERACTION__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.INTERACTION__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.INTERACTION__MEMBER:
+			return isSetMembers();
+		case UMLPackage.INTERACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.INTERACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.INTERACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.INTERACTION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.INTERACTION__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.INTERACTION__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.INTERACTION__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.INTERACTION__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.INTERACTION__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.INTERACTION__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.INTERACTION__GENERAL:
+			return isSetGenerals();
+		case UMLPackage.INTERACTION__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.INTERACTION__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.INTERACTION__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.INTERACTION__IS_ABSTRACT:
+			return isSetIsAbstract();
+		case UMLPackage.INTERACTION__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.INTERACTION__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.INTERACTION__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.INTERACTION__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.INTERACTION__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.INTERACTION__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.INTERACTION__OWNED_ATTRIBUTE:
+			return isSetOwnedAttributes();
+		case UMLPackage.INTERACTION__OWNED_CONNECTOR:
+			return !getOwnedConnectors().isEmpty();
+		case UMLPackage.INTERACTION__PART:
+			return !getParts().isEmpty();
+		case UMLPackage.INTERACTION__ROLE:
+			return isSetRoles();
+		case UMLPackage.INTERACTION__OWNED_PORT:
+			return !getOwnedPorts().isEmpty();
+		case UMLPackage.INTERACTION__CLASSIFIER_BEHAVIOR:
+			return basicGetClassifierBehavior() != null;
+		case UMLPackage.INTERACTION__INTERFACE_REALIZATION:
+			return !getInterfaceRealizations().isEmpty();
+		case UMLPackage.INTERACTION__OWNED_BEHAVIOR:
+			return !getOwnedBehaviors().isEmpty();
+		case UMLPackage.INTERACTION__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
+		case UMLPackage.INTERACTION__EXTENSION:
+			return !getExtensions().isEmpty();
+		case UMLPackage.INTERACTION__IS_ACTIVE:
+			return isActive() != IS_ACTIVE_EDEFAULT;
+		case UMLPackage.INTERACTION__NESTED_CLASSIFIER:
+			return !getNestedClassifiers().isEmpty();
+		case UMLPackage.INTERACTION__OWNED_RECEPTION:
+			return !getOwnedReceptions().isEmpty();
+		case UMLPackage.INTERACTION__SUPER_CLASS:
+			return isSetSuperClasses();
+		case UMLPackage.INTERACTION__SPECIFICATION:
+			return basicGetSpecification() != null;
+		case UMLPackage.INTERACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.INTERACTION__IS_REENTRANT:
+			return isSetIsReentrant();
+		case UMLPackage.INTERACTION__OWNED_PARAMETER:
+			return !getOwnedParameters().isEmpty();
+		case UMLPackage.INTERACTION__OWNED_PARAMETER_SET:
+			return !getOwnedParameterSets().isEmpty();
+		case UMLPackage.INTERACTION__POSTCONDITION:
+			return !getPostconditions().isEmpty();
+		case UMLPackage.INTERACTION__PRECONDITION:
+			return !getPreconditions().isEmpty();
+		case UMLPackage.INTERACTION__REDEFINED_BEHAVIOR:
+			return !getRedefinedBehaviors().isEmpty();
+		case UMLPackage.INTERACTION__COVERED:
+			return !getCovereds().isEmpty();
+		case UMLPackage.INTERACTION__ENCLOSING_OPERAND:
+			return basicGetEnclosingOperand() != null;
+		case UMLPackage.INTERACTION__ENCLOSING_INTERACTION:
+			return basicGetEnclosingInteraction() != null;
+		case UMLPackage.INTERACTION__GENERAL_ORDERING:
+			return !getGeneralOrderings().isEmpty();
+		case UMLPackage.INTERACTION__LIFELINE:
+			return !getLifelines().isEmpty();
+		case UMLPackage.INTERACTION__FRAGMENT:
+			return !getFragments().isEmpty();
+		case UMLPackage.INTERACTION__ACTION:
+			return !getActions().isEmpty();
+		case UMLPackage.INTERACTION__FORMAL_GATE:
+			return !getFormalGates().isEmpty();
+		case UMLPackage.INTERACTION__MESSAGE:
+			return !getMessages().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1614,16 +1449,16 @@
 			Class<?> baseClass) {
 		if (baseClass == InteractionFragment.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.INTERACTION__COVERED :
-					return UMLPackage.INTERACTION_FRAGMENT__COVERED;
-				case UMLPackage.INTERACTION__ENCLOSING_OPERAND :
-					return UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND;
-				case UMLPackage.INTERACTION__ENCLOSING_INTERACTION :
-					return UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION;
-				case UMLPackage.INTERACTION__GENERAL_ORDERING :
-					return UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING;
-				default :
-					return -1;
+			case UMLPackage.INTERACTION__COVERED:
+				return UMLPackage.INTERACTION_FRAGMENT__COVERED;
+			case UMLPackage.INTERACTION__ENCLOSING_OPERAND:
+				return UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND;
+			case UMLPackage.INTERACTION__ENCLOSING_INTERACTION:
+				return UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION;
+			case UMLPackage.INTERACTION__GENERAL_ORDERING:
+				return UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -1639,16 +1474,16 @@
 			Class<?> baseClass) {
 		if (baseClass == InteractionFragment.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.INTERACTION_FRAGMENT__COVERED :
-					return UMLPackage.INTERACTION__COVERED;
-				case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND :
-					return UMLPackage.INTERACTION__ENCLOSING_OPERAND;
-				case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION :
-					return UMLPackage.INTERACTION__ENCLOSING_INTERACTION;
-				case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING :
-					return UMLPackage.INTERACTION__GENERAL_ORDERING;
-				default :
-					return -1;
+			case UMLPackage.INTERACTION_FRAGMENT__COVERED:
+				return UMLPackage.INTERACTION__COVERED;
+			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND:
+				return UMLPackage.INTERACTION__ENCLOSING_OPERAND;
+			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION:
+				return UMLPackage.INTERACTION__ENCLOSING_INTERACTION;
+			case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING:
+				return UMLPackage.INTERACTION__GENERAL_ORDERING;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1664,325 +1499,257 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.INTERACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.INTERACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.INTERACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.INTERACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.INTERACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.INTERACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.INTERACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.INTERACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.INTERACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.INTERACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.INTERACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.INTERACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.INTERACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.INTERACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.INTERACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.INTERACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.INTERACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INTERACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.INTERACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.INTERACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INTERACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.INTERACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.INTERACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.INTERACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.INTERACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.INTERACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.INTERACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.INTERACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.INTERACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.INTERACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.INTERACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.INTERACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.INTERACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.INTERACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.INTERACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.INTERACTION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.INTERACTION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.INTERACTION___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.INTERACTION___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.INTERACTION___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.INTERACTION___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.INTERACTION___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.INTERACTION___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.INTERACTION___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.INTERACTION___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.INTERACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.INTERACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.INTERACTION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.INTERACTION___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.INTERACTION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.INTERACTION___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.INTERACTION___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.INTERACTION___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.INTERACTION___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.INTERACTION___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.INTERACTION___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.INTERACTION___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.INTERACTION___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.INTERACTION___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.INTERACTION___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.INTERACTION___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.INTERACTION___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.INTERACTION___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.INTERACTION___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.INTERACTION___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.INTERACTION___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.INTERACTION___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.INTERACTION___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.INTERACTION___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.INTERACTION___PARENTS :
-				return parents();
-			case UMLPackage.INTERACTION___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.INTERACTION___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.INTERACTION___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.INTERACTION___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.INTERACTION___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.INTERACTION___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.INTERACTION___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.INTERACTION___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.INTERACTION___GET_PARTS :
-				return getParts();
-			case UMLPackage.INTERACTION___ALL_ROLES :
-				return allRoles();
-			case UMLPackage.INTERACTION___GET_OWNED_PORTS :
-				return getOwnedPorts();
-			case UMLPackage.INTERACTION___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateClassBehavior((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___GET_ALL_IMPLEMENTED_INTERFACES :
-				return getAllImplementedInterfaces();
-			case UMLPackage.INTERACTION___GET_IMPLEMENTED_INTERFACES :
-				return getImplementedInterfaces();
-			case UMLPackage.INTERACTION___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP :
-				return validatePassiveClass((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
-			case UMLPackage.INTERACTION___IS_METACLASS :
-				return isMetaclass();
-			case UMLPackage.INTERACTION___GET_EXTENSIONS :
-				return getExtensions();
-			case UMLPackage.INTERACTION___GET_SUPER_CLASSES :
-				return getSuperClasses();
-			case UMLPackage.INTERACTION___VALIDATE_MOST_ONE_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateMostOneBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___VALIDATE_PARAMETERS_MATCH__DIAGNOSTICCHAIN_MAP :
-				return validateParametersMatch(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___VALIDATE_FEATURE_OF_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateFeatureOfContextClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.INTERACTION___BEHAVIORED_CLASSIFIER__ELEMENT :
-				return behavioredClassifier((Element) arguments.get(0));
-			case UMLPackage.INTERACTION___INPUT_PARAMETERS :
-				return inputParameters();
-			case UMLPackage.INTERACTION___OUTPUT_PARAMETERS :
-				return outputParameters();
-			case UMLPackage.INTERACTION___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP :
-				return validateNotContained((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.INTERACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.INTERACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.INTERACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.INTERACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.INTERACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.INTERACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.INTERACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.INTERACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.INTERACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.INTERACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.INTERACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.INTERACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.INTERACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.INTERACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.INTERACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.INTERACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.INTERACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.INTERACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.INTERACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.INTERACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.INTERACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.INTERACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.INTERACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.INTERACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.INTERACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.INTERACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.INTERACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.INTERACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.INTERACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.INTERACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.INTERACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.INTERACTION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.INTERACTION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.INTERACTION___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.INTERACTION___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.INTERACTION___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.INTERACTION___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.INTERACTION___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.INTERACTION___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.INTERACTION___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.INTERACTION___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.INTERACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.INTERACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.INTERACTION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.INTERACTION___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.INTERACTION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.INTERACTION___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.INTERACTION___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.INTERACTION___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.INTERACTION___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.INTERACTION___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.INTERACTION___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.INTERACTION___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.INTERACTION___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.INTERACTION___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.INTERACTION___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.INTERACTION___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.INTERACTION___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.INTERACTION___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.INTERACTION___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.INTERACTION___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.INTERACTION___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.INTERACTION___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.INTERACTION___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.INTERACTION___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.INTERACTION___PARENTS:
+			return parents();
+		case UMLPackage.INTERACTION___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.INTERACTION___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.INTERACTION___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.INTERACTION___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.INTERACTION___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.INTERACTION___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.INTERACTION___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.INTERACTION___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.INTERACTION___GET_PARTS:
+			return getParts();
+		case UMLPackage.INTERACTION___ALL_ROLES:
+			return allRoles();
+		case UMLPackage.INTERACTION___GET_OWNED_PORTS:
+			return getOwnedPorts();
+		case UMLPackage.INTERACTION___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateClassBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___GET_ALL_IMPLEMENTED_INTERFACES:
+			return getAllImplementedInterfaces();
+		case UMLPackage.INTERACTION___GET_IMPLEMENTED_INTERFACES:
+			return getImplementedInterfaces();
+		case UMLPackage.INTERACTION___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP:
+			return validatePassiveClass((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.INTERACTION___IS_METACLASS:
+			return isMetaclass();
+		case UMLPackage.INTERACTION___GET_EXTENSIONS:
+			return getExtensions();
+		case UMLPackage.INTERACTION___GET_SUPER_CLASSES:
+			return getSuperClasses();
+		case UMLPackage.INTERACTION___VALIDATE_MOST_ONE_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateMostOneBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___VALIDATE_PARAMETERS_MATCH__DIAGNOSTICCHAIN_MAP:
+			return validateParametersMatch((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___VALIDATE_FEATURE_OF_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateFeatureOfContextClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.INTERACTION___BEHAVIORED_CLASSIFIER__ELEMENT:
+			return behavioredClassifier((Element) arguments.get(0));
+		case UMLPackage.INTERACTION___INPUT_PARAMETERS:
+			return inputParameters();
+		case UMLPackage.INTERACTION___OUTPUT_PARAMETERS:
+			return outputParameters();
+		case UMLPackage.INTERACTION___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP:
+			return validateNotContained((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1995,20 +1762,9 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.INTERACTION__OWNED_COMMENT,
-		UMLPackage.INTERACTION__NAME_EXPRESSION,
-		UMLPackage.INTERACTION__ELEMENT_IMPORT,
-		UMLPackage.INTERACTION__PACKAGE_IMPORT,
-		UMLPackage.INTERACTION__OWNED_MEMBER,
-		UMLPackage.INTERACTION__TEMPLATE_BINDING,
-		UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE,
-		UMLPackage.INTERACTION__COLLABORATION_USE,
-		UMLPackage.INTERACTION__GENERALIZATION,
-		UMLPackage.INTERACTION__SUBSTITUTION,
-		UMLPackage.INTERACTION__INTERFACE_REALIZATION,
-		UMLPackage.INTERACTION__GENERAL_ORDERING,
-		UMLPackage.INTERACTION__ACTION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.INTERACTION__OWNED_COMMENT, UMLPackage.INTERACTION__NAME_EXPRESSION, UMLPackage.INTERACTION__ELEMENT_IMPORT, UMLPackage.INTERACTION__PACKAGE_IMPORT,
+			UMLPackage.INTERACTION__OWNED_MEMBER, UMLPackage.INTERACTION__TEMPLATE_BINDING, UMLPackage.INTERACTION__OWNED_TEMPLATE_SIGNATURE, UMLPackage.INTERACTION__COLLABORATION_USE, UMLPackage.INTERACTION__GENERALIZATION,
+			UMLPackage.INTERACTION__SUBSTITUTION, UMLPackage.INTERACTION__INTERFACE_REALIZATION, UMLPackage.INTERACTION__GENERAL_ORDERING, UMLPackage.INTERACTION__ACTION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2018,9 +1774,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -2031,8 +1785,8 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.INTERACTION__GENERAL_ORDERING)
-			|| eIsSet(UMLPackage.INTERACTION__ACTION);
+				|| eIsSet(UMLPackage.INTERACTION__GENERAL_ORDERING)
+				|| eIsSet(UMLPackage.INTERACTION__ACTION);
 	}
 
 	/**
@@ -2061,8 +1815,8 @@
 	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
-			|| eIsSet(UMLPackage.INTERACTION__ENCLOSING_OPERAND)
-			|| eIsSet(UMLPackage.INTERACTION__ENCLOSING_INTERACTION);
+				|| eIsSet(UMLPackage.INTERACTION__ENCLOSING_OPERAND)
+				|| eIsSet(UMLPackage.INTERACTION__ENCLOSING_INTERACTION);
 	}
 
 	/**
@@ -2073,19 +1827,9 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.INTERACTION__OWNED_RULE,
-		UMLPackage.INTERACTION__OWNED_USE_CASE,
-		UMLPackage.INTERACTION__OWNED_ATTRIBUTE,
-		UMLPackage.INTERACTION__OWNED_CONNECTOR,
-		UMLPackage.INTERACTION__OWNED_BEHAVIOR,
-		UMLPackage.INTERACTION__OWNED_OPERATION,
-		UMLPackage.INTERACTION__NESTED_CLASSIFIER,
-		UMLPackage.INTERACTION__OWNED_RECEPTION,
-		UMLPackage.INTERACTION__OWNED_PARAMETER,
-		UMLPackage.INTERACTION__OWNED_PARAMETER_SET,
-		UMLPackage.INTERACTION__LIFELINE, UMLPackage.INTERACTION__FRAGMENT,
-		UMLPackage.INTERACTION__FORMAL_GATE, UMLPackage.INTERACTION__MESSAGE};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.INTERACTION__OWNED_RULE, UMLPackage.INTERACTION__OWNED_USE_CASE, UMLPackage.INTERACTION__OWNED_ATTRIBUTE, UMLPackage.INTERACTION__OWNED_CONNECTOR,
+			UMLPackage.INTERACTION__OWNED_BEHAVIOR, UMLPackage.INTERACTION__OWNED_OPERATION, UMLPackage.INTERACTION__NESTED_CLASSIFIER, UMLPackage.INTERACTION__OWNED_RECEPTION, UMLPackage.INTERACTION__OWNED_PARAMETER,
+			UMLPackage.INTERACTION__OWNED_PARAMETER_SET, UMLPackage.INTERACTION__LIFELINE, UMLPackage.INTERACTION__FRAGMENT, UMLPackage.INTERACTION__FORMAL_GATE, UMLPackage.INTERACTION__MESSAGE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2095,10 +1839,10 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.INTERACTION__LIFELINE)
-			|| eIsSet(UMLPackage.INTERACTION__FRAGMENT)
-			|| eIsSet(UMLPackage.INTERACTION__FORMAL_GATE)
-			|| eIsSet(UMLPackage.INTERACTION__MESSAGE);
+				|| eIsSet(UMLPackage.INTERACTION__LIFELINE)
+				|| eIsSet(UMLPackage.INTERACTION__FRAGMENT)
+				|| eIsSet(UMLPackage.INTERACTION__FORMAL_GATE)
+				|| eIsSet(UMLPackage.INTERACTION__MESSAGE);
 	}
 
 } //InteractionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionOperandImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionOperandImpl.java
index b8a6e95..4d954f8 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionOperandImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionOperandImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,8 +28,14 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -110,21 +117,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.INTERACTION_OPERAND__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INTERACTION_OPERAND__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.INTERACTION_OPERAND__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INTERACTION_OPERAND__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -134,9 +133,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Lifeline> getCovereds() {
-		return (EList<Lifeline>) eDynamicGet(
-			UMLPackage.INTERACTION_OPERAND__COVERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__COVERED, true, true);
+		return (EList<Lifeline>) eDynamicGet(UMLPackage.INTERACTION_OPERAND__COVERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__COVERED, true, true);
 	}
 
 	/**
@@ -154,10 +151,8 @@
 	 * @generated
 	 */
 	public Lifeline getCovered(String name, boolean ignoreCase) {
-		coveredLoop : for (Lifeline covered : getCovereds()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(covered.getName())
-				: name.equals(covered.getName())))
+		coveredLoop: for (Lifeline covered : getCovereds()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(covered.getName()) : name.equals(covered.getName())))
 				continue coveredLoop;
 			return covered;
 		}
@@ -171,11 +166,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<GeneralOrdering> getGeneralOrderings() {
-		return (EList<GeneralOrdering>) eDynamicGet(
-			UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__GENERAL_ORDERING, true,
-			true);
+		return (EList<GeneralOrdering>) eDynamicGet(UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__GENERAL_ORDERING, true, true);
 	}
 
 	/**
@@ -184,8 +175,7 @@
 	 * @generated
 	 */
 	public GeneralOrdering createGeneralOrdering(String name) {
-		GeneralOrdering newGeneralOrdering = (GeneralOrdering) create(
-			UMLPackage.Literals.GENERAL_ORDERING);
+		GeneralOrdering newGeneralOrdering = (GeneralOrdering) create(UMLPackage.Literals.GENERAL_ORDERING);
 		getGeneralOrderings().add(newGeneralOrdering);
 		if (name != null)
 			newGeneralOrdering.setName(name);
@@ -208,16 +198,12 @@
 	 */
 	public GeneralOrdering getGeneralOrdering(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		generalOrderingLoop : for (GeneralOrdering generalOrdering : getGeneralOrderings()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(generalOrdering.getName())
-				: name.equals(generalOrdering.getName())))
+		generalOrderingLoop: for (GeneralOrdering generalOrdering : getGeneralOrderings()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(generalOrdering.getName()) : name.equals(generalOrdering.getName())))
 				continue generalOrderingLoop;
 			return generalOrdering;
 		}
-		return createOnDemand
-			? createGeneralOrdering(name)
-			: null;
+		return createOnDemand ? createGeneralOrdering(name) : null;
 	}
 
 	/**
@@ -226,11 +212,7 @@
 	 * @generated
 	 */
 	public Interaction getEnclosingInteraction() {
-		return (Interaction) eDynamicGet(
-			UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION,
-			true, true);
+		return (Interaction) eDynamicGet(UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION, true, true);
 	}
 
 	/**
@@ -239,11 +221,7 @@
 	 * @generated
 	 */
 	public Interaction basicGetEnclosingInteraction() {
-		return (Interaction) eDynamicGet(
-			UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION,
-			false, true);
+		return (Interaction) eDynamicGet(UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION, false, true);
 	}
 
 	/**
@@ -253,8 +231,7 @@
 	 */
 	public NotificationChain basicSetEnclosingInteraction(
 			Interaction newEnclosingInteraction, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newEnclosingInteraction,
-			UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newEnclosingInteraction, UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION, msgs);
 		return msgs;
 	}
 
@@ -264,11 +241,7 @@
 	 * @generated
 	 */
 	public void setEnclosingInteraction(Interaction newEnclosingInteraction) {
-		eDynamicSet(
-			UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION,
-			newEnclosingInteraction);
+		eDynamicSet(UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION, newEnclosingInteraction);
 	}
 
 	/**
@@ -277,11 +250,7 @@
 	 * @generated
 	 */
 	public InteractionOperand getEnclosingOperand() {
-		return (InteractionOperand) eDynamicGet(
-			UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, true,
-			true);
+		return (InteractionOperand) eDynamicGet(UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, true, true);
 	}
 
 	/**
@@ -290,11 +259,7 @@
 	 * @generated
 	 */
 	public InteractionOperand basicGetEnclosingOperand() {
-		return (InteractionOperand) eDynamicGet(
-			UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, false,
-			true);
+		return (InteractionOperand) eDynamicGet(UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, false, true);
 	}
 
 	/**
@@ -304,8 +269,7 @@
 	 */
 	public NotificationChain basicSetEnclosingOperand(
 			InteractionOperand newEnclosingOperand, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newEnclosingOperand,
-			UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newEnclosingOperand, UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND, msgs);
 		return msgs;
 	}
 
@@ -315,11 +279,7 @@
 	 * @generated
 	 */
 	public void setEnclosingOperand(InteractionOperand newEnclosingOperand) {
-		eDynamicSet(
-			UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND,
-			newEnclosingOperand);
+		eDynamicSet(UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__ENCLOSING_OPERAND, newEnclosingOperand);
 	}
 
 	/**
@@ -333,21 +293,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.INTERACTION_OPERAND__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.INTERACTION_OPERAND__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(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);
 	}
 
 	/**
@@ -356,9 +308,7 @@
 	 * @generated
 	 */
 	public InteractionConstraint getGuard() {
-		return (InteractionConstraint) eDynamicGet(
-			UMLPackage.INTERACTION_OPERAND__GUARD - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_OPERAND__GUARD, true, true);
+		return (InteractionConstraint) eDynamicGet(UMLPackage.INTERACTION_OPERAND__GUARD - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_OPERAND__GUARD, true, true);
 	}
 
 	/**
@@ -367,9 +317,7 @@
 	 * @generated
 	 */
 	public InteractionConstraint basicGetGuard() {
-		return (InteractionConstraint) eDynamicGet(
-			UMLPackage.INTERACTION_OPERAND__GUARD - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_OPERAND__GUARD, false, true);
+		return (InteractionConstraint) eDynamicGet(UMLPackage.INTERACTION_OPERAND__GUARD - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_OPERAND__GUARD, false, true);
 	}
 
 	/**
@@ -379,8 +327,7 @@
 	 */
 	public NotificationChain basicSetGuard(InteractionConstraint newGuard,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newGuard,
-			UMLPackage.INTERACTION_OPERAND__GUARD, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newGuard, UMLPackage.INTERACTION_OPERAND__GUARD, msgs);
 		return msgs;
 	}
 
@@ -390,9 +337,7 @@
 	 * @generated
 	 */
 	public void setGuard(InteractionConstraint newGuard) {
-		eDynamicSet(
-			UMLPackage.INTERACTION_OPERAND__GUARD - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_OPERAND__GUARD, newGuard);
+		eDynamicSet(UMLPackage.INTERACTION_OPERAND__GUARD - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_OPERAND__GUARD, newGuard);
 	}
 
 	/**
@@ -401,8 +346,7 @@
 	 * @generated
 	 */
 	public InteractionConstraint createGuard(String name) {
-		InteractionConstraint newGuard = (InteractionConstraint) create(
-			UMLPackage.Literals.INTERACTION_CONSTRAINT);
+		InteractionConstraint newGuard = (InteractionConstraint) create(UMLPackage.Literals.INTERACTION_CONSTRAINT);
 		setGuard(newGuard);
 		if (name != null)
 			newGuard.setName(name);
@@ -416,9 +360,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<InteractionFragment> getFragments() {
-		return (EList<InteractionFragment>) eDynamicGet(
-			UMLPackage.INTERACTION_OPERAND__FRAGMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_OPERAND__FRAGMENT, true, true);
+		return (EList<InteractionFragment>) eDynamicGet(UMLPackage.INTERACTION_OPERAND__FRAGMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_OPERAND__FRAGMENT, true, true);
 	}
 
 	/**
@@ -450,18 +392,14 @@
 	 */
 	public InteractionFragment getFragment(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		fragmentLoop : for (InteractionFragment fragment : getFragments()) {
+		fragmentLoop: for (InteractionFragment fragment : getFragments()) {
 			if (eClass != null && !eClass.isInstance(fragment))
 				continue fragmentLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(fragment.getName())
-				: name.equals(fragment.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(fragment.getName()) : name.equals(fragment.getName())))
 				continue fragmentLoop;
 			return fragment;
 		}
-		return createOnDemand && eClass != null
-			? createFragment(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createFragment(name, eClass) : null;
 	}
 
 	/**
@@ -471,8 +409,7 @@
 	 */
 	public boolean validateGuardDirectlyPrior(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InteractionOperandOperations.validateGuardDirectlyPrior(this,
-			diagnostics, context);
+		return InteractionOperandOperations.validateGuardDirectlyPrior(this, diagnostics, context);
 	}
 
 	/**
@@ -482,8 +419,7 @@
 	 */
 	public boolean validateGuardContainReferences(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InteractionOperandOperations.validateGuardContainReferences(this,
-			diagnostics, context);
+		return InteractionOperandOperations.validateGuardContainReferences(this, diagnostics, context);
 	}
 
 	/**
@@ -496,34 +432,26 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION_OPERAND__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION_OPERAND__COVERED :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getCovereds())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetEnclosingOperand((InteractionOperand) otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetEnclosingInteraction((Interaction) otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION_OPERAND__FRAGMENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getFragments())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__COVERED:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getCovereds()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetEnclosingOperand((InteractionOperand) otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetEnclosingInteraction((Interaction) otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__FRAGMENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getFragments()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -537,38 +465,30 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION_OPERAND__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION_OPERAND__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.INTERACTION_OPERAND__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION_OPERAND__COVERED :
-				return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND :
-				return basicSetEnclosingOperand(null, msgs);
-			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION :
-				return basicSetEnclosingInteraction(null, msgs);
-			case UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING :
-				return ((InternalEList<?>) getGeneralOrderings())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION_OPERAND__FRAGMENT :
-				return ((InternalEList<?>) getFragments()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION_OPERAND__GUARD :
-				return basicSetGuard(null, msgs);
+		case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.INTERACTION_OPERAND__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__COVERED:
+			return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND:
+			return basicSetEnclosingOperand(null, msgs);
+		case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION:
+			return basicSetEnclosingInteraction(null, msgs);
+		case UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING:
+			return ((InternalEList<?>) getGeneralOrderings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__FRAGMENT:
+			return ((InternalEList<?>) getFragments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_OPERAND__GUARD:
+			return basicSetGuard(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -582,13 +502,10 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.INTERACTION_OPERAND__FRAGMENT,
-					InteractionOperand.class, msgs);
-			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.INTERACTION__FRAGMENT, Interaction.class, msgs);
+		case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.INTERACTION_OPERAND__FRAGMENT, InteractionOperand.class, msgs);
+		case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.INTERACTION__FRAGMENT, Interaction.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -601,62 +518,62 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INTERACTION_OPERAND__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INTERACTION_OPERAND__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INTERACTION_OPERAND__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INTERACTION_OPERAND__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INTERACTION_OPERAND__NAME :
-				return getName();
-			case UMLPackage.INTERACTION_OPERAND__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INTERACTION_OPERAND__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INTERACTION_OPERAND__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERACTION_OPERAND__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INTERACTION_OPERAND__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.INTERACTION_OPERAND__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.INTERACTION_OPERAND__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.INTERACTION_OPERAND__MEMBER :
-				return getMembers();
-			case UMLPackage.INTERACTION_OPERAND__COVERED :
-				return getCovereds();
-			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND :
-				if (resolve)
-					return getEnclosingOperand();
-				return basicGetEnclosingOperand();
-			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION :
-				if (resolve)
-					return getEnclosingInteraction();
-				return basicGetEnclosingInteraction();
-			case UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING :
-				return getGeneralOrderings();
-			case UMLPackage.INTERACTION_OPERAND__FRAGMENT :
-				return getFragments();
-			case UMLPackage.INTERACTION_OPERAND__GUARD :
-				if (resolve)
-					return getGuard();
-				return basicGetGuard();
+		case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INTERACTION_OPERAND__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INTERACTION_OPERAND__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INTERACTION_OPERAND__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INTERACTION_OPERAND__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INTERACTION_OPERAND__NAME:
+			return getName();
+		case UMLPackage.INTERACTION_OPERAND__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INTERACTION_OPERAND__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INTERACTION_OPERAND__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERACTION_OPERAND__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INTERACTION_OPERAND__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.INTERACTION_OPERAND__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.INTERACTION_OPERAND__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.INTERACTION_OPERAND__MEMBER:
+			return getMembers();
+		case UMLPackage.INTERACTION_OPERAND__COVERED:
+			return getCovereds();
+		case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND:
+			if (resolve)
+				return getEnclosingOperand();
+			return basicGetEnclosingOperand();
+		case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION:
+			if (resolve)
+				return getEnclosingInteraction();
+			return basicGetEnclosingInteraction();
+		case UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING:
+			return getGeneralOrderings();
+		case UMLPackage.INTERACTION_OPERAND__FRAGMENT:
+			return getFragments();
+		case UMLPackage.INTERACTION_OPERAND__GUARD:
+			if (resolve)
+				return getGuard();
+			return basicGetGuard();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -670,63 +587,56 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__COVERED :
-				getCovereds().clear();
-				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) newValue);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				getGeneralOrderings()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__FRAGMENT :
-				getFragments().clear();
-				getFragments().addAll(
-					(Collection<? extends InteractionFragment>) newValue);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__GUARD :
-				setGuard((InteractionConstraint) newValue);
-				return;
+		case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__COVERED:
+			getCovereds().clear();
+			getCovereds().addAll((Collection<? extends Lifeline>) newValue);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) newValue);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			getGeneralOrderings().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__FRAGMENT:
+			getFragments().clear();
+			getFragments().addAll((Collection<? extends InteractionFragment>) newValue);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__GUARD:
+			setGuard((InteractionConstraint) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -739,48 +649,48 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INTERACTION_OPERAND__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INTERACTION_OPERAND__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INTERACTION_OPERAND__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INTERACTION_OPERAND__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.INTERACTION_OPERAND__COVERED :
-				getCovereds().clear();
-				return;
-			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) null);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) null);
-				return;
-			case UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				return;
-			case UMLPackage.INTERACTION_OPERAND__FRAGMENT :
-				getFragments().clear();
-				return;
-			case UMLPackage.INTERACTION_OPERAND__GUARD :
-				setGuard((InteractionConstraint) null);
-				return;
+		case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INTERACTION_OPERAND__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INTERACTION_OPERAND__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INTERACTION_OPERAND__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INTERACTION_OPERAND__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.INTERACTION_OPERAND__COVERED:
+			getCovereds().clear();
+			return;
+		case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) null);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) null);
+			return;
+		case UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			return;
+		case UMLPackage.INTERACTION_OPERAND__FRAGMENT:
+			getFragments().clear();
+			return;
+		case UMLPackage.INTERACTION_OPERAND__GUARD:
+			setGuard((InteractionConstraint) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -793,52 +703,50 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INTERACTION_OPERAND__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INTERACTION_OPERAND__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INTERACTION_OPERAND__OWNER :
-				return isSetOwner();
-			case UMLPackage.INTERACTION_OPERAND__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INTERACTION_OPERAND__NAME :
-				return isSetName();
-			case UMLPackage.INTERACTION_OPERAND__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INTERACTION_OPERAND__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INTERACTION_OPERAND__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INTERACTION_OPERAND__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INTERACTION_OPERAND__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.INTERACTION_OPERAND__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.INTERACTION_OPERAND__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.INTERACTION_OPERAND__MEMBER :
-				return isSetMembers();
-			case UMLPackage.INTERACTION_OPERAND__COVERED :
-				return !getCovereds().isEmpty();
-			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND :
-				return basicGetEnclosingOperand() != null;
-			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION :
-				return basicGetEnclosingInteraction() != null;
-			case UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING :
-				return !getGeneralOrderings().isEmpty();
-			case UMLPackage.INTERACTION_OPERAND__FRAGMENT :
-				return !getFragments().isEmpty();
-			case UMLPackage.INTERACTION_OPERAND__GUARD :
-				return basicGetGuard() != null;
+		case UMLPackage.INTERACTION_OPERAND__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INTERACTION_OPERAND__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INTERACTION_OPERAND__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INTERACTION_OPERAND__OWNER:
+			return isSetOwner();
+		case UMLPackage.INTERACTION_OPERAND__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INTERACTION_OPERAND__NAME:
+			return isSetName();
+		case UMLPackage.INTERACTION_OPERAND__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INTERACTION_OPERAND__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INTERACTION_OPERAND__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INTERACTION_OPERAND__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INTERACTION_OPERAND__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.INTERACTION_OPERAND__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.INTERACTION_OPERAND__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.INTERACTION_OPERAND__MEMBER:
+			return isSetMembers();
+		case UMLPackage.INTERACTION_OPERAND__COVERED:
+			return !getCovereds().isEmpty();
+		case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND:
+			return basicGetEnclosingOperand() != null;
+		case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION:
+			return basicGetEnclosingInteraction() != null;
+		case UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING:
+			return !getGeneralOrderings().isEmpty();
+		case UMLPackage.INTERACTION_OPERAND__FRAGMENT:
+			return !getFragments().isEmpty();
+		case UMLPackage.INTERACTION_OPERAND__GUARD:
+			return basicGetGuard() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -853,16 +761,16 @@
 			Class<?> baseClass) {
 		if (baseClass == InteractionFragment.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.INTERACTION_OPERAND__COVERED :
-					return UMLPackage.INTERACTION_FRAGMENT__COVERED;
-				case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND :
-					return UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND;
-				case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION :
-					return UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION;
-				case UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING :
-					return UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING;
-				default :
-					return -1;
+			case UMLPackage.INTERACTION_OPERAND__COVERED:
+				return UMLPackage.INTERACTION_FRAGMENT__COVERED;
+			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND:
+				return UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND;
+			case UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION:
+				return UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION;
+			case UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING:
+				return UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -878,16 +786,16 @@
 			Class<?> baseClass) {
 		if (baseClass == InteractionFragment.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.INTERACTION_FRAGMENT__COVERED :
-					return UMLPackage.INTERACTION_OPERAND__COVERED;
-				case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND :
-					return UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND;
-				case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION :
-					return UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION;
-				case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING :
-					return UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING;
-				default :
-					return -1;
+			case UMLPackage.INTERACTION_FRAGMENT__COVERED:
+				return UMLPackage.INTERACTION_OPERAND__COVERED;
+			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_OPERAND:
+				return UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND;
+			case UMLPackage.INTERACTION_FRAGMENT__ENCLOSING_INTERACTION:
+				return UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION;
+			case UMLPackage.INTERACTION_FRAGMENT__GENERAL_ORDERING:
+				return UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -903,171 +811,140 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.INTERACTION_OPERAND___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_OPERAND___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_OPERAND___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.INTERACTION_OPERAND___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.INTERACTION_OPERAND___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.INTERACTION_OPERAND___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.INTERACTION_OPERAND___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERACTION_OPERAND___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___GET_MODEL :
-				return getModel();
-			case UMLPackage.INTERACTION_OPERAND___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.INTERACTION_OPERAND___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.INTERACTION_OPERAND___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.INTERACTION_OPERAND___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.INTERACTION_OPERAND___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.INTERACTION_OPERAND___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.INTERACTION_OPERAND___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERACTION_OPERAND___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERACTION_OPERAND___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.INTERACTION_OPERAND___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.INTERACTION_OPERAND___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.INTERACTION_OPERAND___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_OPERAND___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_OPERAND___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_OPERAND___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___GET_LABEL :
-				return getLabel();
-			case UMLPackage.INTERACTION_OPERAND___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.INTERACTION_OPERAND___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.INTERACTION_OPERAND___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.INTERACTION_OPERAND___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.INTERACTION_OPERAND___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERACTION_OPERAND___SEPARATOR :
-				return separator();
-			case UMLPackage.INTERACTION_OPERAND___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.INTERACTION_OPERAND___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_OPERAND___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_OPERAND___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_OPERAND___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.INTERACTION_OPERAND___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.INTERACTION_OPERAND___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.INTERACTION_OPERAND___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.INTERACTION_OPERAND___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.INTERACTION_OPERAND___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.INTERACTION_OPERAND___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.INTERACTION_OPERAND___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.INTERACTION_OPERAND___VALIDATE_GUARD_CONTAIN_REFERENCES__DIAGNOSTICCHAIN_MAP :
-				return validateGuardContainReferences(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_OPERAND___VALIDATE_GUARD_DIRECTLY_PRIOR__DIAGNOSTICCHAIN_MAP :
-				return validateGuardDirectlyPrior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.INTERACTION_OPERAND___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.INTERACTION_OPERAND___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.INTERACTION_OPERAND___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.INTERACTION_OPERAND___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___GET_MODEL:
+			return getModel();
+		case UMLPackage.INTERACTION_OPERAND___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.INTERACTION_OPERAND___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.INTERACTION_OPERAND___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.INTERACTION_OPERAND___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.INTERACTION_OPERAND___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.INTERACTION_OPERAND___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.INTERACTION_OPERAND___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.INTERACTION_OPERAND___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.INTERACTION_OPERAND___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.INTERACTION_OPERAND___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___GET_LABEL:
+			return getLabel();
+		case UMLPackage.INTERACTION_OPERAND___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.INTERACTION_OPERAND___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.INTERACTION_OPERAND___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.INTERACTION_OPERAND___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERACTION_OPERAND___SEPARATOR:
+			return separator();
+		case UMLPackage.INTERACTION_OPERAND___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.INTERACTION_OPERAND___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.INTERACTION_OPERAND___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.INTERACTION_OPERAND___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.INTERACTION_OPERAND___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.INTERACTION_OPERAND___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.INTERACTION_OPERAND___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.INTERACTION_OPERAND___VALIDATE_GUARD_CONTAIN_REFERENCES__DIAGNOSTICCHAIN_MAP:
+			return validateGuardContainReferences((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_OPERAND___VALIDATE_GUARD_DIRECTLY_PRIOR__DIAGNOSTICCHAIN_MAP:
+			return validateGuardDirectlyPrior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1080,14 +957,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.INTERACTION_OPERAND__OWNED_COMMENT,
-		UMLPackage.INTERACTION_OPERAND__NAME_EXPRESSION,
-		UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT,
-		UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT,
-		UMLPackage.INTERACTION_OPERAND__OWNED_MEMBER,
-		UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING,
-		UMLPackage.INTERACTION_OPERAND__GUARD};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.INTERACTION_OPERAND__OWNED_COMMENT, UMLPackage.INTERACTION_OPERAND__NAME_EXPRESSION, UMLPackage.INTERACTION_OPERAND__ELEMENT_IMPORT,
+			UMLPackage.INTERACTION_OPERAND__PACKAGE_IMPORT, UMLPackage.INTERACTION_OPERAND__OWNED_MEMBER, UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING, UMLPackage.INTERACTION_OPERAND__GUARD };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1097,9 +968,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -1110,8 +979,8 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING)
-			|| eIsSet(UMLPackage.INTERACTION_OPERAND__GUARD);
+				|| eIsSet(UMLPackage.INTERACTION_OPERAND__GENERAL_ORDERING)
+				|| eIsSet(UMLPackage.INTERACTION_OPERAND__GUARD);
 	}
 
 	/**
@@ -1140,8 +1009,8 @@
 	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
-			|| eIsSet(UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND)
-			|| eIsSet(UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION);
+				|| eIsSet(UMLPackage.INTERACTION_OPERAND__ENCLOSING_OPERAND)
+				|| eIsSet(UMLPackage.INTERACTION_OPERAND__ENCLOSING_INTERACTION);
 	}
 
 	/**
@@ -1152,9 +1021,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.INTERACTION_OPERAND__OWNED_RULE,
-		UMLPackage.INTERACTION_OPERAND__FRAGMENT};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.INTERACTION_OPERAND__OWNED_RULE, UMLPackage.INTERACTION_OPERAND__FRAGMENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1164,7 +1031,7 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.INTERACTION_OPERAND__FRAGMENT);
+				|| eIsSet(UMLPackage.INTERACTION_OPERAND__FRAGMENT);
 	}
 
 } //InteractionOperandImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionUseImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionUseImpl.java
index 52a4696..2139084 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionUseImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InteractionUseImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,8 +28,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -106,20 +110,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.INTERACTION_USE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INTERACTION_USE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.INTERACTION_USE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.INTERACTION_USE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -128,9 +125,7 @@
 	 * @generated
 	 */
 	public Interaction getRefersTo() {
-		return (Interaction) eDynamicGet(
-			UMLPackage.INTERACTION_USE__REFERS_TO - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_USE__REFERS_TO, true, true);
+		return (Interaction) eDynamicGet(UMLPackage.INTERACTION_USE__REFERS_TO - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_USE__REFERS_TO, true, true);
 	}
 
 	/**
@@ -139,9 +134,7 @@
 	 * @generated
 	 */
 	public Interaction basicGetRefersTo() {
-		return (Interaction) eDynamicGet(
-			UMLPackage.INTERACTION_USE__REFERS_TO - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_USE__REFERS_TO, false, true);
+		return (Interaction) eDynamicGet(UMLPackage.INTERACTION_USE__REFERS_TO - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_USE__REFERS_TO, false, true);
 	}
 
 	/**
@@ -150,9 +143,7 @@
 	 * @generated
 	 */
 	public void setRefersTo(Interaction newRefersTo) {
-		eDynamicSet(
-			UMLPackage.INTERACTION_USE__REFERS_TO - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_USE__REFERS_TO, newRefersTo);
+		eDynamicSet(UMLPackage.INTERACTION_USE__REFERS_TO - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_USE__REFERS_TO, newRefersTo);
 	}
 
 	/**
@@ -161,9 +152,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getReturnValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.INTERACTION_USE__RETURN_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_USE__RETURN_VALUE, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.INTERACTION_USE__RETURN_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_USE__RETURN_VALUE, true, true);
 	}
 
 	/**
@@ -172,9 +161,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetReturnValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.INTERACTION_USE__RETURN_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_USE__RETURN_VALUE, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.INTERACTION_USE__RETURN_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_USE__RETURN_VALUE, false, true);
 	}
 
 	/**
@@ -184,8 +171,7 @@
 	 */
 	public NotificationChain basicSetReturnValue(
 			ValueSpecification newReturnValue, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newReturnValue,
-			UMLPackage.INTERACTION_USE__RETURN_VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newReturnValue, UMLPackage.INTERACTION_USE__RETURN_VALUE, msgs);
 		return msgs;
 	}
 
@@ -195,9 +181,7 @@
 	 * @generated
 	 */
 	public void setReturnValue(ValueSpecification newReturnValue) {
-		eDynamicSet(
-			UMLPackage.INTERACTION_USE__RETURN_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_USE__RETURN_VALUE, newReturnValue);
+		eDynamicSet(UMLPackage.INTERACTION_USE__RETURN_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_USE__RETURN_VALUE, newReturnValue);
 	}
 
 	/**
@@ -222,11 +206,7 @@
 	 * @generated
 	 */
 	public Property getReturnValueRecipient() {
-		return (Property) eDynamicGet(
-			UMLPackage.INTERACTION_USE__RETURN_VALUE_RECIPIENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_USE__RETURN_VALUE_RECIPIENT, true,
-			true);
+		return (Property) eDynamicGet(UMLPackage.INTERACTION_USE__RETURN_VALUE_RECIPIENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_USE__RETURN_VALUE_RECIPIENT, true, true);
 	}
 
 	/**
@@ -235,11 +215,7 @@
 	 * @generated
 	 */
 	public Property basicGetReturnValueRecipient() {
-		return (Property) eDynamicGet(
-			UMLPackage.INTERACTION_USE__RETURN_VALUE_RECIPIENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_USE__RETURN_VALUE_RECIPIENT, false,
-			true);
+		return (Property) eDynamicGet(UMLPackage.INTERACTION_USE__RETURN_VALUE_RECIPIENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_USE__RETURN_VALUE_RECIPIENT, false, true);
 	}
 
 	/**
@@ -248,11 +224,7 @@
 	 * @generated
 	 */
 	public void setReturnValueRecipient(Property newReturnValueRecipient) {
-		eDynamicSet(
-			UMLPackage.INTERACTION_USE__RETURN_VALUE_RECIPIENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_USE__RETURN_VALUE_RECIPIENT,
-			newReturnValueRecipient);
+		eDynamicSet(UMLPackage.INTERACTION_USE__RETURN_VALUE_RECIPIENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_USE__RETURN_VALUE_RECIPIENT, newReturnValueRecipient);
 	}
 
 	/**
@@ -262,9 +234,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Gate> getActualGates() {
-		return (EList<Gate>) eDynamicGet(
-			UMLPackage.INTERACTION_USE__ACTUAL_GATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_USE__ACTUAL_GATE, true, true);
+		return (EList<Gate>) eDynamicGet(UMLPackage.INTERACTION_USE__ACTUAL_GATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_USE__ACTUAL_GATE, true, true);
 	}
 
 	/**
@@ -296,16 +266,12 @@
 	 */
 	public Gate getActualGate(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		actualGateLoop : for (Gate actualGate : getActualGates()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(actualGate.getName())
-				: name.equals(actualGate.getName())))
+		actualGateLoop: for (Gate actualGate : getActualGates()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(actualGate.getName()) : name.equals(actualGate.getName())))
 				continue actualGateLoop;
 			return actualGate;
 		}
-		return createOnDemand
-			? createActualGate(name)
-			: null;
+		return createOnDemand ? createActualGate(name) : null;
 	}
 
 	/**
@@ -315,9 +281,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ValueSpecification> getArguments() {
-		return (EList<ValueSpecification>) eDynamicGet(
-			UMLPackage.INTERACTION_USE__ARGUMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_USE__ARGUMENT, true, true);
+		return (EList<ValueSpecification>) eDynamicGet(UMLPackage.INTERACTION_USE__ARGUMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_USE__ARGUMENT, true, true);
 	}
 
 	/**
@@ -352,20 +316,16 @@
 	 */
 	public ValueSpecification getArgument(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		argumentLoop : for (ValueSpecification argument : getArguments()) {
+		argumentLoop: for (ValueSpecification argument : getArguments()) {
 			if (eClass != null && !eClass.isInstance(argument))
 				continue argumentLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(argument.getName())
-				: name.equals(argument.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(argument.getName()) : name.equals(argument.getName())))
 				continue argumentLoop;
 			if (type != null && !type.equals(argument.getType()))
 				continue argumentLoop;
 			return argument;
 		}
-		return createOnDemand && eClass != null
-			? createArgument(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createArgument(name, type, eClass) : null;
 	}
 
 	/**
@@ -375,8 +335,7 @@
 	 */
 	public boolean validateGatesMatch(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InteractionUseOperations.validateGatesMatch(this, diagnostics,
-			context);
+		return InteractionUseOperations.validateGatesMatch(this, diagnostics, context);
 	}
 
 	/**
@@ -386,8 +345,7 @@
 	 */
 	public boolean validateAllLifelines(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InteractionUseOperations.validateAllLifelines(this, diagnostics,
-			context);
+		return InteractionUseOperations.validateAllLifelines(this, diagnostics, context);
 	}
 
 	/**
@@ -397,8 +355,7 @@
 	 */
 	public boolean validateArgumentsCorrespondToParameters(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return InteractionUseOperations.validateArgumentsCorrespondToParameters(
-			this, diagnostics, context);
+		return InteractionUseOperations.validateArgumentsCorrespondToParameters(this, diagnostics, context);
 	}
 
 	/**
@@ -408,9 +365,7 @@
 	 */
 	public boolean validateReturnValueTypeRecipientCorrespondence(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return InteractionUseOperations
-			.validateReturnValueTypeRecipientCorrespondence(this, diagnostics,
-				context);
+		return InteractionUseOperations.validateReturnValueTypeRecipientCorrespondence(this, diagnostics, context);
 	}
 
 	/**
@@ -420,8 +375,7 @@
 	 */
 	public boolean validateArgumentsAreConstants(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InteractionUseOperations.validateArgumentsAreConstants(this,
-			diagnostics, context);
+		return InteractionUseOperations.validateArgumentsAreConstants(this, diagnostics, context);
 	}
 
 	/**
@@ -431,8 +385,7 @@
 	 */
 	public boolean validateReturnValueRecipientCoverage(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return InteractionUseOperations
-			.validateReturnValueRecipientCoverage(this, diagnostics, context);
+		return InteractionUseOperations.validateReturnValueRecipientCoverage(this, diagnostics, context);
 	}
 
 	/**
@@ -444,32 +397,26 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_USE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION_USE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION_USE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.INTERACTION_USE__COVERED :
-				return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION_USE__ENCLOSING_OPERAND :
-				return basicSetEnclosingOperand(null, msgs);
-			case UMLPackage.INTERACTION_USE__ENCLOSING_INTERACTION :
-				return basicSetEnclosingInteraction(null, msgs);
-			case UMLPackage.INTERACTION_USE__GENERAL_ORDERING :
-				return ((InternalEList<?>) getGeneralOrderings())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION_USE__ACTUAL_GATE :
-				return ((InternalEList<?>) getActualGates())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERACTION_USE__ARGUMENT :
-				return ((InternalEList<?>) getArguments()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.INTERACTION_USE__RETURN_VALUE :
-				return basicSetReturnValue(null, msgs);
+		case UMLPackage.INTERACTION_USE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_USE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_USE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.INTERACTION_USE__COVERED:
+			return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_USE__ENCLOSING_OPERAND:
+			return basicSetEnclosingOperand(null, msgs);
+		case UMLPackage.INTERACTION_USE__ENCLOSING_INTERACTION:
+			return basicSetEnclosingInteraction(null, msgs);
+		case UMLPackage.INTERACTION_USE__GENERAL_ORDERING:
+			return ((InternalEList<?>) getGeneralOrderings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_USE__ACTUAL_GATE:
+			return ((InternalEList<?>) getActualGates()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_USE__ARGUMENT:
+			return ((InternalEList<?>) getArguments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERACTION_USE__RETURN_VALUE:
+			return basicSetReturnValue(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -482,60 +429,60 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_USE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INTERACTION_USE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INTERACTION_USE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INTERACTION_USE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INTERACTION_USE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INTERACTION_USE__NAME :
-				return getName();
-			case UMLPackage.INTERACTION_USE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INTERACTION_USE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INTERACTION_USE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERACTION_USE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INTERACTION_USE__COVERED :
-				return getCovereds();
-			case UMLPackage.INTERACTION_USE__ENCLOSING_OPERAND :
-				if (resolve)
-					return getEnclosingOperand();
-				return basicGetEnclosingOperand();
-			case UMLPackage.INTERACTION_USE__ENCLOSING_INTERACTION :
-				if (resolve)
-					return getEnclosingInteraction();
-				return basicGetEnclosingInteraction();
-			case UMLPackage.INTERACTION_USE__GENERAL_ORDERING :
-				return getGeneralOrderings();
-			case UMLPackage.INTERACTION_USE__ACTUAL_GATE :
-				return getActualGates();
-			case UMLPackage.INTERACTION_USE__ARGUMENT :
-				return getArguments();
-			case UMLPackage.INTERACTION_USE__REFERS_TO :
-				if (resolve)
-					return getRefersTo();
-				return basicGetRefersTo();
-			case UMLPackage.INTERACTION_USE__RETURN_VALUE :
-				if (resolve)
-					return getReturnValue();
-				return basicGetReturnValue();
-			case UMLPackage.INTERACTION_USE__RETURN_VALUE_RECIPIENT :
-				if (resolve)
-					return getReturnValueRecipient();
-				return basicGetReturnValueRecipient();
+		case UMLPackage.INTERACTION_USE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INTERACTION_USE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INTERACTION_USE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INTERACTION_USE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INTERACTION_USE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INTERACTION_USE__NAME:
+			return getName();
+		case UMLPackage.INTERACTION_USE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INTERACTION_USE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INTERACTION_USE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERACTION_USE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INTERACTION_USE__COVERED:
+			return getCovereds();
+		case UMLPackage.INTERACTION_USE__ENCLOSING_OPERAND:
+			if (resolve)
+				return getEnclosingOperand();
+			return basicGetEnclosingOperand();
+		case UMLPackage.INTERACTION_USE__ENCLOSING_INTERACTION:
+			if (resolve)
+				return getEnclosingInteraction();
+			return basicGetEnclosingInteraction();
+		case UMLPackage.INTERACTION_USE__GENERAL_ORDERING:
+			return getGeneralOrderings();
+		case UMLPackage.INTERACTION_USE__ACTUAL_GATE:
+			return getActualGates();
+		case UMLPackage.INTERACTION_USE__ARGUMENT:
+			return getArguments();
+		case UMLPackage.INTERACTION_USE__REFERS_TO:
+			if (resolve)
+				return getRefersTo();
+			return basicGetRefersTo();
+		case UMLPackage.INTERACTION_USE__RETURN_VALUE:
+			if (resolve)
+				return getReturnValue();
+			return basicGetReturnValue();
+		case UMLPackage.INTERACTION_USE__RETURN_VALUE_RECIPIENT:
+			if (resolve)
+				return getReturnValueRecipient();
+			return basicGetReturnValueRecipient();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -549,58 +496,54 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_USE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INTERACTION_USE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INTERACTION_USE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INTERACTION_USE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INTERACTION_USE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INTERACTION_USE__COVERED :
-				getCovereds().clear();
-				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
-				return;
-			case UMLPackage.INTERACTION_USE__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) newValue);
-				return;
-			case UMLPackage.INTERACTION_USE__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.INTERACTION_USE__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				getGeneralOrderings()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.INTERACTION_USE__ACTUAL_GATE :
-				getActualGates().clear();
-				getActualGates().addAll((Collection<? extends Gate>) newValue);
-				return;
-			case UMLPackage.INTERACTION_USE__ARGUMENT :
-				getArguments().clear();
-				getArguments().addAll(
-					(Collection<? extends ValueSpecification>) newValue);
-				return;
-			case UMLPackage.INTERACTION_USE__REFERS_TO :
-				setRefersTo((Interaction) newValue);
-				return;
-			case UMLPackage.INTERACTION_USE__RETURN_VALUE :
-				setReturnValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.INTERACTION_USE__RETURN_VALUE_RECIPIENT :
-				setReturnValueRecipient((Property) newValue);
-				return;
+		case UMLPackage.INTERACTION_USE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INTERACTION_USE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INTERACTION_USE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INTERACTION_USE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INTERACTION_USE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INTERACTION_USE__COVERED:
+			getCovereds().clear();
+			getCovereds().addAll((Collection<? extends Lifeline>) newValue);
+			return;
+		case UMLPackage.INTERACTION_USE__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) newValue);
+			return;
+		case UMLPackage.INTERACTION_USE__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.INTERACTION_USE__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			getGeneralOrderings().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.INTERACTION_USE__ACTUAL_GATE:
+			getActualGates().clear();
+			getActualGates().addAll((Collection<? extends Gate>) newValue);
+			return;
+		case UMLPackage.INTERACTION_USE__ARGUMENT:
+			getArguments().clear();
+			getArguments().addAll((Collection<? extends ValueSpecification>) newValue);
+			return;
+		case UMLPackage.INTERACTION_USE__REFERS_TO:
+			setRefersTo((Interaction) newValue);
+			return;
+		case UMLPackage.INTERACTION_USE__RETURN_VALUE:
+			setReturnValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.INTERACTION_USE__RETURN_VALUE_RECIPIENT:
+			setReturnValueRecipient((Property) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -613,48 +556,48 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_USE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INTERACTION_USE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INTERACTION_USE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INTERACTION_USE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INTERACTION_USE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INTERACTION_USE__COVERED :
-				getCovereds().clear();
-				return;
-			case UMLPackage.INTERACTION_USE__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) null);
-				return;
-			case UMLPackage.INTERACTION_USE__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) null);
-				return;
-			case UMLPackage.INTERACTION_USE__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				return;
-			case UMLPackage.INTERACTION_USE__ACTUAL_GATE :
-				getActualGates().clear();
-				return;
-			case UMLPackage.INTERACTION_USE__ARGUMENT :
-				getArguments().clear();
-				return;
-			case UMLPackage.INTERACTION_USE__REFERS_TO :
-				setRefersTo((Interaction) null);
-				return;
-			case UMLPackage.INTERACTION_USE__RETURN_VALUE :
-				setReturnValue((ValueSpecification) null);
-				return;
-			case UMLPackage.INTERACTION_USE__RETURN_VALUE_RECIPIENT :
-				setReturnValueRecipient((Property) null);
-				return;
+		case UMLPackage.INTERACTION_USE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INTERACTION_USE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INTERACTION_USE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INTERACTION_USE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INTERACTION_USE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INTERACTION_USE__COVERED:
+			getCovereds().clear();
+			return;
+		case UMLPackage.INTERACTION_USE__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) null);
+			return;
+		case UMLPackage.INTERACTION_USE__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) null);
+			return;
+		case UMLPackage.INTERACTION_USE__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			return;
+		case UMLPackage.INTERACTION_USE__ACTUAL_GATE:
+			getActualGates().clear();
+			return;
+		case UMLPackage.INTERACTION_USE__ARGUMENT:
+			getArguments().clear();
+			return;
+		case UMLPackage.INTERACTION_USE__REFERS_TO:
+			setRefersTo((Interaction) null);
+			return;
+		case UMLPackage.INTERACTION_USE__RETURN_VALUE:
+			setReturnValue((ValueSpecification) null);
+			return;
+		case UMLPackage.INTERACTION_USE__RETURN_VALUE_RECIPIENT:
+			setReturnValueRecipient((Property) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -667,46 +610,44 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERACTION_USE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INTERACTION_USE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INTERACTION_USE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INTERACTION_USE__OWNER :
-				return isSetOwner();
-			case UMLPackage.INTERACTION_USE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INTERACTION_USE__NAME :
-				return isSetName();
-			case UMLPackage.INTERACTION_USE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INTERACTION_USE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INTERACTION_USE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INTERACTION_USE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INTERACTION_USE__COVERED :
-				return !getCovereds().isEmpty();
-			case UMLPackage.INTERACTION_USE__ENCLOSING_OPERAND :
-				return basicGetEnclosingOperand() != null;
-			case UMLPackage.INTERACTION_USE__ENCLOSING_INTERACTION :
-				return basicGetEnclosingInteraction() != null;
-			case UMLPackage.INTERACTION_USE__GENERAL_ORDERING :
-				return !getGeneralOrderings().isEmpty();
-			case UMLPackage.INTERACTION_USE__ACTUAL_GATE :
-				return !getActualGates().isEmpty();
-			case UMLPackage.INTERACTION_USE__ARGUMENT :
-				return !getArguments().isEmpty();
-			case UMLPackage.INTERACTION_USE__REFERS_TO :
-				return basicGetRefersTo() != null;
-			case UMLPackage.INTERACTION_USE__RETURN_VALUE :
-				return basicGetReturnValue() != null;
-			case UMLPackage.INTERACTION_USE__RETURN_VALUE_RECIPIENT :
-				return basicGetReturnValueRecipient() != null;
+		case UMLPackage.INTERACTION_USE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INTERACTION_USE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INTERACTION_USE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INTERACTION_USE__OWNER:
+			return isSetOwner();
+		case UMLPackage.INTERACTION_USE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INTERACTION_USE__NAME:
+			return isSetName();
+		case UMLPackage.INTERACTION_USE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INTERACTION_USE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INTERACTION_USE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INTERACTION_USE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INTERACTION_USE__COVERED:
+			return !getCovereds().isEmpty();
+		case UMLPackage.INTERACTION_USE__ENCLOSING_OPERAND:
+			return basicGetEnclosingOperand() != null;
+		case UMLPackage.INTERACTION_USE__ENCLOSING_INTERACTION:
+			return basicGetEnclosingInteraction() != null;
+		case UMLPackage.INTERACTION_USE__GENERAL_ORDERING:
+			return !getGeneralOrderings().isEmpty();
+		case UMLPackage.INTERACTION_USE__ACTUAL_GATE:
+			return !getActualGates().isEmpty();
+		case UMLPackage.INTERACTION_USE__ARGUMENT:
+			return !getArguments().isEmpty();
+		case UMLPackage.INTERACTION_USE__REFERS_TO:
+			return basicGetRefersTo() != null;
+		case UMLPackage.INTERACTION_USE__RETURN_VALUE:
+			return basicGetReturnValue() != null;
+		case UMLPackage.INTERACTION_USE__RETURN_VALUE_RECIPIENT:
+			return basicGetReturnValueRecipient() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -721,147 +662,122 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.INTERACTION_USE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_USE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_USE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.INTERACTION_USE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.INTERACTION_USE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.INTERACTION_USE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.INTERACTION_USE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERACTION_USE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___GET_MODEL :
-				return getModel();
-			case UMLPackage.INTERACTION_USE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.INTERACTION_USE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.INTERACTION_USE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.INTERACTION_USE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.INTERACTION_USE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.INTERACTION_USE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.INTERACTION_USE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERACTION_USE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERACTION_USE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.INTERACTION_USE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.INTERACTION_USE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.INTERACTION_USE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_USE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_USE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_USE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.INTERACTION_USE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.INTERACTION_USE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.INTERACTION_USE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.INTERACTION_USE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.INTERACTION_USE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.INTERACTION_USE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERACTION_USE___SEPARATOR :
-				return separator();
-			case UMLPackage.INTERACTION_USE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.INTERACTION_USE___VALIDATE_GATES_MATCH__DIAGNOSTICCHAIN_MAP :
-				return validateGatesMatch((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_USE___VALIDATE_ARGUMENTS_ARE_CONSTANTS__DIAGNOSTICCHAIN_MAP :
-				return validateArgumentsAreConstants(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_USE___VALIDATE_RETURN_VALUE_RECIPIENT_COVERAGE__DIAGNOSTICCHAIN_MAP :
-				return validateReturnValueRecipientCoverage(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_USE___VALIDATE_ARGUMENTS_CORRESPOND_TO_PARAMETERS__DIAGNOSTICCHAIN_MAP :
-				return validateArgumentsCorrespondToParameters(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_USE___VALIDATE_RETURN_VALUE_TYPE_RECIPIENT_CORRESPONDENCE__DIAGNOSTICCHAIN_MAP :
-				return validateReturnValueTypeRecipientCorrespondence(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERACTION_USE___VALIDATE_ALL_LIFELINES__DIAGNOSTICCHAIN_MAP :
-				return validateAllLifelines((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_USE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_USE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_USE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.INTERACTION_USE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.INTERACTION_USE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.INTERACTION_USE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.INTERACTION_USE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERACTION_USE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___GET_MODEL:
+			return getModel();
+		case UMLPackage.INTERACTION_USE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.INTERACTION_USE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.INTERACTION_USE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.INTERACTION_USE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.INTERACTION_USE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.INTERACTION_USE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.INTERACTION_USE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERACTION_USE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERACTION_USE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.INTERACTION_USE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.INTERACTION_USE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.INTERACTION_USE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_USE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_USE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_USE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.INTERACTION_USE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.INTERACTION_USE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.INTERACTION_USE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.INTERACTION_USE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.INTERACTION_USE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.INTERACTION_USE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERACTION_USE___SEPARATOR:
+			return separator();
+		case UMLPackage.INTERACTION_USE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.INTERACTION_USE___VALIDATE_GATES_MATCH__DIAGNOSTICCHAIN_MAP:
+			return validateGatesMatch((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_USE___VALIDATE_ARGUMENTS_ARE_CONSTANTS__DIAGNOSTICCHAIN_MAP:
+			return validateArgumentsAreConstants((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_USE___VALIDATE_RETURN_VALUE_RECIPIENT_COVERAGE__DIAGNOSTICCHAIN_MAP:
+			return validateReturnValueRecipientCoverage((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_USE___VALIDATE_ARGUMENTS_CORRESPOND_TO_PARAMETERS__DIAGNOSTICCHAIN_MAP:
+			return validateArgumentsCorrespondToParameters((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_USE___VALIDATE_RETURN_VALUE_TYPE_RECIPIENT_CORRESPONDENCE__DIAGNOSTICCHAIN_MAP:
+			return validateReturnValueTypeRecipientCorrespondence((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERACTION_USE___VALIDATE_ALL_LIFELINES__DIAGNOSTICCHAIN_MAP:
+			return validateAllLifelines((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -874,13 +790,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.INTERACTION_USE__OWNED_COMMENT,
-		UMLPackage.INTERACTION_USE__NAME_EXPRESSION,
-		UMLPackage.INTERACTION_USE__GENERAL_ORDERING,
-		UMLPackage.INTERACTION_USE__ACTUAL_GATE,
-		UMLPackage.INTERACTION_USE__ARGUMENT,
-		UMLPackage.INTERACTION_USE__RETURN_VALUE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.INTERACTION_USE__OWNED_COMMENT, UMLPackage.INTERACTION_USE__NAME_EXPRESSION, UMLPackage.INTERACTION_USE__GENERAL_ORDERING, UMLPackage.INTERACTION_USE__ACTUAL_GATE,
+			UMLPackage.INTERACTION_USE__ARGUMENT, UMLPackage.INTERACTION_USE__RETURN_VALUE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -890,9 +801,9 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.INTERACTION_USE__ACTUAL_GATE)
-			|| eIsSet(UMLPackage.INTERACTION_USE__ARGUMENT)
-			|| eIsSet(UMLPackage.INTERACTION_USE__RETURN_VALUE);
+				|| eIsSet(UMLPackage.INTERACTION_USE__ACTUAL_GATE)
+				|| eIsSet(UMLPackage.INTERACTION_USE__ARGUMENT)
+				|| eIsSet(UMLPackage.INTERACTION_USE__RETURN_VALUE);
 	}
 
 } //InteractionUseImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InterfaceImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InterfaceImpl.java
index 364adda..0e001d3 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InterfaceImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InterfaceImpl.java
@@ -1,34 +1,47 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
+
 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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectResolvingEList;
+
 import org.eclipse.uml2.uml.AggregationKind;
 import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.CollaborationUse;
@@ -60,6 +73,7 @@
 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;
 
 /**
@@ -107,17 +121,9 @@
 		return UMLPackage.Literals.INTERFACE;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.CLASSIFIER__REDEFINED_CLASSIFIER) {
 			return createRedefinedClassifiersList();
 		}
@@ -140,19 +146,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Property> attributes = (EList<Property>) cache.get(eResource,
-				this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
+			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>(
-						Property.class, this, UMLPackage.INTERFACE__ATTRIBUTE,
-						ATTRIBUTE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE, attributes = new DerivedUnionEObjectEList<Property>(Property.class, this, UMLPackage.INTERFACE__ATTRIBUTE, ATTRIBUTE_ESUBSETS));
 			}
 			return attributes;
 		}
-		return new DerivedUnionEObjectEList<Property>(Property.class, this,
-			UMLPackage.INTERFACE__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Property>(Property.class, this, UMLPackage.INTERFACE__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
 	}
 
 	/**
@@ -166,20 +166,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.INTERFACE__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.INTERFACE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.INTERFACE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.INTERFACE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -193,19 +186,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Feature> features = (EList<Feature>) cache.get(eResource,
-				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
+			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>(
-						Feature.class, this, UMLPackage.INTERFACE__FEATURE,
-						FEATURE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.CLASSIFIER__FEATURE, features = new DerivedUnionEObjectEList<Feature>(Feature.class, this, UMLPackage.INTERFACE__FEATURE, FEATURE_ESUBSETS));
 			}
 			return features;
 		}
-		return new DerivedUnionEObjectEList<Feature>(Feature.class, this,
-			UMLPackage.INTERFACE__FEATURE, FEATURE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this, UMLPackage.INTERFACE__FEATURE, FEATURE_ESUBSETS);
 	}
 
 	/**
@@ -215,9 +202,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Property> getOwnedAttributes() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.INTERFACE__OWNED_ATTRIBUTE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERFACE__OWNED_ATTRIBUTE, true, true);
+		return (EList<Property>) eDynamicGet(UMLPackage.INTERFACE__OWNED_ATTRIBUTE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERFACE__OWNED_ATTRIBUTE, true, true);
 	}
 
 	/**
@@ -261,20 +246,16 @@
 	 */
 	public Property getOwnedAttribute(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		ownedAttributeLoop : for (Property ownedAttribute : getOwnedAttributes()) {
+		ownedAttributeLoop: for (Property ownedAttribute : getOwnedAttributes()) {
 			if (eClass != null && !eClass.isInstance(ownedAttribute))
 				continue ownedAttributeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedAttribute.getName())
-				: name.equals(ownedAttribute.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedAttribute.getName()) : name.equals(ownedAttribute.getName())))
 				continue ownedAttributeLoop;
 			if (type != null && !type.equals(ownedAttribute.getType()))
 				continue ownedAttributeLoop;
 			return ownedAttribute;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedAttribute(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedAttribute(name, type, eClass) : null;
 	}
 
 	/**
@@ -284,9 +265,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Classifier> getNestedClassifiers() {
-		return (EList<Classifier>) eDynamicGet(
-			UMLPackage.INTERFACE__NESTED_CLASSIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERFACE__NESTED_CLASSIFIER, true, true);
+		return (EList<Classifier>) eDynamicGet(UMLPackage.INTERFACE__NESTED_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERFACE__NESTED_CLASSIFIER, true, true);
 	}
 
 	/**
@@ -318,18 +297,14 @@
 	 */
 	public Classifier getNestedClassifier(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		nestedClassifierLoop : for (Classifier nestedClassifier : getNestedClassifiers()) {
+		nestedClassifierLoop: for (Classifier nestedClassifier : getNestedClassifiers()) {
 			if (eClass != null && !eClass.isInstance(nestedClassifier))
 				continue nestedClassifierLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(nestedClassifier.getName())
-				: name.equals(nestedClassifier.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(nestedClassifier.getName()) : name.equals(nestedClassifier.getName())))
 				continue nestedClassifierLoop;
 			return nestedClassifier;
 		}
-		return createOnDemand && eClass != null
-			? createNestedClassifier(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createNestedClassifier(name, eClass) : null;
 	}
 
 	/**
@@ -339,15 +314,13 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Interface> getRedefinedInterfaces() {
-		return (EList<Interface>) eDynamicGet(
-			UMLPackage.INTERFACE__REDEFINED_INTERFACE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERFACE__REDEFINED_INTERFACE, true, true);
+		return (EList<Interface>) eDynamicGet(UMLPackage.INTERFACE__REDEFINED_INTERFACE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERFACE__REDEFINED_INTERFACE, true, true);
 	}
 
 	private EList<Interface> createRedefinedInterfacesList() {
 		return new SubsetSupersetEObjectResolvingEList<Interface>(
-			Interface.class, this, UMLPackage.INTERFACE__REDEFINED_INTERFACE,
-			REDEFINED_INTERFACE_ESUPERSETS, null);
+				Interface.class, this, UMLPackage.INTERFACE__REDEFINED_INTERFACE,
+				REDEFINED_INTERFACE_ESUPERSETS, null);
 	}
 
 	/**
@@ -357,9 +330,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Reception> getOwnedReceptions() {
-		return (EList<Reception>) eDynamicGet(
-			UMLPackage.INTERFACE__OWNED_RECEPTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERFACE__OWNED_RECEPTION, true, true);
+		return (EList<Reception>) eDynamicGet(UMLPackage.INTERFACE__OWNED_RECEPTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERFACE__OWNED_RECEPTION, true, true);
 	}
 
 	/**
@@ -370,29 +341,19 @@
 	public Reception createOwnedReception(String name,
 			EList<String> ownedParameterNames,
 			EList<Type> ownedParameterTypes) {
-		Reception newOwnedReception = (Reception) create(
-			UMLPackage.Literals.RECEPTION);
+		Reception newOwnedReception = (Reception) create(UMLPackage.Literals.RECEPTION);
 		getOwnedReceptions().add(newOwnedReception);
 		if (name != null)
 			newOwnedReception.setName(name);
 		int ownedParameterListSize = 0;
-		int ownedParameterNamesSize = ownedParameterNames == null
-			? 0
-			: ownedParameterNames.size();
+		int ownedParameterNamesSize = ownedParameterNames == null ? 0 : ownedParameterNames.size();
 		if (ownedParameterNamesSize > ownedParameterListSize)
 			ownedParameterListSize = ownedParameterNamesSize;
-		int ownedParameterTypesSize = ownedParameterTypes == null
-			? 0
-			: ownedParameterTypes.size();
+		int ownedParameterTypesSize = ownedParameterTypes == null ? 0 : ownedParameterTypes.size();
 		if (ownedParameterTypesSize > ownedParameterListSize)
 			ownedParameterListSize = ownedParameterTypesSize;
 		for (int i = 0; i < ownedParameterListSize; i++) {
-			newOwnedReception.createOwnedParameter(i < ownedParameterNamesSize
-				? (String) ownedParameterNames.get(i)
-				: null,
-				i < ownedParameterTypesSize
-					? (Type) ownedParameterTypes.get(i)
-					: null);
+			newOwnedReception.createOwnedParameter(i < ownedParameterNamesSize ? (String) ownedParameterNames.get(i) : null, i < ownedParameterTypesSize ? (Type) ownedParameterTypes.get(i) : null);
 		}
 		return newOwnedReception;
 	}
@@ -405,8 +366,7 @@
 	public Reception getOwnedReception(String name,
 			EList<String> ownedParameterNames,
 			EList<Type> ownedParameterTypes) {
-		return getOwnedReception(name, ownedParameterNames, ownedParameterTypes,
-			false, false);
+		return getOwnedReception(name, ownedParameterNames, ownedParameterTypes, false, false);
 	}
 
 	/**
@@ -417,37 +377,23 @@
 	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())))
+		ownedReceptionLoop: for (Reception ownedReception : getOwnedReceptions()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedReception.getName()) : name.equals(ownedReception.getName())))
 				continue ownedReceptionLoop;
-			EList<Parameter> ownedParameterList = ownedReception
-				.getOwnedParameters();
+			EList<Parameter> ownedParameterList = ownedReception.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
-			if (ownedParameterNames != null
-				&& ownedParameterNames.size() != ownedParameterListSize
-				|| (ownedParameterTypes != null
-					&& ownedParameterTypes.size() != ownedParameterListSize))
+			if (ownedParameterNames != null && ownedParameterNames.size() != ownedParameterListSize || (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue ownedReceptionLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
 				Parameter ownedParameter = ownedParameterList.get(j);
-				if (ownedParameterNames != null && !(ignoreCase
-					? (ownedParameterNames.get(j))
-						.equalsIgnoreCase(ownedParameter.getName())
-					: ownedParameterNames.get(j)
-						.equals(ownedParameter.getName())))
+				if (ownedParameterNames != null && !(ignoreCase ? (ownedParameterNames.get(j)).equalsIgnoreCase(ownedParameter.getName()) : ownedParameterNames.get(j).equals(ownedParameter.getName())))
 					continue ownedReceptionLoop;
-				if (ownedParameterTypes != null && !ownedParameterTypes.get(j)
-					.equals(ownedParameter.getType()))
+				if (ownedParameterTypes != null && !ownedParameterTypes.get(j).equals(ownedParameter.getType()))
 					continue ownedReceptionLoop;
 			}
 			return ownedReception;
 		}
-		return createOnDemand
-			? createOwnedReception(name, ownedParameterNames,
-				ownedParameterTypes)
-			: null;
+		return createOnDemand ? createOwnedReception(name, ownedParameterNames, ownedParameterTypes) : null;
 	}
 
 	/**
@@ -456,9 +402,7 @@
 	 * @generated
 	 */
 	public ProtocolStateMachine getProtocol() {
-		return (ProtocolStateMachine) eDynamicGet(
-			UMLPackage.INTERFACE__PROTOCOL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERFACE__PROTOCOL, true, true);
+		return (ProtocolStateMachine) eDynamicGet(UMLPackage.INTERFACE__PROTOCOL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERFACE__PROTOCOL, true, true);
 	}
 
 	/**
@@ -467,9 +411,7 @@
 	 * @generated
 	 */
 	public ProtocolStateMachine basicGetProtocol() {
-		return (ProtocolStateMachine) eDynamicGet(
-			UMLPackage.INTERFACE__PROTOCOL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERFACE__PROTOCOL, false, true);
+		return (ProtocolStateMachine) eDynamicGet(UMLPackage.INTERFACE__PROTOCOL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERFACE__PROTOCOL, false, true);
 	}
 
 	/**
@@ -479,8 +421,7 @@
 	 */
 	public NotificationChain basicSetProtocol(ProtocolStateMachine newProtocol,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newProtocol,
-			UMLPackage.INTERFACE__PROTOCOL, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newProtocol, UMLPackage.INTERFACE__PROTOCOL, msgs);
 		return msgs;
 	}
 
@@ -490,8 +431,7 @@
 	 * @generated
 	 */
 	public void setProtocol(ProtocolStateMachine newProtocol) {
-		eDynamicSet(UMLPackage.INTERFACE__PROTOCOL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERFACE__PROTOCOL, newProtocol);
+		eDynamicSet(UMLPackage.INTERFACE__PROTOCOL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERFACE__PROTOCOL, newProtocol);
 	}
 
 	/**
@@ -500,8 +440,7 @@
 	 * @generated
 	 */
 	public ProtocolStateMachine createProtocol(String name) {
-		ProtocolStateMachine newProtocol = (ProtocolStateMachine) create(
-			UMLPackage.Literals.PROTOCOL_STATE_MACHINE);
+		ProtocolStateMachine newProtocol = (ProtocolStateMachine) create(UMLPackage.Literals.PROTOCOL_STATE_MACHINE);
 		setProtocol(newProtocol);
 		if (name != null)
 			newProtocol.setName(name);
@@ -515,9 +454,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Operation> getOwnedOperations() {
-		return (EList<Operation>) eDynamicGet(
-			UMLPackage.INTERFACE__OWNED_OPERATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERFACE__OWNED_OPERATION, true, true);
+		return (EList<Operation>) eDynamicGet(UMLPackage.INTERFACE__OWNED_OPERATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERFACE__OWNED_OPERATION, true, true);
 	}
 
 	/**
@@ -528,29 +465,19 @@
 	public Operation createOwnedOperation(String name,
 			EList<String> ownedParameterNames,
 			EList<Type> ownedParameterTypes) {
-		Operation newOwnedOperation = (Operation) create(
-			UMLPackage.Literals.OPERATION);
+		Operation newOwnedOperation = (Operation) create(UMLPackage.Literals.OPERATION);
 		getOwnedOperations().add(newOwnedOperation);
 		if (name != null)
 			newOwnedOperation.setName(name);
 		int ownedParameterListSize = 0;
-		int ownedParameterNamesSize = ownedParameterNames == null
-			? 0
-			: ownedParameterNames.size();
+		int ownedParameterNamesSize = ownedParameterNames == null ? 0 : ownedParameterNames.size();
 		if (ownedParameterNamesSize > ownedParameterListSize)
 			ownedParameterListSize = ownedParameterNamesSize;
-		int ownedParameterTypesSize = ownedParameterTypes == null
-			? 0
-			: ownedParameterTypes.size();
+		int ownedParameterTypesSize = ownedParameterTypes == null ? 0 : ownedParameterTypes.size();
 		if (ownedParameterTypesSize > ownedParameterListSize)
 			ownedParameterListSize = ownedParameterTypesSize;
 		for (int i = 0; i < ownedParameterListSize; i++) {
-			newOwnedOperation.createOwnedParameter(i < ownedParameterNamesSize
-				? (String) ownedParameterNames.get(i)
-				: null,
-				i < ownedParameterTypesSize
-					? (Type) ownedParameterTypes.get(i)
-					: null);
+			newOwnedOperation.createOwnedParameter(i < ownedParameterNamesSize ? (String) ownedParameterNames.get(i) : null, i < ownedParameterTypesSize ? (Type) ownedParameterTypes.get(i) : null);
 		}
 		return newOwnedOperation;
 	}
@@ -563,8 +490,7 @@
 	public Operation getOwnedOperation(String name,
 			EList<String> ownedParameterNames,
 			EList<Type> ownedParameterTypes) {
-		return getOwnedOperation(name, ownedParameterNames, ownedParameterTypes,
-			false, false);
+		return getOwnedOperation(name, ownedParameterNames, ownedParameterTypes, false, false);
 	}
 
 	/**
@@ -575,37 +501,23 @@
 	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())))
+		ownedOperationLoop: for (Operation ownedOperation : getOwnedOperations()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedOperation.getName()) : name.equals(ownedOperation.getName())))
 				continue ownedOperationLoop;
-			EList<Parameter> ownedParameterList = ownedOperation
-				.getOwnedParameters();
+			EList<Parameter> ownedParameterList = ownedOperation.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
-			if (ownedParameterNames != null
-				&& ownedParameterNames.size() != ownedParameterListSize
-				|| (ownedParameterTypes != null
-					&& ownedParameterTypes.size() != ownedParameterListSize))
+			if (ownedParameterNames != null && ownedParameterNames.size() != ownedParameterListSize || (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue ownedOperationLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
 				Parameter ownedParameter = ownedParameterList.get(j);
-				if (ownedParameterNames != null && !(ignoreCase
-					? (ownedParameterNames.get(j))
-						.equalsIgnoreCase(ownedParameter.getName())
-					: ownedParameterNames.get(j)
-						.equals(ownedParameter.getName())))
+				if (ownedParameterNames != null && !(ignoreCase ? (ownedParameterNames.get(j)).equalsIgnoreCase(ownedParameter.getName()) : ownedParameterNames.get(j).equals(ownedParameter.getName())))
 					continue ownedOperationLoop;
-				if (ownedParameterTypes != null && !ownedParameterTypes.get(j)
-					.equals(ownedParameter.getType()))
+				if (ownedParameterTypes != null && !ownedParameterTypes.get(j).equals(ownedParameter.getType()))
 					continue ownedOperationLoop;
 			}
 			return ownedOperation;
 		}
-		return createOnDemand
-			? createOwnedOperation(name, ownedParameterNames,
-				ownedParameterTypes)
-			: null;
+		return createOnDemand ? createOwnedOperation(name, ownedParameterNames, ownedParameterTypes) : null;
 	}
 
 	/**
@@ -615,8 +527,7 @@
 	 */
 	public boolean validateVisibility(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InterfaceOperations.validateVisibility(this, diagnostics,
-			context);
+		return InterfaceOperations.validateVisibility(this, diagnostics, context);
 	}
 
 	/**
@@ -627,8 +538,7 @@
 	public Operation createOwnedOperation(String name,
 			EList<String> parameterNames, EList<Type> parameterTypes,
 			Type returnType) {
-		return InterfaceOperations.createOwnedOperation(this, name,
-			parameterNames, parameterTypes, returnType);
+		return InterfaceOperations.createOwnedOperation(this, name, parameterNames, parameterTypes, returnType);
 	}
 
 	/**
@@ -638,8 +548,7 @@
 	 */
 	public Property createOwnedAttribute(String name, Type type, int lower,
 			int upper) {
-		return InterfaceOperations.createOwnedAttribute(this, name, type, lower,
-			upper);
+		return InterfaceOperations.createOwnedAttribute(this, name, type, lower, upper);
 	}
 
 	/**
@@ -652,62 +561,42 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INTERFACE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERFACE__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERFACE__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERFACE__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERFACE__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.INTERFACE__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.INTERFACE__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.INTERFACE__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERFACE__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERFACE__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERFACE__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERFACE__OWNED_ATTRIBUTE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedAttributes())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERFACE__OWNED_OPERATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERFACE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERFACE__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERFACE__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERFACE__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERFACE__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.INTERFACE__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.INTERFACE__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.INTERFACE__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERFACE__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERFACE__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERFACE__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERFACE__OWNED_ATTRIBUTE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedAttributes()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERFACE__OWNED_OPERATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -721,64 +610,48 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INTERFACE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERFACE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERFACE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.INTERFACE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERFACE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERFACE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.INTERFACE__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERFACE__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERFACE__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERFACE__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERFACE__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.INTERFACE__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERFACE__NESTED_CLASSIFIER :
-				return ((InternalEList<?>) getNestedClassifiers())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERFACE__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERFACE__OWNED_RECEPTION :
-				return ((InternalEList<?>) getOwnedReceptions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERFACE__PROTOCOL :
-				return basicSetProtocol(null, msgs);
-			case UMLPackage.INTERFACE__OWNED_OPERATION :
-				return ((InternalEList<?>) getOwnedOperations())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.INTERFACE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.INTERFACE__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE__NESTED_CLASSIFIER:
+			return ((InternalEList<?>) getNestedClassifiers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE__OWNED_RECEPTION:
+			return ((InternalEList<?>) getOwnedReceptions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE__PROTOCOL:
+			return basicSetProtocol(null, msgs);
+		case UMLPackage.INTERFACE__OWNED_OPERATION:
+			return ((InternalEList<?>) getOwnedOperations()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -791,112 +664,112 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INTERFACE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INTERFACE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INTERFACE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INTERFACE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INTERFACE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INTERFACE__NAME :
-				return getName();
-			case UMLPackage.INTERFACE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INTERFACE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INTERFACE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERFACE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INTERFACE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.INTERFACE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.INTERFACE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.INTERFACE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.INTERFACE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.INTERFACE__MEMBER :
-				return getMembers();
-			case UMLPackage.INTERFACE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.INTERFACE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.INTERFACE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.INTERFACE__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.INTERFACE__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.INTERFACE__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.INTERFACE__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.INTERFACE__FEATURE :
-				return getFeatures();
-			case UMLPackage.INTERFACE__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.INTERFACE__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.INTERFACE__GENERAL :
-				return getGenerals();
-			case UMLPackage.INTERFACE__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.INTERFACE__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.INTERFACE__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.INTERFACE__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.INTERFACE__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.INTERFACE__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.INTERFACE__USE_CASE :
-				return getUseCases();
-			case UMLPackage.INTERFACE__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.INTERFACE__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.INTERFACE__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.INTERFACE__NESTED_CLASSIFIER :
-				return getNestedClassifiers();
-			case UMLPackage.INTERFACE__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.INTERFACE__OWNED_RECEPTION :
-				return getOwnedReceptions();
-			case UMLPackage.INTERFACE__PROTOCOL :
-				if (resolve)
-					return getProtocol();
-				return basicGetProtocol();
-			case UMLPackage.INTERFACE__REDEFINED_INTERFACE :
-				return getRedefinedInterfaces();
-			case UMLPackage.INTERFACE__OWNED_OPERATION :
-				return getOwnedOperations();
+		case UMLPackage.INTERFACE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INTERFACE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INTERFACE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INTERFACE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INTERFACE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INTERFACE__NAME:
+			return getName();
+		case UMLPackage.INTERFACE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INTERFACE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INTERFACE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERFACE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INTERFACE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.INTERFACE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.INTERFACE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.INTERFACE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.INTERFACE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.INTERFACE__MEMBER:
+			return getMembers();
+		case UMLPackage.INTERFACE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.INTERFACE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.INTERFACE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.INTERFACE__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.INTERFACE__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.INTERFACE__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.INTERFACE__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.INTERFACE__FEATURE:
+			return getFeatures();
+		case UMLPackage.INTERFACE__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.INTERFACE__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.INTERFACE__GENERAL:
+			return getGenerals();
+		case UMLPackage.INTERFACE__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.INTERFACE__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.INTERFACE__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.INTERFACE__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.INTERFACE__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.INTERFACE__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.INTERFACE__USE_CASE:
+			return getUseCases();
+		case UMLPackage.INTERFACE__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.INTERFACE__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.INTERFACE__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.INTERFACE__NESTED_CLASSIFIER:
+			return getNestedClassifiers();
+		case UMLPackage.INTERFACE__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.INTERFACE__OWNED_RECEPTION:
+			return getOwnedReceptions();
+		case UMLPackage.INTERFACE__PROTOCOL:
+			if (resolve)
+				return getProtocol();
+			return basicGetProtocol();
+		case UMLPackage.INTERFACE__REDEFINED_INTERFACE:
+			return getRedefinedInterfaces();
+		case UMLPackage.INTERFACE__OWNED_OPERATION:
+			return getOwnedOperations();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -910,136 +783,118 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INTERFACE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INTERFACE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INTERFACE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INTERFACE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INTERFACE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INTERFACE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.INTERFACE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.INTERFACE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.INTERFACE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.INTERFACE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INTERFACE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INTERFACE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.INTERFACE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.INTERFACE__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.INTERFACE__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.INTERFACE__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.INTERFACE__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.INTERFACE__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.INTERFACE__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.INTERFACE__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.INTERFACE__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.INTERFACE__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.INTERFACE__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.INTERFACE__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.INTERFACE__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				getNestedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.INTERFACE__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.INTERFACE__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				getOwnedReceptions()
-					.addAll((Collection<? extends Reception>) newValue);
-				return;
-			case UMLPackage.INTERFACE__PROTOCOL :
-				setProtocol((ProtocolStateMachine) newValue);
-				return;
-			case UMLPackage.INTERFACE__REDEFINED_INTERFACE :
-				getRedefinedInterfaces().clear();
-				getRedefinedInterfaces()
-					.addAll((Collection<? extends Interface>) newValue);
-				return;
-			case UMLPackage.INTERFACE__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
+		case UMLPackage.INTERFACE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INTERFACE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INTERFACE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INTERFACE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INTERFACE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INTERFACE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.INTERFACE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.INTERFACE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.INTERFACE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.INTERFACE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INTERFACE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INTERFACE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.INTERFACE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.INTERFACE__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.INTERFACE__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.INTERFACE__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.INTERFACE__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.INTERFACE__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.INTERFACE__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.INTERFACE__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.INTERFACE__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.INTERFACE__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.INTERFACE__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.INTERFACE__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.INTERFACE__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			getNestedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.INTERFACE__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.INTERFACE__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			getOwnedReceptions().addAll((Collection<? extends Reception>) newValue);
+			return;
+		case UMLPackage.INTERFACE__PROTOCOL:
+			setProtocol((ProtocolStateMachine) newValue);
+			return;
+		case UMLPackage.INTERFACE__REDEFINED_INTERFACE:
+			getRedefinedInterfaces().clear();
+			getRedefinedInterfaces().addAll((Collection<? extends Interface>) newValue);
+			return;
+		case UMLPackage.INTERFACE__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -1052,99 +907,99 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERFACE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INTERFACE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INTERFACE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INTERFACE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INTERFACE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INTERFACE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.INTERFACE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.INTERFACE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.INTERFACE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.INTERFACE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INTERFACE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INTERFACE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.INTERFACE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.INTERFACE__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.INTERFACE__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.INTERFACE__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.INTERFACE__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.INTERFACE__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.INTERFACE__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.INTERFACE__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.INTERFACE__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.INTERFACE__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.INTERFACE__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.INTERFACE__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.INTERFACE__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				return;
-			case UMLPackage.INTERFACE__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.INTERFACE__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				return;
-			case UMLPackage.INTERFACE__PROTOCOL :
-				setProtocol((ProtocolStateMachine) null);
-				return;
-			case UMLPackage.INTERFACE__REDEFINED_INTERFACE :
-				getRedefinedInterfaces().clear();
-				return;
-			case UMLPackage.INTERFACE__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
+		case UMLPackage.INTERFACE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INTERFACE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INTERFACE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INTERFACE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INTERFACE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INTERFACE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.INTERFACE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.INTERFACE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.INTERFACE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.INTERFACE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INTERFACE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INTERFACE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.INTERFACE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.INTERFACE__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.INTERFACE__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.INTERFACE__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.INTERFACE__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.INTERFACE__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.INTERFACE__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.INTERFACE__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.INTERFACE__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.INTERFACE__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.INTERFACE__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.INTERFACE__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.INTERFACE__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			return;
+		case UMLPackage.INTERFACE__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.INTERFACE__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			return;
+		case UMLPackage.INTERFACE__PROTOCOL:
+			setProtocol((ProtocolStateMachine) null);
+			return;
+		case UMLPackage.INTERFACE__REDEFINED_INTERFACE:
+			getRedefinedInterfaces().clear();
+			return;
+		case UMLPackage.INTERFACE__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1157,96 +1012,94 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERFACE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INTERFACE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INTERFACE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INTERFACE__OWNER :
-				return isSetOwner();
-			case UMLPackage.INTERFACE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INTERFACE__NAME :
-				return isSetName();
-			case UMLPackage.INTERFACE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INTERFACE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INTERFACE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INTERFACE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INTERFACE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.INTERFACE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.INTERFACE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.INTERFACE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.INTERFACE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.INTERFACE__MEMBER :
-				return isSetMembers();
-			case UMLPackage.INTERFACE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.INTERFACE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.INTERFACE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.INTERFACE__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.INTERFACE__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.INTERFACE__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.INTERFACE__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.INTERFACE__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.INTERFACE__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.INTERFACE__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.INTERFACE__GENERAL :
-				return !getGenerals().isEmpty();
-			case UMLPackage.INTERFACE__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.INTERFACE__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.INTERFACE__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.INTERFACE__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.INTERFACE__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.INTERFACE__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.INTERFACE__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.INTERFACE__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.INTERFACE__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.INTERFACE__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.INTERFACE__NESTED_CLASSIFIER :
-				return !getNestedClassifiers().isEmpty();
-			case UMLPackage.INTERFACE__OWNED_ATTRIBUTE :
-				return !getOwnedAttributes().isEmpty();
-			case UMLPackage.INTERFACE__OWNED_RECEPTION :
-				return !getOwnedReceptions().isEmpty();
-			case UMLPackage.INTERFACE__PROTOCOL :
-				return basicGetProtocol() != null;
-			case UMLPackage.INTERFACE__REDEFINED_INTERFACE :
-				return !getRedefinedInterfaces().isEmpty();
-			case UMLPackage.INTERFACE__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
+		case UMLPackage.INTERFACE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INTERFACE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INTERFACE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INTERFACE__OWNER:
+			return isSetOwner();
+		case UMLPackage.INTERFACE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INTERFACE__NAME:
+			return isSetName();
+		case UMLPackage.INTERFACE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INTERFACE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INTERFACE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INTERFACE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INTERFACE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.INTERFACE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.INTERFACE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.INTERFACE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.INTERFACE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.INTERFACE__MEMBER:
+			return isSetMembers();
+		case UMLPackage.INTERFACE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.INTERFACE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.INTERFACE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.INTERFACE__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.INTERFACE__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.INTERFACE__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.INTERFACE__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.INTERFACE__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.INTERFACE__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.INTERFACE__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.INTERFACE__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.INTERFACE__GENERAL:
+			return !getGenerals().isEmpty();
+		case UMLPackage.INTERFACE__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.INTERFACE__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.INTERFACE__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.INTERFACE__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.INTERFACE__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.INTERFACE__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.INTERFACE__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.INTERFACE__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.INTERFACE__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.INTERFACE__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.INTERFACE__NESTED_CLASSIFIER:
+			return !getNestedClassifiers().isEmpty();
+		case UMLPackage.INTERFACE__OWNED_ATTRIBUTE:
+			return !getOwnedAttributes().isEmpty();
+		case UMLPackage.INTERFACE__OWNED_RECEPTION:
+			return !getOwnedReceptions().isEmpty();
+		case UMLPackage.INTERFACE__PROTOCOL:
+			return basicGetProtocol() != null;
+		case UMLPackage.INTERFACE__REDEFINED_INTERFACE:
+			return !getRedefinedInterfaces().isEmpty();
+		case UMLPackage.INTERFACE__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1261,283 +1114,223 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.INTERFACE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.INTERFACE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.INTERFACE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INTERFACE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.INTERFACE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.INTERFACE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.INTERFACE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.INTERFACE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.INTERFACE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.INTERFACE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.INTERFACE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERFACE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.INTERFACE___GET_MODEL :
-				return getModel();
-			case UMLPackage.INTERFACE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.INTERFACE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.INTERFACE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.INTERFACE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.INTERFACE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.INTERFACE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.INTERFACE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INTERFACE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.INTERFACE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.INTERFACE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.INTERFACE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INTERFACE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERFACE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.INTERFACE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERFACE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.INTERFACE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.INTERFACE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.INTERFACE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.INTERFACE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.INTERFACE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INTERFACE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.INTERFACE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.INTERFACE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.INTERFACE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.INTERFACE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.INTERFACE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.INTERFACE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.INTERFACE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.INTERFACE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.INTERFACE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.INTERFACE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERFACE___SEPARATOR :
-				return separator();
-			case UMLPackage.INTERFACE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.INTERFACE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.INTERFACE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.INTERFACE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.INTERFACE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.INTERFACE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.INTERFACE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.INTERFACE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.INTERFACE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.INTERFACE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.INTERFACE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.INTERFACE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.INTERFACE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.INTERFACE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.INTERFACE___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.INTERFACE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.INTERFACE___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.INTERFACE___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.INTERFACE___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.INTERFACE___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.INTERFACE___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.INTERFACE___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.INTERFACE___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.INTERFACE___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.INTERFACE___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.INTERFACE___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.INTERFACE___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.INTERFACE___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.INTERFACE___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.INTERFACE___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.INTERFACE___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.INTERFACE___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.INTERFACE___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.INTERFACE___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.INTERFACE___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.INTERFACE___PARENTS :
-				return parents();
-			case UMLPackage.INTERFACE___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.INTERFACE___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.INTERFACE___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.INTERFACE___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.INTERFACE___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.INTERFACE___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.INTERFACE___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.INTERFACE___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateVisibility((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERFACE___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.INTERFACE___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.INTERFACE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.INTERFACE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.INTERFACE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INTERFACE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.INTERFACE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.INTERFACE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.INTERFACE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.INTERFACE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.INTERFACE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.INTERFACE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.INTERFACE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERFACE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.INTERFACE___GET_MODEL:
+			return getModel();
+		case UMLPackage.INTERFACE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.INTERFACE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.INTERFACE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERFACE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.INTERFACE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.INTERFACE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.INTERFACE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERFACE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.INTERFACE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.INTERFACE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.INTERFACE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERFACE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERFACE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.INTERFACE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERFACE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.INTERFACE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.INTERFACE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.INTERFACE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.INTERFACE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.INTERFACE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INTERFACE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.INTERFACE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.INTERFACE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.INTERFACE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.INTERFACE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.INTERFACE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.INTERFACE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.INTERFACE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.INTERFACE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.INTERFACE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.INTERFACE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERFACE___SEPARATOR:
+			return separator();
+		case UMLPackage.INTERFACE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.INTERFACE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.INTERFACE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.INTERFACE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.INTERFACE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.INTERFACE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.INTERFACE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.INTERFACE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.INTERFACE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.INTERFACE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.INTERFACE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.INTERFACE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.INTERFACE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.INTERFACE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.INTERFACE___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.INTERFACE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.INTERFACE___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.INTERFACE___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.INTERFACE___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.INTERFACE___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.INTERFACE___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.INTERFACE___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.INTERFACE___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.INTERFACE___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.INTERFACE___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.INTERFACE___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.INTERFACE___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.INTERFACE___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.INTERFACE___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.INTERFACE___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.INTERFACE___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.INTERFACE___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.INTERFACE___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.INTERFACE___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.INTERFACE___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.INTERFACE___PARENTS:
+			return parents();
+		case UMLPackage.INTERFACE___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.INTERFACE___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.INTERFACE___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.INTERFACE___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.INTERFACE___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.INTERFACE___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.INTERFACE___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.INTERFACE___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERFACE___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.INTERFACE___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1550,7 +1343,7 @@
 	@Override
 	public boolean isSetAttributes() {
 		return super.isSetAttributes()
-			|| eIsSet(UMLPackage.INTERFACE__OWNED_ATTRIBUTE);
+				|| eIsSet(UMLPackage.INTERFACE__OWNED_ATTRIBUTE);
 	}
 
 	/**
@@ -1561,12 +1354,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.INTERFACE__OWNED_RULE, UMLPackage.INTERFACE__OWNED_USE_CASE,
-		UMLPackage.INTERFACE__NESTED_CLASSIFIER,
-		UMLPackage.INTERFACE__OWNED_ATTRIBUTE,
-		UMLPackage.INTERFACE__OWNED_RECEPTION, UMLPackage.INTERFACE__PROTOCOL,
-		UMLPackage.INTERFACE__OWNED_OPERATION};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.INTERFACE__OWNED_RULE, UMLPackage.INTERFACE__OWNED_USE_CASE, UMLPackage.INTERFACE__NESTED_CLASSIFIER, UMLPackage.INTERFACE__OWNED_ATTRIBUTE, UMLPackage.INTERFACE__OWNED_RECEPTION,
+			UMLPackage.INTERFACE__PROTOCOL, UMLPackage.INTERFACE__OWNED_OPERATION };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getAttributes() <em>Attribute</em>}' reference list.
@@ -1576,8 +1365,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] ATTRIBUTE_ESUBSETS = new int[]{
-		UMLPackage.INTERFACE__OWNED_ATTRIBUTE};
+	protected static final int[] ATTRIBUTE_ESUBSETS = new int[] { UMLPackage.INTERFACE__OWNED_ATTRIBUTE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1587,11 +1375,11 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.INTERFACE__NESTED_CLASSIFIER)
-			|| eIsSet(UMLPackage.INTERFACE__OWNED_ATTRIBUTE)
-			|| eIsSet(UMLPackage.INTERFACE__OWNED_RECEPTION)
-			|| eIsSet(UMLPackage.INTERFACE__PROTOCOL)
-			|| eIsSet(UMLPackage.INTERFACE__OWNED_OPERATION);
+				|| eIsSet(UMLPackage.INTERFACE__NESTED_CLASSIFIER)
+				|| eIsSet(UMLPackage.INTERFACE__OWNED_ATTRIBUTE)
+				|| eIsSet(UMLPackage.INTERFACE__OWNED_RECEPTION)
+				|| eIsSet(UMLPackage.INTERFACE__PROTOCOL)
+				|| eIsSet(UMLPackage.INTERFACE__OWNED_OPERATION);
 	}
 
 	/**
@@ -1602,9 +1390,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] FEATURE_ESUBSETS = new int[]{
-		UMLPackage.INTERFACE__ATTRIBUTE, UMLPackage.INTERFACE__OWNED_RECEPTION,
-		UMLPackage.INTERFACE__OWNED_OPERATION};
+	protected static final int[] FEATURE_ESUBSETS = new int[] { UMLPackage.INTERFACE__ATTRIBUTE, UMLPackage.INTERFACE__OWNED_RECEPTION, UMLPackage.INTERFACE__OWNED_OPERATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1614,15 +1400,13 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Classifier> getRedefinedClassifiers() {
-		return (EList<Classifier>) eDynamicGet(
-			UMLPackage.INTERFACE__REDEFINED_CLASSIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__REDEFINED_CLASSIFIER, true, true);
+		return (EList<Classifier>) eDynamicGet(UMLPackage.INTERFACE__REDEFINED_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__REDEFINED_CLASSIFIER, true, true);
 	}
 
 	private EList<Classifier> createRedefinedClassifiersList() {
 		return new SubsetSupersetEObjectResolvingEList<Classifier>(
-			Classifier.class, this, UMLPackage.INTERFACE__REDEFINED_CLASSIFIER,
-			null, REDEFINED_CLASSIFIER_ESUBSETS);
+				Classifier.class, this, UMLPackage.INTERFACE__REDEFINED_CLASSIFIER,
+				null, REDEFINED_CLASSIFIER_ESUBSETS);
 	}
 
 	/**
@@ -1633,8 +1417,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_CLASSIFIER_ESUBSETS = new int[]{
-		UMLPackage.INTERFACE__REDEFINED_INTERFACE};
+	protected static final int[] REDEFINED_CLASSIFIER_ESUBSETS = new int[] { UMLPackage.INTERFACE__REDEFINED_INTERFACE };
 
 	/**
 	 * The array of superset feature identifiers for the '{@link #getRedefinedInterfaces() <em>Redefined Interface</em>}' reference list.
@@ -1644,8 +1427,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_INTERFACE_ESUPERSETS = new int[]{
-		UMLPackage.INTERFACE__REDEFINED_CLASSIFIER};
+	protected static final int[] REDEFINED_INTERFACE_ESUPERSETS = new int[] { UMLPackage.INTERFACE__REDEFINED_CLASSIFIER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1662,10 +1444,8 @@
 	 * @generated
 	 */
 	public Interface getRedefinedInterface(String name, boolean ignoreCase) {
-		redefinedInterfaceLoop : for (Interface redefinedInterface : getRedefinedInterfaces()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinedInterface.getName())
-				: name.equals(redefinedInterface.getName())))
+		redefinedInterfaceLoop: for (Interface redefinedInterface : getRedefinedInterfaces()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinedInterface.getName()) : name.equals(redefinedInterface.getName())))
 				continue redefinedInterfaceLoop;
 			return redefinedInterface;
 		}
@@ -1680,8 +1460,8 @@
 	@Override
 	public boolean isSetFeatures() {
 		return super.isSetFeatures()
-			|| eIsSet(UMLPackage.INTERFACE__OWNED_RECEPTION)
-			|| eIsSet(UMLPackage.INTERFACE__OWNED_OPERATION);
+				|| eIsSet(UMLPackage.INTERFACE__OWNED_RECEPTION)
+				|| eIsSet(UMLPackage.INTERFACE__OWNED_OPERATION);
 	}
 
 } //InterfaceImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InterfaceRealizationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InterfaceRealizationImpl.java
index ba8473a..2cc5ef5 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InterfaceRealizationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InterfaceRealizationImpl.java
@@ -1,28 +1,40 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Eike Stepper - 540786
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
 
+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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectResolvingEList;
+
 import org.eclipse.uml2.uml.BehavioredClassifier;
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
@@ -75,17 +87,9 @@
 		return UMLPackage.Literals.INTERFACE_REALIZATION;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.DEPENDENCY__CLIENT) {
 			return createClientsList();
 		}
@@ -105,9 +109,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -132,16 +134,14 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<NamedElement> getSuppliers() {
-		return (EList<NamedElement>) eDynamicGet(
-			UMLPackage.INTERFACE_REALIZATION__SUPPLIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPENDENCY__SUPPLIER, true, true);
+		return (EList<NamedElement>) eDynamicGet(UMLPackage.INTERFACE_REALIZATION__SUPPLIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPENDENCY__SUPPLIER, true, true);
 	}
 
 	private EList<NamedElement> createSuppliersList() {
 		return new SubsetSupersetEObjectResolvingEList<NamedElement>(
-			NamedElement.class, this,
-			UMLPackage.INTERFACE_REALIZATION__SUPPLIER, null,
-			SUPPLIER_ESUBSETS);
+				NamedElement.class, this,
+				UMLPackage.INTERFACE_REALIZATION__SUPPLIER, null,
+				SUPPLIER_ESUBSETS);
 	}
 
 	/**
@@ -152,8 +152,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SUPPLIER_ESUBSETS = new int[]{
-		UMLPackage.INTERFACE_REALIZATION__CONTRACT};
+	protected static final int[] SUPPLIER_ESUBSETS = new int[] { UMLPackage.INTERFACE_REALIZATION__CONTRACT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -163,15 +162,13 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<NamedElement> getClients() {
-		return (EList<NamedElement>) eDynamicGet(
-			UMLPackage.INTERFACE_REALIZATION__CLIENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPENDENCY__CLIENT, true, true);
+		return (EList<NamedElement>) eDynamicGet(UMLPackage.INTERFACE_REALIZATION__CLIENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPENDENCY__CLIENT, true, true);
 	}
 
 	private EList<NamedElement> createClientsList() {
 		return new SubsetSupersetEObjectResolvingEList<NamedElement>(
-			NamedElement.class, this, UMLPackage.INTERFACE_REALIZATION__CLIENT,
-			null, CLIENT_ESUBSETS);
+				NamedElement.class, this, UMLPackage.INTERFACE_REALIZATION__CLIENT,
+				null, CLIENT_ESUBSETS);
 	}
 
 	/**
@@ -182,8 +179,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] CLIENT_ESUBSETS = new int[]{
-		UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER};
+	protected static final int[] CLIENT_ESUBSETS = new int[] { UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -191,9 +187,7 @@
 	 * @generated
 	 */
 	public Interface getContract() {
-		return (Interface) eDynamicGet(
-			UMLPackage.INTERFACE_REALIZATION__CONTRACT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERFACE_REALIZATION__CONTRACT, true, true);
+		return (Interface) eDynamicGet(UMLPackage.INTERFACE_REALIZATION__CONTRACT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERFACE_REALIZATION__CONTRACT, true, true);
 	}
 
 	/**
@@ -202,9 +196,7 @@
 	 * @generated
 	 */
 	public Interface basicGetContract() {
-		return (Interface) eDynamicGet(
-			UMLPackage.INTERFACE_REALIZATION__CONTRACT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERFACE_REALIZATION__CONTRACT, false, true);
+		return (Interface) eDynamicGet(UMLPackage.INTERFACE_REALIZATION__CONTRACT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERFACE_REALIZATION__CONTRACT, false, true);
 	}
 
 	/**
@@ -213,9 +205,7 @@
 	 * @generated
 	 */
 	public void setContract(Interface newContract) {
-		eDynamicSet(
-			UMLPackage.INTERFACE_REALIZATION__CONTRACT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERFACE_REALIZATION__CONTRACT, newContract);
+		eDynamicSet(UMLPackage.INTERFACE_REALIZATION__CONTRACT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERFACE_REALIZATION__CONTRACT, newContract);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newContract != null) {
@@ -233,11 +223,7 @@
 	 * @generated
 	 */
 	public BehavioredClassifier getImplementingClassifier() {
-		return (BehavioredClassifier) eDynamicGet(
-			UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER,
-			true, true);
+		return (BehavioredClassifier) eDynamicGet(UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER, true, true);
 	}
 
 	/**
@@ -246,11 +232,7 @@
 	 * @generated
 	 */
 	public BehavioredClassifier basicGetImplementingClassifier() {
-		return (BehavioredClassifier) eDynamicGet(
-			UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER,
-			false, true);
+		return (BehavioredClassifier) eDynamicGet(UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER, false, true);
 	}
 
 	/**
@@ -261,8 +243,7 @@
 	public NotificationChain basicSetImplementingClassifier(
 			BehavioredClassifier newImplementingClassifier,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newImplementingClassifier,
-			UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newImplementingClassifier, UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newImplementingClassifier != null) {
@@ -282,11 +263,7 @@
 	 */
 	public void setImplementingClassifier(
 			BehavioredClassifier newImplementingClassifier) {
-		eDynamicSet(
-			UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER,
-			newImplementingClassifier);
+		eDynamicSet(UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER, newImplementingClassifier);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newImplementingClassifier != null) {
@@ -308,28 +285,21 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.INTERFACE_REALIZATION__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetImplementingClassifier(
-					(BehavioredClassifier) otherEnd, msgs);
+		case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.INTERFACE_REALIZATION__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetImplementingClassifier((BehavioredClassifier) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -343,22 +313,20 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERFACE_REALIZATION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERFACE_REALIZATION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.INTERFACE_REALIZATION__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.INTERFACE_REALIZATION__MAPPING :
-				return basicSetMapping(null, msgs);
-			case UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER :
-				return basicSetImplementingClassifier(null, msgs);
+		case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE_REALIZATION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERFACE_REALIZATION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.INTERFACE_REALIZATION__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.INTERFACE_REALIZATION__MAPPING:
+			return basicSetMapping(null, msgs);
+		case UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER:
+			return basicSetImplementingClassifier(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -372,14 +340,10 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
-			case UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION,
-					BehavioredClassifier.class, msgs);
+		case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+		case UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.BEHAVIORED_CLASSIFIER__INTERFACE_REALIZATION, BehavioredClassifier.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -392,62 +356,62 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INTERFACE_REALIZATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INTERFACE_REALIZATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INTERFACE_REALIZATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INTERFACE_REALIZATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INTERFACE_REALIZATION__NAME :
-				return getName();
-			case UMLPackage.INTERFACE_REALIZATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INTERFACE_REALIZATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INTERFACE_REALIZATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERFACE_REALIZATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.INTERFACE_REALIZATION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.INTERFACE_REALIZATION__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.INTERFACE_REALIZATION__SOURCE :
-				return getSources();
-			case UMLPackage.INTERFACE_REALIZATION__TARGET :
-				return getTargets();
-			case UMLPackage.INTERFACE_REALIZATION__CLIENT :
-				return getClients();
-			case UMLPackage.INTERFACE_REALIZATION__SUPPLIER :
-				return getSuppliers();
-			case UMLPackage.INTERFACE_REALIZATION__MAPPING :
-				if (resolve)
-					return getMapping();
-				return basicGetMapping();
-			case UMLPackage.INTERFACE_REALIZATION__CONTRACT :
-				if (resolve)
-					return getContract();
-				return basicGetContract();
-			case UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER :
-				if (resolve)
-					return getImplementingClassifier();
-				return basicGetImplementingClassifier();
+		case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INTERFACE_REALIZATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INTERFACE_REALIZATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INTERFACE_REALIZATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INTERFACE_REALIZATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INTERFACE_REALIZATION__NAME:
+			return getName();
+		case UMLPackage.INTERFACE_REALIZATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INTERFACE_REALIZATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INTERFACE_REALIZATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERFACE_REALIZATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.INTERFACE_REALIZATION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.INTERFACE_REALIZATION__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.INTERFACE_REALIZATION__SOURCE:
+			return getSources();
+		case UMLPackage.INTERFACE_REALIZATION__TARGET:
+			return getTargets();
+		case UMLPackage.INTERFACE_REALIZATION__CLIENT:
+			return getClients();
+		case UMLPackage.INTERFACE_REALIZATION__SUPPLIER:
+			return getSuppliers();
+		case UMLPackage.INTERFACE_REALIZATION__MAPPING:
+			if (resolve)
+				return getMapping();
+			return basicGetMapping();
+		case UMLPackage.INTERFACE_REALIZATION__CONTRACT:
+			if (resolve)
+				return getContract();
+			return basicGetContract();
+		case UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER:
+			if (resolve)
+				return getImplementingClassifier();
+			return basicGetImplementingClassifier();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -461,50 +425,46 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__CLIENT :
-				getClients().clear();
-				getClients()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__SUPPLIER :
-				getSuppliers().clear();
-				getSuppliers()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__MAPPING :
-				setMapping((OpaqueExpression) newValue);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__CONTRACT :
-				setContract((Interface) newValue);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER :
-				setImplementingClassifier((BehavioredClassifier) newValue);
-				return;
+		case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__CLIENT:
+			getClients().clear();
+			getClients().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__SUPPLIER:
+			getSuppliers().clear();
+			getSuppliers().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__MAPPING:
+			setMapping((OpaqueExpression) newValue);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__CONTRACT:
+			setContract((Interface) newValue);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER:
+			setImplementingClassifier((BehavioredClassifier) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -517,42 +477,42 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__CLIENT :
-				getClients().clear();
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__SUPPLIER :
-				getSuppliers().clear();
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__MAPPING :
-				setMapping((OpaqueExpression) null);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__CONTRACT :
-				setContract((Interface) null);
-				return;
-			case UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER :
-				setImplementingClassifier((BehavioredClassifier) null);
-				return;
+		case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__CLIENT:
+			getClients().clear();
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__SUPPLIER:
+			getSuppliers().clear();
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__MAPPING:
+			setMapping((OpaqueExpression) null);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__CONTRACT:
+			setContract((Interface) null);
+			return;
+		case UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER:
+			setImplementingClassifier((BehavioredClassifier) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -565,48 +525,46 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INTERFACE_REALIZATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INTERFACE_REALIZATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INTERFACE_REALIZATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.INTERFACE_REALIZATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INTERFACE_REALIZATION__NAME :
-				return isSetName();
-			case UMLPackage.INTERFACE_REALIZATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INTERFACE_REALIZATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INTERFACE_REALIZATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INTERFACE_REALIZATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.INTERFACE_REALIZATION__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.INTERFACE_REALIZATION__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.INTERFACE_REALIZATION__SOURCE :
-				return isSetSources();
-			case UMLPackage.INTERFACE_REALIZATION__TARGET :
-				return isSetTargets();
-			case UMLPackage.INTERFACE_REALIZATION__CLIENT :
-				return !getClients().isEmpty();
-			case UMLPackage.INTERFACE_REALIZATION__SUPPLIER :
-				return !getSuppliers().isEmpty();
-			case UMLPackage.INTERFACE_REALIZATION__MAPPING :
-				return basicGetMapping() != null;
-			case UMLPackage.INTERFACE_REALIZATION__CONTRACT :
-				return basicGetContract() != null;
-			case UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER :
-				return basicGetImplementingClassifier() != null;
+		case UMLPackage.INTERFACE_REALIZATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INTERFACE_REALIZATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INTERFACE_REALIZATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INTERFACE_REALIZATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.INTERFACE_REALIZATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INTERFACE_REALIZATION__NAME:
+			return isSetName();
+		case UMLPackage.INTERFACE_REALIZATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INTERFACE_REALIZATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INTERFACE_REALIZATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INTERFACE_REALIZATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INTERFACE_REALIZATION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.INTERFACE_REALIZATION__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.INTERFACE_REALIZATION__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.INTERFACE_REALIZATION__SOURCE:
+			return isSetSources();
+		case UMLPackage.INTERFACE_REALIZATION__TARGET:
+			return isSetTargets();
+		case UMLPackage.INTERFACE_REALIZATION__CLIENT:
+			return !getClients().isEmpty();
+		case UMLPackage.INTERFACE_REALIZATION__SUPPLIER:
+			return !getSuppliers().isEmpty();
+		case UMLPackage.INTERFACE_REALIZATION__MAPPING:
+			return basicGetMapping() != null;
+		case UMLPackage.INTERFACE_REALIZATION__CONTRACT:
+			return basicGetContract() != null;
+		case UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER:
+			return basicGetImplementingClassifier() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -618,8 +576,8 @@
 	 */
 	@Override
 	public boolean isSetOwner() {
-		return super.isSetOwner() || eIsSet(
-			UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER);
+		return super.isSetOwner()
+				|| eIsSet(UMLPackage.INTERFACE_REALIZATION__IMPLEMENTING_CLASSIFIER);
 	}
 
 } //InterfaceRealizationImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InterruptibleActivityRegionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InterruptibleActivityRegionImpl.java
index 2305aae..8599b79 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InterruptibleActivityRegionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InterruptibleActivityRegionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -29,6 +29,7 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -97,22 +98,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<ActivityNode> containedNodes = (EList<ActivityNode>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE);
+			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>(
-						ActivityNode.class, this,
-						UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CONTAINED_NODE,
-						CONTAINED_NODE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE,
+						containedNodes = new DerivedUnionEObjectEList<ActivityNode>(ActivityNode.class, this, UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CONTAINED_NODE, CONTAINED_NODE_ESUBSETS));
 			}
 			return containedNodes;
 		}
-		return new DerivedUnionEObjectEList<ActivityNode>(ActivityNode.class,
-			this, UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CONTAINED_NODE,
-			CONTAINED_NODE_ESUBSETS);
+		return new DerivedUnionEObjectEList<ActivityNode>(ActivityNode.class, this, UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CONTAINED_NODE, CONTAINED_NODE_ESUBSETS);
 	}
 
 	/**
@@ -122,11 +115,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityNode> getNodes() {
-		return (EList<ActivityNode>) eDynamicGet(
-			UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERRUPTIBLE_ACTIVITY_REGION__NODE, true,
-			true);
+		return (EList<ActivityNode>) eDynamicGet(UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERRUPTIBLE_ACTIVITY_REGION__NODE, true, true);
 	}
 
 	/**
@@ -145,12 +134,10 @@
 	 */
 	public ActivityNode getNode(String name, boolean ignoreCase,
 			EClass eClass) {
-		nodeLoop : for (ActivityNode node : getNodes()) {
+		nodeLoop: for (ActivityNode node : getNodes()) {
 			if (eClass != null && !eClass.isInstance(node))
 				continue nodeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(node.getName())
-				: name.equals(node.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(node.getName()) : name.equals(node.getName())))
 				continue nodeLoop;
 			return node;
 		}
@@ -164,11 +151,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityEdge> getInterruptingEdges() {
-		return (EList<ActivityEdge>) eDynamicGet(
-			UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE,
-			true, true);
+		return (EList<ActivityEdge>) eDynamicGet(UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE, true, true);
 	}
 
 	/**
@@ -187,12 +170,10 @@
 	 */
 	public ActivityEdge getInterruptingEdge(String name, boolean ignoreCase,
 			EClass eClass) {
-		interruptingEdgeLoop : for (ActivityEdge interruptingEdge : getInterruptingEdges()) {
+		interruptingEdgeLoop: for (ActivityEdge interruptingEdge : getInterruptingEdges()) {
 			if (eClass != null && !eClass.isInstance(interruptingEdge))
 				continue interruptingEdgeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(interruptingEdge.getName())
-				: name.equals(interruptingEdge.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(interruptingEdge.getName()) : name.equals(interruptingEdge.getName())))
 				continue interruptingEdgeLoop;
 			return interruptingEdge;
 		}
@@ -206,8 +187,7 @@
 	 */
 	public boolean validateInterruptingEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return InterruptibleActivityRegionOperations
-			.validateInterruptingEdges(this, diagnostics, context);
+		return InterruptibleActivityRegionOperations.validateInterruptingEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -220,15 +200,12 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterruptingEdges())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getNodes())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterruptingEdges()).basicAdd(otherEnd, msgs);
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getNodes()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -242,20 +219,16 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE :
-				return ((InternalEList<?>) getInterruptingEdges())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE :
-				return ((InternalEList<?>) getNodes()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE:
+			return ((InternalEList<?>) getInterruptingEdges()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE:
+			return ((InternalEList<?>) getNodes()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -268,50 +241,50 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME :
-				return getName();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CONTAINED_EDGE :
-				return getContainedEdges();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CONTAINED_NODE :
-				return getContainedNodes();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__IN_ACTIVITY :
-				if (resolve)
-					return getInActivity();
-				return basicGetInActivity();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__SUBGROUP :
-				return getSubgroups();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__SUPER_GROUP :
-				if (resolve)
-					return getSuperGroup();
-				return basicGetSuperGroup();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE :
-				return getInterruptingEdges();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE :
-				return getNodes();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME:
+			return getName();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CONTAINED_EDGE:
+			return getContainedEdges();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CONTAINED_NODE:
+			return getContainedNodes();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__IN_ACTIVITY:
+			if (resolve)
+				return getInActivity();
+			return basicGetInActivity();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__SUBGROUP:
+			return getSubgroups();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__SUPER_GROUP:
+			if (resolve)
+				return getSuperGroup();
+			return basicGetSuperGroup();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE:
+			return getInterruptingEdges();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE:
+			return getNodes();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -325,38 +298,34 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__IN_ACTIVITY :
-				setInActivity((Activity) newValue);
-				return;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE :
-				getInterruptingEdges().clear();
-				getInterruptingEdges()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE :
-				getNodes().clear();
-				getNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__IN_ACTIVITY:
+			setInActivity((Activity) newValue);
+			return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE:
+			getInterruptingEdges().clear();
+			getInterruptingEdges().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE:
+			getNodes().clear();
+			getNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -369,30 +338,30 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__IN_ACTIVITY :
-				setInActivity((Activity) null);
-				return;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE :
-				getInterruptingEdges().clear();
-				return;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE :
-				getNodes().clear();
-				return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__IN_ACTIVITY:
+			setInActivity((Activity) null);
+			return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE:
+			getInterruptingEdges().clear();
+			return;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE:
+			getNodes().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -405,42 +374,40 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNER :
-				return isSetOwner();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME :
-				return isSetName();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CONTAINED_EDGE :
-				return isSetContainedEdges();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CONTAINED_NODE :
-				return isSetContainedNodes();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__IN_ACTIVITY :
-				return basicGetInActivity() != null;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__SUBGROUP :
-				return isSetSubgroups();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__SUPER_GROUP :
-				return isSetSuperGroup();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE :
-				return !getInterruptingEdges().isEmpty();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE :
-				return !getNodes().isEmpty();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__OWNER:
+			return isSetOwner();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME:
+			return isSetName();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CONTAINED_EDGE:
+			return isSetContainedEdges();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__CONTAINED_NODE:
+			return isSetContainedNodes();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__IN_ACTIVITY:
+			return basicGetInActivity() != null;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__SUBGROUP:
+			return isSetSubgroups();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__SUPER_GROUP:
+			return isSetSuperGroup();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__INTERRUPTING_EDGE:
+			return !getInterruptingEdges().isEmpty();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE:
+			return !getNodes().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -455,137 +422,118 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_MODEL :
-				return getModel();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___SEPARATOR :
-				return separator();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateNodesAndEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP :
-				return validateNotContained((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_INTERRUPTING_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateInterruptingEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_MODEL:
+			return getModel();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___SEPARATOR:
+			return separator();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateNodesAndEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP:
+			return validateNotContained((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION___VALIDATE_INTERRUPTING_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateInterruptingEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -598,8 +546,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] CONTAINED_NODE_ESUBSETS = new int[]{
-		UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE};
+	protected static final int[] CONTAINED_NODE_ESUBSETS = new int[] { UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -609,7 +556,7 @@
 	@Override
 	public boolean isSetContainedNodes() {
 		return super.isSetContainedNodes()
-			|| eIsSet(UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE);
+				|| eIsSet(UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION__NODE);
 	}
 
 } //InterruptibleActivityRegionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/IntervalConstraintImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/IntervalConstraintImpl.java
index d3f022e..3aa6dfa 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/IntervalConstraintImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/IntervalConstraintImpl.java
@@ -1,24 +1,28 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 212765, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
+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.emf.ecore.util.InternalEList;
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
@@ -75,10 +79,7 @@
 	 */
 	@Override
 	public ValueSpecification getSpecification() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__SPECIFICATION, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__SPECIFICATION, true, true);
 	}
 
 	/**
@@ -88,10 +89,7 @@
 	 */
 	@Override
 	public ValueSpecification basicGetSpecification() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__SPECIFICATION, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__SPECIFICATION, false, true);
 	}
 
 	/**
@@ -102,13 +100,10 @@
 	@Override
 	public NotificationChain basicSetSpecification(
 			ValueSpecification newSpecification, NotificationChain msgs) {
-		if (newSpecification != null
-			&& !(newSpecification instanceof Interval)) {
-			throw new IllegalArgumentException(
-				"newSpecification must be an instance of Interval"); //$NON-NLS-1$
+		if (newSpecification != null && !(newSpecification instanceof Interval)) {
+			throw new IllegalArgumentException("newSpecification must be an instance of Interval"); //$NON-NLS-1$
 		}
-		msgs = eDynamicInverseAdd((InternalEObject) newSpecification,
-			UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newSpecification, UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION, msgs);
 		return msgs;
 	}
 
@@ -119,15 +114,10 @@
 	 */
 	@Override
 	public void setSpecification(ValueSpecification newSpecification) {
-		if (newSpecification != null
-			&& !(newSpecification instanceof Interval)) {
-			throw new IllegalArgumentException(
-				"newSpecification must be an instance of Interval"); //$NON-NLS-1$
+		if (newSpecification != null && !(newSpecification instanceof Interval)) {
+			throw new IllegalArgumentException("newSpecification must be an instance of Interval"); //$NON-NLS-1$
 		}
-		eDynamicSet(
-			UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__SPECIFICATION, newSpecification);
+		eDynamicSet(UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__SPECIFICATION, newSpecification);
 	}
 
 	/**
@@ -135,11 +125,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public ValueSpecification createSpecification(String name, Type type,
 			EClass eClass) {
-		ValueSpecification newSpecification = (ValueSpecification) create(
-			eClass);
+		ValueSpecification newSpecification = (ValueSpecification) create(eClass);
 		setSpecification(newSpecification);
 		if (name != null)
 			newSpecification.setName(name);
@@ -166,22 +154,20 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INTERVAL_CONSTRAINT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERVAL_CONSTRAINT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INTERVAL_CONSTRAINT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.INTERVAL_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.INTERVAL_CONSTRAINT__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.INTERVAL_CONSTRAINT__CONTEXT :
-				return basicSetContext(null, msgs);
-			case UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION :
-				return basicSetSpecification(null, msgs);
+		case UMLPackage.INTERVAL_CONSTRAINT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERVAL_CONSTRAINT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INTERVAL_CONSTRAINT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.INTERVAL_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.INTERVAL_CONSTRAINT__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.INTERVAL_CONSTRAINT__CONTEXT:
+			return basicSetContext(null, msgs);
+		case UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION:
+			return basicSetSpecification(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -194,50 +180,50 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INTERVAL_CONSTRAINT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INTERVAL_CONSTRAINT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INTERVAL_CONSTRAINT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INTERVAL_CONSTRAINT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INTERVAL_CONSTRAINT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INTERVAL_CONSTRAINT__NAME :
-				return getName();
-			case UMLPackage.INTERVAL_CONSTRAINT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INTERVAL_CONSTRAINT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INTERVAL_CONSTRAINT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERVAL_CONSTRAINT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INTERVAL_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.INTERVAL_CONSTRAINT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.INTERVAL_CONSTRAINT__CONSTRAINED_ELEMENT :
-				return getConstrainedElements();
-			case UMLPackage.INTERVAL_CONSTRAINT__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION :
-				if (resolve)
-					return getSpecification();
-				return basicGetSpecification();
+		case UMLPackage.INTERVAL_CONSTRAINT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INTERVAL_CONSTRAINT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INTERVAL_CONSTRAINT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INTERVAL_CONSTRAINT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INTERVAL_CONSTRAINT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INTERVAL_CONSTRAINT__NAME:
+			return getName();
+		case UMLPackage.INTERVAL_CONSTRAINT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INTERVAL_CONSTRAINT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INTERVAL_CONSTRAINT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERVAL_CONSTRAINT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INTERVAL_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.INTERVAL_CONSTRAINT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.INTERVAL_CONSTRAINT__CONSTRAINED_ELEMENT:
+			return getConstrainedElements();
+		case UMLPackage.INTERVAL_CONSTRAINT__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION:
+			if (resolve)
+				return getSpecification();
+			return basicGetSpecification();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -251,42 +237,39 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INTERVAL_CONSTRAINT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__CONSTRAINED_ELEMENT :
-				getConstrainedElements().clear();
-				getConstrainedElements()
-					.addAll((Collection<? extends Element>) newValue);
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__CONTEXT :
-				setContext((Namespace) newValue);
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION :
-				setSpecification((ValueSpecification) newValue);
-				return;
+		case UMLPackage.INTERVAL_CONSTRAINT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__CONSTRAINED_ELEMENT:
+			getConstrainedElements().clear();
+			getConstrainedElements().addAll((Collection<? extends Element>) newValue);
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__CONTEXT:
+			setContext((Namespace) newValue);
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION:
+			setSpecification((ValueSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -299,36 +282,36 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERVAL_CONSTRAINT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__CONSTRAINED_ELEMENT :
-				getConstrainedElements().clear();
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__CONTEXT :
-				setContext((Namespace) null);
-				return;
-			case UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION :
-				setSpecification((ValueSpecification) null);
-				return;
+		case UMLPackage.INTERVAL_CONSTRAINT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__CONSTRAINED_ELEMENT:
+			getConstrainedElements().clear();
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__CONTEXT:
+			setContext((Namespace) null);
+			return;
+		case UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION:
+			setSpecification((ValueSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -341,38 +324,36 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERVAL_CONSTRAINT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INTERVAL_CONSTRAINT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INTERVAL_CONSTRAINT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INTERVAL_CONSTRAINT__OWNER :
-				return isSetOwner();
-			case UMLPackage.INTERVAL_CONSTRAINT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INTERVAL_CONSTRAINT__NAME :
-				return isSetName();
-			case UMLPackage.INTERVAL_CONSTRAINT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INTERVAL_CONSTRAINT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INTERVAL_CONSTRAINT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INTERVAL_CONSTRAINT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INTERVAL_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.INTERVAL_CONSTRAINT__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.INTERVAL_CONSTRAINT__CONSTRAINED_ELEMENT :
-				return !getConstrainedElements().isEmpty();
-			case UMLPackage.INTERVAL_CONSTRAINT__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION :
-				return isSetSpecification();
+		case UMLPackage.INTERVAL_CONSTRAINT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INTERVAL_CONSTRAINT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INTERVAL_CONSTRAINT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INTERVAL_CONSTRAINT__OWNER:
+			return isSetOwner();
+		case UMLPackage.INTERVAL_CONSTRAINT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INTERVAL_CONSTRAINT__NAME:
+			return isSetName();
+		case UMLPackage.INTERVAL_CONSTRAINT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INTERVAL_CONSTRAINT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INTERVAL_CONSTRAINT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INTERVAL_CONSTRAINT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INTERVAL_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.INTERVAL_CONSTRAINT__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.INTERVAL_CONSTRAINT__CONSTRAINED_ELEMENT:
+			return !getConstrainedElements().isEmpty();
+		case UMLPackage.INTERVAL_CONSTRAINT__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.INTERVAL_CONSTRAINT__SPECIFICATION:
+			return isSetSpecification();
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/IntervalImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/IntervalImpl.java
index 49c7e54..b5dd900 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/IntervalImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/IntervalImpl.java
@@ -1,20 +1,27 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.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.Interval;
 import org.eclipse.uml2.uml.StringExpression;
@@ -67,9 +74,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getMin() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.INTERVAL__MIN - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MIN, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.INTERVAL__MIN - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MIN, true, true);
 	}
 
 	/**
@@ -78,9 +83,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetMin() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.INTERVAL__MIN - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MIN, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.INTERVAL__MIN - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MIN, false, true);
 	}
 
 	/**
@@ -89,8 +92,7 @@
 	 * @generated
 	 */
 	public void setMin(ValueSpecification newMin) {
-		eDynamicSet(UMLPackage.INTERVAL__MIN - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MIN, newMin);
+		eDynamicSet(UMLPackage.INTERVAL__MIN - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MIN, newMin);
 	}
 
 	/**
@@ -99,9 +101,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getMax() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.INTERVAL__MAX - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MAX, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.INTERVAL__MAX - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MAX, true, true);
 	}
 
 	/**
@@ -110,9 +110,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetMax() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.INTERVAL__MAX - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MAX, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.INTERVAL__MAX - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MAX, false, true);
 	}
 
 	/**
@@ -121,8 +119,7 @@
 	 * @generated
 	 */
 	public void setMax(ValueSpecification newMax) {
-		eDynamicSet(UMLPackage.INTERVAL__MAX - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MAX, newMax);
+		eDynamicSet(UMLPackage.INTERVAL__MAX - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MAX, newMax);
 	}
 
 	/**
@@ -133,52 +130,52 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INTERVAL__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INTERVAL__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INTERVAL__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INTERVAL__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INTERVAL__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INTERVAL__NAME :
-				return getName();
-			case UMLPackage.INTERVAL__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INTERVAL__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INTERVAL__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INTERVAL__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INTERVAL__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.INTERVAL__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.INTERVAL__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.INTERVAL__MAX :
-				if (resolve)
-					return getMax();
-				return basicGetMax();
-			case UMLPackage.INTERVAL__MIN :
-				if (resolve)
-					return getMin();
-				return basicGetMin();
+		case UMLPackage.INTERVAL__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INTERVAL__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INTERVAL__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INTERVAL__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INTERVAL__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INTERVAL__NAME:
+			return getName();
+		case UMLPackage.INTERVAL__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INTERVAL__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INTERVAL__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INTERVAL__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INTERVAL__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.INTERVAL__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.INTERVAL__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.INTERVAL__MAX:
+			if (resolve)
+				return getMax();
+			return basicGetMax();
+		case UMLPackage.INTERVAL__MIN:
+			if (resolve)
+				return getMin();
+			return basicGetMin();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -192,40 +189,38 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INTERVAL__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INTERVAL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INTERVAL__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INTERVAL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INTERVAL__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INTERVAL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INTERVAL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.INTERVAL__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.INTERVAL__MAX :
-				setMax((ValueSpecification) newValue);
-				return;
-			case UMLPackage.INTERVAL__MIN :
-				setMin((ValueSpecification) newValue);
-				return;
+		case UMLPackage.INTERVAL__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INTERVAL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INTERVAL__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INTERVAL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INTERVAL__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INTERVAL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INTERVAL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.INTERVAL__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.INTERVAL__MAX:
+			setMax((ValueSpecification) newValue);
+			return;
+		case UMLPackage.INTERVAL__MIN:
+			setMin((ValueSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -238,36 +233,36 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERVAL__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INTERVAL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INTERVAL__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INTERVAL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INTERVAL__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INTERVAL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INTERVAL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.INTERVAL__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.INTERVAL__MAX :
-				setMax((ValueSpecification) null);
-				return;
-			case UMLPackage.INTERVAL__MIN :
-				setMin((ValueSpecification) null);
-				return;
+		case UMLPackage.INTERVAL__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INTERVAL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INTERVAL__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INTERVAL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INTERVAL__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INTERVAL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INTERVAL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.INTERVAL__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.INTERVAL__MAX:
+			setMax((ValueSpecification) null);
+			return;
+		case UMLPackage.INTERVAL__MIN:
+			setMin((ValueSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -280,38 +275,36 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INTERVAL__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INTERVAL__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INTERVAL__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INTERVAL__OWNER :
-				return isSetOwner();
-			case UMLPackage.INTERVAL__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INTERVAL__NAME :
-				return isSetName();
-			case UMLPackage.INTERVAL__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INTERVAL__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INTERVAL__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INTERVAL__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INTERVAL__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.INTERVAL__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.INTERVAL__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.INTERVAL__MAX :
-				return basicGetMax() != null;
-			case UMLPackage.INTERVAL__MIN :
-				return basicGetMin() != null;
+		case UMLPackage.INTERVAL__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INTERVAL__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INTERVAL__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INTERVAL__OWNER:
+			return isSetOwner();
+		case UMLPackage.INTERVAL__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INTERVAL__NAME:
+			return isSetName();
+		case UMLPackage.INTERVAL__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INTERVAL__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INTERVAL__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INTERVAL__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INTERVAL__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.INTERVAL__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.INTERVAL__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.INTERVAL__MAX:
+			return basicGetMax() != null;
+		case UMLPackage.INTERVAL__MIN:
+			return basicGetMin() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InvocationActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InvocationActionImpl.java
index a005967..fa83bdc 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InvocationActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/InvocationActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -15,6 +15,7 @@
 
 import java.util.Collection;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -23,8 +24,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -96,18 +100,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.INVOCATION_ACTION__INPUT, INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.INVOCATION_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.INVOCATION_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.INVOCATION_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -117,9 +116,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<InputPin> getArguments() {
-		return (EList<InputPin>) eDynamicGet(
-			UMLPackage.INVOCATION_ACTION__ARGUMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INVOCATION_ACTION__ARGUMENT, true, true);
+		return (EList<InputPin>) eDynamicGet(UMLPackage.INVOCATION_ACTION__ARGUMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INVOCATION_ACTION__ARGUMENT, true, true);
 	}
 
 	/**
@@ -162,20 +159,16 @@
 	 */
 	public InputPin getArgument(String name, Type type, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		argumentLoop : for (InputPin argument : getArguments()) {
+		argumentLoop: for (InputPin argument : getArguments()) {
 			if (eClass != null && !eClass.isInstance(argument))
 				continue argumentLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(argument.getName())
-				: name.equals(argument.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(argument.getName()) : name.equals(argument.getName())))
 				continue argumentLoop;
 			if (type != null && !type.equals(argument.getType()))
 				continue argumentLoop;
 			return argument;
 		}
-		return createOnDemand && eClass != null
-			? createArgument(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createArgument(name, type, eClass) : null;
 	}
 
 	/**
@@ -184,9 +177,7 @@
 	 * @generated
 	 */
 	public Port getOnPort() {
-		return (Port) eDynamicGet(
-			UMLPackage.INVOCATION_ACTION__ON_PORT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INVOCATION_ACTION__ON_PORT, true, true);
+		return (Port) eDynamicGet(UMLPackage.INVOCATION_ACTION__ON_PORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INVOCATION_ACTION__ON_PORT, true, true);
 	}
 
 	/**
@@ -195,9 +186,7 @@
 	 * @generated
 	 */
 	public Port basicGetOnPort() {
-		return (Port) eDynamicGet(
-			UMLPackage.INVOCATION_ACTION__ON_PORT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INVOCATION_ACTION__ON_PORT, false, true);
+		return (Port) eDynamicGet(UMLPackage.INVOCATION_ACTION__ON_PORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INVOCATION_ACTION__ON_PORT, false, true);
 	}
 
 	/**
@@ -206,9 +195,7 @@
 	 * @generated
 	 */
 	public void setOnPort(Port newOnPort) {
-		eDynamicSet(
-			UMLPackage.INVOCATION_ACTION__ON_PORT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INVOCATION_ACTION__ON_PORT, newOnPort);
+		eDynamicSet(UMLPackage.INVOCATION_ACTION__ON_PORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INVOCATION_ACTION__ON_PORT, newOnPort);
 	}
 
 	/**
@@ -220,40 +207,30 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.INVOCATION_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INVOCATION_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INVOCATION_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.INVOCATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INVOCATION_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.INVOCATION_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.INVOCATION_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.INVOCATION_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INVOCATION_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.INVOCATION_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INVOCATION_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.INVOCATION_ACTION__ARGUMENT :
-				return ((InternalEList<?>) getArguments()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.INVOCATION_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INVOCATION_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INVOCATION_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.INVOCATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INVOCATION_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.INVOCATION_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INVOCATION_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INVOCATION_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INVOCATION_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INVOCATION_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INVOCATION_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.INVOCATION_ACTION__ARGUMENT:
+			return ((InternalEList<?>) getArguments()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -266,80 +243,80 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.INVOCATION_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.INVOCATION_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.INVOCATION_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.INVOCATION_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.INVOCATION_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.INVOCATION_ACTION__NAME :
-				return getName();
-			case UMLPackage.INVOCATION_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.INVOCATION_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.INVOCATION_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.INVOCATION_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.INVOCATION_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.INVOCATION_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.INVOCATION_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.INVOCATION_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.INVOCATION_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.INVOCATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.INVOCATION_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.INVOCATION_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.INVOCATION_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.INVOCATION_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.INVOCATION_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.INVOCATION_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.INVOCATION_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.INVOCATION_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.INVOCATION_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.INVOCATION_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.INVOCATION_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.INVOCATION_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.INVOCATION_ACTION__ARGUMENT :
-				return getArguments();
-			case UMLPackage.INVOCATION_ACTION__ON_PORT :
-				if (resolve)
-					return getOnPort();
-				return basicGetOnPort();
+		case UMLPackage.INVOCATION_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.INVOCATION_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.INVOCATION_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.INVOCATION_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.INVOCATION_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.INVOCATION_ACTION__NAME:
+			return getName();
+		case UMLPackage.INVOCATION_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.INVOCATION_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.INVOCATION_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.INVOCATION_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.INVOCATION_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.INVOCATION_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.INVOCATION_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.INVOCATION_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.INVOCATION_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.INVOCATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.INVOCATION_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.INVOCATION_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.INVOCATION_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.INVOCATION_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.INVOCATION_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.INVOCATION_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.INVOCATION_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.INVOCATION_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.INVOCATION_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.INVOCATION_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.INVOCATION_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.INVOCATION_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.INVOCATION_ACTION__ARGUMENT:
+			return getArguments();
+		case UMLPackage.INVOCATION_ACTION__ON_PORT:
+			if (resolve)
+				return getOnPort();
+			return basicGetOnPort();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -353,85 +330,74 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.INVOCATION_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__ARGUMENT :
-				getArguments().clear();
-				getArguments()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.INVOCATION_ACTION__ON_PORT :
-				setOnPort((Port) newValue);
-				return;
+		case UMLPackage.INVOCATION_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__ARGUMENT:
+			getArguments().clear();
+			getArguments().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.INVOCATION_ACTION__ON_PORT:
+			setOnPort((Port) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -444,63 +410,63 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INVOCATION_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.INVOCATION_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.INVOCATION_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.INVOCATION_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.INVOCATION_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.INVOCATION_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.INVOCATION_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.INVOCATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.INVOCATION_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.INVOCATION_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.INVOCATION_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.INVOCATION_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.INVOCATION_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.INVOCATION_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.INVOCATION_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.INVOCATION_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.INVOCATION_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.INVOCATION_ACTION__ARGUMENT :
-				getArguments().clear();
-				return;
-			case UMLPackage.INVOCATION_ACTION__ON_PORT :
-				setOnPort((Port) null);
-				return;
+		case UMLPackage.INVOCATION_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.INVOCATION_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.INVOCATION_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.INVOCATION_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.INVOCATION_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.INVOCATION_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.INVOCATION_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.INVOCATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.INVOCATION_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.INVOCATION_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.INVOCATION_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.INVOCATION_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.INVOCATION_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.INVOCATION_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.INVOCATION_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.INVOCATION_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.INVOCATION_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.INVOCATION_ACTION__ARGUMENT:
+			getArguments().clear();
+			return;
+		case UMLPackage.INVOCATION_ACTION__ON_PORT:
+			setOnPort((Port) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -513,68 +479,66 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.INVOCATION_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.INVOCATION_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.INVOCATION_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.INVOCATION_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.INVOCATION_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.INVOCATION_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.INVOCATION_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.INVOCATION_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.INVOCATION_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.INVOCATION_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.INVOCATION_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.INVOCATION_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.INVOCATION_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.INVOCATION_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.INVOCATION_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.INVOCATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.INVOCATION_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.INVOCATION_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.INVOCATION_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.INVOCATION_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.INVOCATION_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.INVOCATION_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.INVOCATION_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.INVOCATION_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.INVOCATION_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.INVOCATION_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.INVOCATION_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.INVOCATION_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.INVOCATION_ACTION__ARGUMENT :
-				return !getArguments().isEmpty();
-			case UMLPackage.INVOCATION_ACTION__ON_PORT :
-				return basicGetOnPort() != null;
+		case UMLPackage.INVOCATION_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.INVOCATION_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.INVOCATION_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.INVOCATION_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.INVOCATION_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.INVOCATION_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.INVOCATION_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.INVOCATION_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.INVOCATION_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.INVOCATION_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.INVOCATION_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.INVOCATION_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.INVOCATION_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.INVOCATION_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.INVOCATION_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.INVOCATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.INVOCATION_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.INVOCATION_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.INVOCATION_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.INVOCATION_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.INVOCATION_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.INVOCATION_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.INVOCATION_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.INVOCATION_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.INVOCATION_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.INVOCATION_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.INVOCATION_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.INVOCATION_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.INVOCATION_ACTION__ARGUMENT:
+			return !getArguments().isEmpty();
+		case UMLPackage.INVOCATION_ACTION__ON_PORT:
+			return basicGetOnPort() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -587,8 +551,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.INVOCATION_ACTION__ARGUMENT};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.INVOCATION_ACTION__ARGUMENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -598,7 +561,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.INVOCATION_ACTION__ARGUMENT);
+				|| eIsSet(UMLPackage.INVOCATION_ACTION__ARGUMENT);
 	}
 
 } //InvocationActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/JoinNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/JoinNodeImpl.java
index 929e62f..c0588b7 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/JoinNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/JoinNodeImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,6 +29,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -115,20 +118,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.JOIN_NODE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.JOIN_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.JOIN_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.JOIN_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -137,9 +133,7 @@
 	 * @generated
 	 */
 	public boolean isCombineDuplicate() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.JOIN_NODE__IS_COMBINE_DUPLICATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.JOIN_NODE__IS_COMBINE_DUPLICATE, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.JOIN_NODE__IS_COMBINE_DUPLICATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.JOIN_NODE__IS_COMBINE_DUPLICATE, true, true);
 	}
 
 	/**
@@ -148,10 +142,7 @@
 	 * @generated
 	 */
 	public void setIsCombineDuplicate(boolean newIsCombineDuplicate) {
-		eDynamicSet(
-			UMLPackage.JOIN_NODE__IS_COMBINE_DUPLICATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.JOIN_NODE__IS_COMBINE_DUPLICATE,
-			newIsCombineDuplicate);
+		eDynamicSet(UMLPackage.JOIN_NODE__IS_COMBINE_DUPLICATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.JOIN_NODE__IS_COMBINE_DUPLICATE, newIsCombineDuplicate);
 	}
 
 	/**
@@ -160,9 +151,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getJoinSpec() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.JOIN_NODE__JOIN_SPEC - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.JOIN_NODE__JOIN_SPEC, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.JOIN_NODE__JOIN_SPEC - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.JOIN_NODE__JOIN_SPEC, true, true);
 	}
 
 	/**
@@ -171,9 +160,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetJoinSpec() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.JOIN_NODE__JOIN_SPEC - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.JOIN_NODE__JOIN_SPEC, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.JOIN_NODE__JOIN_SPEC - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.JOIN_NODE__JOIN_SPEC, false, true);
 	}
 
 	/**
@@ -183,8 +170,7 @@
 	 */
 	public NotificationChain basicSetJoinSpec(ValueSpecification newJoinSpec,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newJoinSpec,
-			UMLPackage.JOIN_NODE__JOIN_SPEC, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newJoinSpec, UMLPackage.JOIN_NODE__JOIN_SPEC, msgs);
 		return msgs;
 	}
 
@@ -194,8 +180,7 @@
 	 * @generated
 	 */
 	public void setJoinSpec(ValueSpecification newJoinSpec) {
-		eDynamicSet(UMLPackage.JOIN_NODE__JOIN_SPEC - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.JOIN_NODE__JOIN_SPEC, newJoinSpec);
+		eDynamicSet(UMLPackage.JOIN_NODE__JOIN_SPEC - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.JOIN_NODE__JOIN_SPEC, newJoinSpec);
 	}
 
 	/**
@@ -221,8 +206,7 @@
 	 */
 	public boolean validateOneOutgoingEdge(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return JoinNodeOperations.validateOneOutgoingEdge(this, diagnostics,
-			context);
+		return JoinNodeOperations.validateOneOutgoingEdge(this, diagnostics, context);
 	}
 
 	/**
@@ -232,8 +216,7 @@
 	 */
 	public boolean validateIncomingObjectFlow(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return JoinNodeOperations.validateIncomingObjectFlow(this, diagnostics,
-			context);
+		return JoinNodeOperations.validateIncomingObjectFlow(this, diagnostics, context);
 	}
 
 	/**
@@ -245,30 +228,24 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.JOIN_NODE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.JOIN_NODE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.JOIN_NODE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.JOIN_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.JOIN_NODE__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.JOIN_NODE__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.JOIN_NODE__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.JOIN_NODE__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.JOIN_NODE__JOIN_SPEC :
-				return basicSetJoinSpec(null, msgs);
+		case UMLPackage.JOIN_NODE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.JOIN_NODE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.JOIN_NODE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.JOIN_NODE__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.JOIN_NODE__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.JOIN_NODE__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.JOIN_NODE__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.JOIN_NODE__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.JOIN_NODE__JOIN_SPEC:
+			return basicSetJoinSpec(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -281,64 +258,64 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.JOIN_NODE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.JOIN_NODE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.JOIN_NODE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.JOIN_NODE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.JOIN_NODE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.JOIN_NODE__NAME :
-				return getName();
-			case UMLPackage.JOIN_NODE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.JOIN_NODE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.JOIN_NODE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.JOIN_NODE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.JOIN_NODE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.JOIN_NODE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.JOIN_NODE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.JOIN_NODE__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.JOIN_NODE__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.JOIN_NODE__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.JOIN_NODE__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.JOIN_NODE__INCOMING :
-				return getIncomings();
-			case UMLPackage.JOIN_NODE__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.JOIN_NODE__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.JOIN_NODE__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.JOIN_NODE__IS_COMBINE_DUPLICATE :
-				return isCombineDuplicate();
-			case UMLPackage.JOIN_NODE__JOIN_SPEC :
-				if (resolve)
-					return getJoinSpec();
-				return basicGetJoinSpec();
+		case UMLPackage.JOIN_NODE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.JOIN_NODE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.JOIN_NODE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.JOIN_NODE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.JOIN_NODE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.JOIN_NODE__NAME:
+			return getName();
+		case UMLPackage.JOIN_NODE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.JOIN_NODE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.JOIN_NODE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.JOIN_NODE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.JOIN_NODE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.JOIN_NODE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.JOIN_NODE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.JOIN_NODE__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.JOIN_NODE__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.JOIN_NODE__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.JOIN_NODE__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.JOIN_NODE__INCOMING:
+			return getIncomings();
+		case UMLPackage.JOIN_NODE__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.JOIN_NODE__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.JOIN_NODE__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.JOIN_NODE__IS_COMBINE_DUPLICATE:
+			return isCombineDuplicate();
+		case UMLPackage.JOIN_NODE__JOIN_SPEC:
+			if (resolve)
+				return getJoinSpec();
+			return basicGetJoinSpec();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -352,65 +329,58 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.JOIN_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.JOIN_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.JOIN_NODE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.JOIN_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.JOIN_NODE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.JOIN_NODE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.JOIN_NODE__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.JOIN_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.JOIN_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.JOIN_NODE__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.JOIN_NODE__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.JOIN_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.JOIN_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.JOIN_NODE__IS_COMBINE_DUPLICATE :
-				setIsCombineDuplicate((Boolean) newValue);
-				return;
-			case UMLPackage.JOIN_NODE__JOIN_SPEC :
-				setJoinSpec((ValueSpecification) newValue);
-				return;
+		case UMLPackage.JOIN_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.JOIN_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.JOIN_NODE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.JOIN_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.JOIN_NODE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.JOIN_NODE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.JOIN_NODE__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.JOIN_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.JOIN_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.JOIN_NODE__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.JOIN_NODE__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.JOIN_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.JOIN_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.JOIN_NODE__IS_COMBINE_DUPLICATE:
+			setIsCombineDuplicate((Boolean) newValue);
+			return;
+		case UMLPackage.JOIN_NODE__JOIN_SPEC:
+			setJoinSpec((ValueSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -423,51 +393,51 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.JOIN_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.JOIN_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.JOIN_NODE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.JOIN_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.JOIN_NODE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.JOIN_NODE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.JOIN_NODE__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.JOIN_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.JOIN_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.JOIN_NODE__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.JOIN_NODE__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.JOIN_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.JOIN_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.JOIN_NODE__IS_COMBINE_DUPLICATE :
-				setIsCombineDuplicate(IS_COMBINE_DUPLICATE_EDEFAULT);
-				return;
-			case UMLPackage.JOIN_NODE__JOIN_SPEC :
-				setJoinSpec((ValueSpecification) null);
-				return;
+		case UMLPackage.JOIN_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.JOIN_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.JOIN_NODE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.JOIN_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.JOIN_NODE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.JOIN_NODE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.JOIN_NODE__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.JOIN_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.JOIN_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.JOIN_NODE__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.JOIN_NODE__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.JOIN_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.JOIN_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.JOIN_NODE__IS_COMBINE_DUPLICATE:
+			setIsCombineDuplicate(IS_COMBINE_DUPLICATE_EDEFAULT);
+			return;
+		case UMLPackage.JOIN_NODE__JOIN_SPEC:
+			setJoinSpec((ValueSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -480,54 +450,52 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.JOIN_NODE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.JOIN_NODE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.JOIN_NODE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.JOIN_NODE__OWNER :
-				return isSetOwner();
-			case UMLPackage.JOIN_NODE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.JOIN_NODE__NAME :
-				return isSetName();
-			case UMLPackage.JOIN_NODE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.JOIN_NODE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.JOIN_NODE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.JOIN_NODE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.JOIN_NODE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.JOIN_NODE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.JOIN_NODE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.JOIN_NODE__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.JOIN_NODE__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.JOIN_NODE__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.JOIN_NODE__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.JOIN_NODE__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.JOIN_NODE__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.JOIN_NODE__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.JOIN_NODE__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.JOIN_NODE__IS_COMBINE_DUPLICATE :
-				return isCombineDuplicate() != IS_COMBINE_DUPLICATE_EDEFAULT;
-			case UMLPackage.JOIN_NODE__JOIN_SPEC :
-				return basicGetJoinSpec() != null;
+		case UMLPackage.JOIN_NODE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.JOIN_NODE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.JOIN_NODE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.JOIN_NODE__OWNER:
+			return isSetOwner();
+		case UMLPackage.JOIN_NODE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.JOIN_NODE__NAME:
+			return isSetName();
+		case UMLPackage.JOIN_NODE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.JOIN_NODE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.JOIN_NODE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.JOIN_NODE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.JOIN_NODE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.JOIN_NODE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.JOIN_NODE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.JOIN_NODE__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.JOIN_NODE__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.JOIN_NODE__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.JOIN_NODE__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.JOIN_NODE__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.JOIN_NODE__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.JOIN_NODE__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.JOIN_NODE__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.JOIN_NODE__IS_COMBINE_DUPLICATE:
+			return isCombineDuplicate() != IS_COMBINE_DUPLICATE_EDEFAULT;
+		case UMLPackage.JOIN_NODE__JOIN_SPEC:
+			return basicGetJoinSpec() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -542,152 +510,126 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.JOIN_NODE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.JOIN_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.JOIN_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.JOIN_NODE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.JOIN_NODE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.JOIN_NODE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.JOIN_NODE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.JOIN_NODE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.JOIN_NODE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.JOIN_NODE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.JOIN_NODE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.JOIN_NODE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.JOIN_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.JOIN_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.JOIN_NODE___GET_MODEL :
-				return getModel();
-			case UMLPackage.JOIN_NODE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.JOIN_NODE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.JOIN_NODE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.JOIN_NODE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.JOIN_NODE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.JOIN_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.JOIN_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.JOIN_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.JOIN_NODE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.JOIN_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.JOIN_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.JOIN_NODE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.JOIN_NODE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.JOIN_NODE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.JOIN_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.JOIN_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.JOIN_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.JOIN_NODE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.JOIN_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.JOIN_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.JOIN_NODE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.JOIN_NODE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.JOIN_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.JOIN_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.JOIN_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.JOIN_NODE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.JOIN_NODE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.JOIN_NODE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.JOIN_NODE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.JOIN_NODE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.JOIN_NODE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.JOIN_NODE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.JOIN_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.JOIN_NODE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.JOIN_NODE___SEPARATOR :
-				return separator();
-			case UMLPackage.JOIN_NODE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.JOIN_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.JOIN_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.JOIN_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.JOIN_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.JOIN_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.JOIN_NODE___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.JOIN_NODE___VALIDATE_ONE_OUTGOING_EDGE__DIAGNOSTICCHAIN_MAP :
-				return validateOneOutgoingEdge(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.JOIN_NODE___VALIDATE_INCOMING_OBJECT_FLOW__DIAGNOSTICCHAIN_MAP :
-				return validateIncomingObjectFlow(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.JOIN_NODE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.JOIN_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.JOIN_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.JOIN_NODE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.JOIN_NODE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.JOIN_NODE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.JOIN_NODE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.JOIN_NODE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.JOIN_NODE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.JOIN_NODE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.JOIN_NODE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.JOIN_NODE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.JOIN_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.JOIN_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.JOIN_NODE___GET_MODEL:
+			return getModel();
+		case UMLPackage.JOIN_NODE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.JOIN_NODE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.JOIN_NODE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.JOIN_NODE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.JOIN_NODE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.JOIN_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.JOIN_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.JOIN_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.JOIN_NODE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.JOIN_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.JOIN_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.JOIN_NODE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.JOIN_NODE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.JOIN_NODE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.JOIN_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.JOIN_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.JOIN_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.JOIN_NODE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.JOIN_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.JOIN_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.JOIN_NODE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.JOIN_NODE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.JOIN_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.JOIN_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.JOIN_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.JOIN_NODE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.JOIN_NODE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.JOIN_NODE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.JOIN_NODE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.JOIN_NODE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.JOIN_NODE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.JOIN_NODE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.JOIN_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.JOIN_NODE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.JOIN_NODE___SEPARATOR:
+			return separator();
+		case UMLPackage.JOIN_NODE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.JOIN_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.JOIN_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.JOIN_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.JOIN_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.JOIN_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.JOIN_NODE___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.JOIN_NODE___VALIDATE_ONE_OUTGOING_EDGE__DIAGNOSTICCHAIN_MAP:
+			return validateOneOutgoingEdge((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.JOIN_NODE___VALIDATE_INCOMING_OBJECT_FLOW__DIAGNOSTICCHAIN_MAP:
+			return validateIncomingObjectFlow((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -700,9 +642,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.JOIN_NODE__OWNED_COMMENT,
-		UMLPackage.JOIN_NODE__NAME_EXPRESSION, UMLPackage.JOIN_NODE__JOIN_SPEC};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.JOIN_NODE__OWNED_COMMENT, UMLPackage.JOIN_NODE__NAME_EXPRESSION, UMLPackage.JOIN_NODE__JOIN_SPEC };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -712,7 +652,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.JOIN_NODE__JOIN_SPEC);
+				|| eIsSet(UMLPackage.JOIN_NODE__JOIN_SPEC);
 	}
 
 } //JoinNodeImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LifelineImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LifelineImpl.java
index 16759e9..a1ce193 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LifelineImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LifelineImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,8 +28,12 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -102,9 +107,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -118,19 +121,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.LIFELINE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.LIFELINE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.LIFELINE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.LIFELINE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -139,9 +136,7 @@
 	 * @generated
 	 */
 	public ConnectableElement getRepresents() {
-		return (ConnectableElement) eDynamicGet(
-			UMLPackage.LIFELINE__REPRESENTS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LIFELINE__REPRESENTS, true, true);
+		return (ConnectableElement) eDynamicGet(UMLPackage.LIFELINE__REPRESENTS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LIFELINE__REPRESENTS, true, true);
 	}
 
 	/**
@@ -150,9 +145,7 @@
 	 * @generated
 	 */
 	public ConnectableElement basicGetRepresents() {
-		return (ConnectableElement) eDynamicGet(
-			UMLPackage.LIFELINE__REPRESENTS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LIFELINE__REPRESENTS, false, true);
+		return (ConnectableElement) eDynamicGet(UMLPackage.LIFELINE__REPRESENTS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LIFELINE__REPRESENTS, false, true);
 	}
 
 	/**
@@ -161,8 +154,7 @@
 	 * @generated
 	 */
 	public void setRepresents(ConnectableElement newRepresents) {
-		eDynamicSet(UMLPackage.LIFELINE__REPRESENTS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LIFELINE__REPRESENTS, newRepresents);
+		eDynamicSet(UMLPackage.LIFELINE__REPRESENTS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LIFELINE__REPRESENTS, newRepresents);
 	}
 
 	/**
@@ -171,9 +163,7 @@
 	 * @generated
 	 */
 	public Interaction getInteraction() {
-		return (Interaction) eDynamicGet(
-			UMLPackage.LIFELINE__INTERACTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LIFELINE__INTERACTION, true, true);
+		return (Interaction) eDynamicGet(UMLPackage.LIFELINE__INTERACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LIFELINE__INTERACTION, true, true);
 	}
 
 	/**
@@ -182,9 +172,7 @@
 	 * @generated
 	 */
 	public Interaction basicGetInteraction() {
-		return (Interaction) eDynamicGet(
-			UMLPackage.LIFELINE__INTERACTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LIFELINE__INTERACTION, false, true);
+		return (Interaction) eDynamicGet(UMLPackage.LIFELINE__INTERACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LIFELINE__INTERACTION, false, true);
 	}
 
 	/**
@@ -194,8 +182,7 @@
 	 */
 	public NotificationChain basicSetInteraction(Interaction newInteraction,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newInteraction,
-			UMLPackage.LIFELINE__INTERACTION, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newInteraction, UMLPackage.LIFELINE__INTERACTION, msgs);
 		return msgs;
 	}
 
@@ -205,8 +192,7 @@
 	 * @generated
 	 */
 	public void setInteraction(Interaction newInteraction) {
-		eDynamicSet(UMLPackage.LIFELINE__INTERACTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LIFELINE__INTERACTION, newInteraction);
+		eDynamicSet(UMLPackage.LIFELINE__INTERACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LIFELINE__INTERACTION, newInteraction);
 	}
 
 	/**
@@ -215,9 +201,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getSelector() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.LIFELINE__SELECTOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LIFELINE__SELECTOR, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.LIFELINE__SELECTOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LIFELINE__SELECTOR, true, true);
 	}
 
 	/**
@@ -226,9 +210,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetSelector() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.LIFELINE__SELECTOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LIFELINE__SELECTOR, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.LIFELINE__SELECTOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LIFELINE__SELECTOR, false, true);
 	}
 
 	/**
@@ -238,8 +220,7 @@
 	 */
 	public NotificationChain basicSetSelector(ValueSpecification newSelector,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newSelector,
-			UMLPackage.LIFELINE__SELECTOR, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newSelector, UMLPackage.LIFELINE__SELECTOR, msgs);
 		return msgs;
 	}
 
@@ -249,8 +230,7 @@
 	 * @generated
 	 */
 	public void setSelector(ValueSpecification newSelector) {
-		eDynamicSet(UMLPackage.LIFELINE__SELECTOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LIFELINE__SELECTOR, newSelector);
+		eDynamicSet(UMLPackage.LIFELINE__SELECTOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LIFELINE__SELECTOR, newSelector);
 	}
 
 	/**
@@ -275,9 +255,7 @@
 	 * @generated
 	 */
 	public PartDecomposition getDecomposedAs() {
-		return (PartDecomposition) eDynamicGet(
-			UMLPackage.LIFELINE__DECOMPOSED_AS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LIFELINE__DECOMPOSED_AS, true, true);
+		return (PartDecomposition) eDynamicGet(UMLPackage.LIFELINE__DECOMPOSED_AS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LIFELINE__DECOMPOSED_AS, true, true);
 	}
 
 	/**
@@ -286,9 +264,7 @@
 	 * @generated
 	 */
 	public PartDecomposition basicGetDecomposedAs() {
-		return (PartDecomposition) eDynamicGet(
-			UMLPackage.LIFELINE__DECOMPOSED_AS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LIFELINE__DECOMPOSED_AS, false, true);
+		return (PartDecomposition) eDynamicGet(UMLPackage.LIFELINE__DECOMPOSED_AS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LIFELINE__DECOMPOSED_AS, false, true);
 	}
 
 	/**
@@ -297,8 +273,7 @@
 	 * @generated
 	 */
 	public void setDecomposedAs(PartDecomposition newDecomposedAs) {
-		eDynamicSet(UMLPackage.LIFELINE__DECOMPOSED_AS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LIFELINE__DECOMPOSED_AS, newDecomposedAs);
+		eDynamicSet(UMLPackage.LIFELINE__DECOMPOSED_AS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LIFELINE__DECOMPOSED_AS, newDecomposedAs);
 	}
 
 	/**
@@ -308,9 +283,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<InteractionFragment> getCoveredBys() {
-		return (EList<InteractionFragment>) eDynamicGet(
-			UMLPackage.LIFELINE__COVERED_BY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LIFELINE__COVERED_BY, true, true);
+		return (EList<InteractionFragment>) eDynamicGet(UMLPackage.LIFELINE__COVERED_BY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LIFELINE__COVERED_BY, true, true);
 	}
 
 	/**
@@ -329,12 +302,10 @@
 	 */
 	public InteractionFragment getCoveredBy(String name, boolean ignoreCase,
 			EClass eClass) {
-		coveredByLoop : for (InteractionFragment coveredBy : getCoveredBys()) {
+		coveredByLoop: for (InteractionFragment coveredBy : getCoveredBys()) {
 			if (eClass != null && !eClass.isInstance(coveredBy))
 				continue coveredByLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(coveredBy.getName())
-				: name.equals(coveredBy.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(coveredBy.getName()) : name.equals(coveredBy.getName())))
 				continue coveredByLoop;
 			return coveredBy;
 		}
@@ -348,8 +319,7 @@
 	 */
 	public boolean validateInteractionUsesShareLifeline(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return LifelineOperations.validateInteractionUsesShareLifeline(this,
-			diagnostics, context);
+		return LifelineOperations.validateInteractionUsesShareLifeline(this, diagnostics, context);
 	}
 
 	/**
@@ -359,8 +329,7 @@
 	 */
 	public boolean validateSelectorSpecified(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LifelineOperations.validateSelectorSpecified(this, diagnostics,
-			context);
+		return LifelineOperations.validateSelectorSpecified(this, diagnostics, context);
 	}
 
 	/**
@@ -370,8 +339,7 @@
 	 */
 	public boolean validateSameClassifier(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LifelineOperations.validateSameClassifier(this, diagnostics,
-			context);
+		return LifelineOperations.validateSameClassifier(this, diagnostics, context);
 	}
 
 	/**
@@ -381,8 +349,7 @@
 	 */
 	public boolean validateSelectorIntOrString(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LifelineOperations.validateSelectorIntOrString(this, diagnostics,
-			context);
+		return LifelineOperations.validateSelectorIntOrString(this, diagnostics, context);
 	}
 
 	/**
@@ -395,16 +362,14 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.LIFELINE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.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<InternalEObject>) (InternalEList<?>) getCoveredBys())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.LIFELINE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).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<InternalEObject>) (InternalEList<?>) getCoveredBys()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -418,21 +383,18 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.LIFELINE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LIFELINE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LIFELINE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.LIFELINE__INTERACTION :
-				return basicSetInteraction(null, msgs);
-			case UMLPackage.LIFELINE__SELECTOR :
-				return basicSetSelector(null, msgs);
-			case UMLPackage.LIFELINE__COVERED_BY :
-				return ((InternalEList<?>) getCoveredBys())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.LIFELINE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LIFELINE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LIFELINE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.LIFELINE__INTERACTION:
+			return basicSetInteraction(null, msgs);
+		case UMLPackage.LIFELINE__SELECTOR:
+			return basicSetSelector(null, msgs);
+		case UMLPackage.LIFELINE__COVERED_BY:
+			return ((InternalEList<?>) getCoveredBys()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -446,9 +408,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.LIFELINE__INTERACTION :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.INTERACTION__LIFELINE, Interaction.class, msgs);
+		case UMLPackage.LIFELINE__INTERACTION:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.INTERACTION__LIFELINE, Interaction.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -461,50 +422,50 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.LIFELINE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.LIFELINE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.LIFELINE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.LIFELINE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.LIFELINE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.LIFELINE__NAME :
-				return getName();
-			case UMLPackage.LIFELINE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.LIFELINE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.LIFELINE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LIFELINE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.LIFELINE__DECOMPOSED_AS :
-				if (resolve)
-					return getDecomposedAs();
-				return basicGetDecomposedAs();
-			case UMLPackage.LIFELINE__INTERACTION :
-				if (resolve)
-					return getInteraction();
-				return basicGetInteraction();
-			case UMLPackage.LIFELINE__REPRESENTS :
-				if (resolve)
-					return getRepresents();
-				return basicGetRepresents();
-			case UMLPackage.LIFELINE__SELECTOR :
-				if (resolve)
-					return getSelector();
-				return basicGetSelector();
-			case UMLPackage.LIFELINE__COVERED_BY :
-				return getCoveredBys();
+		case UMLPackage.LIFELINE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.LIFELINE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.LIFELINE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.LIFELINE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.LIFELINE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.LIFELINE__NAME:
+			return getName();
+		case UMLPackage.LIFELINE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.LIFELINE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.LIFELINE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LIFELINE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.LIFELINE__DECOMPOSED_AS:
+			if (resolve)
+				return getDecomposedAs();
+			return basicGetDecomposedAs();
+		case UMLPackage.LIFELINE__INTERACTION:
+			if (resolve)
+				return getInteraction();
+			return basicGetInteraction();
+		case UMLPackage.LIFELINE__REPRESENTS:
+			if (resolve)
+				return getRepresents();
+			return basicGetRepresents();
+		case UMLPackage.LIFELINE__SELECTOR:
+			if (resolve)
+				return getSelector();
+			return basicGetSelector();
+		case UMLPackage.LIFELINE__COVERED_BY:
+			return getCoveredBys();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -518,42 +479,39 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.LIFELINE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.LIFELINE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.LIFELINE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.LIFELINE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.LIFELINE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.LIFELINE__DECOMPOSED_AS :
-				setDecomposedAs((PartDecomposition) newValue);
-				return;
-			case UMLPackage.LIFELINE__INTERACTION :
-				setInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.LIFELINE__REPRESENTS :
-				setRepresents((ConnectableElement) newValue);
-				return;
-			case UMLPackage.LIFELINE__SELECTOR :
-				setSelector((ValueSpecification) newValue);
-				return;
-			case UMLPackage.LIFELINE__COVERED_BY :
-				getCoveredBys().clear();
-				getCoveredBys().addAll(
-					(Collection<? extends InteractionFragment>) newValue);
-				return;
+		case UMLPackage.LIFELINE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.LIFELINE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.LIFELINE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.LIFELINE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.LIFELINE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.LIFELINE__DECOMPOSED_AS:
+			setDecomposedAs((PartDecomposition) newValue);
+			return;
+		case UMLPackage.LIFELINE__INTERACTION:
+			setInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.LIFELINE__REPRESENTS:
+			setRepresents((ConnectableElement) newValue);
+			return;
+		case UMLPackage.LIFELINE__SELECTOR:
+			setSelector((ValueSpecification) newValue);
+			return;
+		case UMLPackage.LIFELINE__COVERED_BY:
+			getCoveredBys().clear();
+			getCoveredBys().addAll((Collection<? extends InteractionFragment>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -566,36 +524,36 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LIFELINE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.LIFELINE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.LIFELINE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.LIFELINE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.LIFELINE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.LIFELINE__DECOMPOSED_AS :
-				setDecomposedAs((PartDecomposition) null);
-				return;
-			case UMLPackage.LIFELINE__INTERACTION :
-				setInteraction((Interaction) null);
-				return;
-			case UMLPackage.LIFELINE__REPRESENTS :
-				setRepresents((ConnectableElement) null);
-				return;
-			case UMLPackage.LIFELINE__SELECTOR :
-				setSelector((ValueSpecification) null);
-				return;
-			case UMLPackage.LIFELINE__COVERED_BY :
-				getCoveredBys().clear();
-				return;
+		case UMLPackage.LIFELINE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.LIFELINE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.LIFELINE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.LIFELINE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.LIFELINE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.LIFELINE__DECOMPOSED_AS:
+			setDecomposedAs((PartDecomposition) null);
+			return;
+		case UMLPackage.LIFELINE__INTERACTION:
+			setInteraction((Interaction) null);
+			return;
+		case UMLPackage.LIFELINE__REPRESENTS:
+			setRepresents((ConnectableElement) null);
+			return;
+		case UMLPackage.LIFELINE__SELECTOR:
+			setSelector((ValueSpecification) null);
+			return;
+		case UMLPackage.LIFELINE__COVERED_BY:
+			getCoveredBys().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -608,38 +566,36 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LIFELINE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.LIFELINE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.LIFELINE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.LIFELINE__OWNER :
-				return isSetOwner();
-			case UMLPackage.LIFELINE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.LIFELINE__NAME :
-				return isSetName();
-			case UMLPackage.LIFELINE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.LIFELINE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.LIFELINE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.LIFELINE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.LIFELINE__DECOMPOSED_AS :
-				return basicGetDecomposedAs() != null;
-			case UMLPackage.LIFELINE__INTERACTION :
-				return basicGetInteraction() != null;
-			case UMLPackage.LIFELINE__REPRESENTS :
-				return basicGetRepresents() != null;
-			case UMLPackage.LIFELINE__SELECTOR :
-				return basicGetSelector() != null;
-			case UMLPackage.LIFELINE__COVERED_BY :
-				return !getCoveredBys().isEmpty();
+		case UMLPackage.LIFELINE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.LIFELINE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.LIFELINE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.LIFELINE__OWNER:
+			return isSetOwner();
+		case UMLPackage.LIFELINE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.LIFELINE__NAME:
+			return isSetName();
+		case UMLPackage.LIFELINE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.LIFELINE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.LIFELINE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.LIFELINE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.LIFELINE__DECOMPOSED_AS:
+			return basicGetDecomposedAs() != null;
+		case UMLPackage.LIFELINE__INTERACTION:
+			return basicGetInteraction() != null;
+		case UMLPackage.LIFELINE__REPRESENTS:
+			return basicGetRepresents() != null;
+		case UMLPackage.LIFELINE__SELECTOR:
+			return basicGetSelector() != null;
+		case UMLPackage.LIFELINE__COVERED_BY:
+			return !getCoveredBys().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -654,141 +610,118 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.LIFELINE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.LIFELINE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LIFELINE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LIFELINE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.LIFELINE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LIFELINE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.LIFELINE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.LIFELINE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.LIFELINE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.LIFELINE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.LIFELINE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.LIFELINE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.LIFELINE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LIFELINE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.LIFELINE___GET_MODEL :
-				return getModel();
-			case UMLPackage.LIFELINE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.LIFELINE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.LIFELINE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.LIFELINE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.LIFELINE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.LIFELINE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.LIFELINE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LIFELINE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.LIFELINE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.LIFELINE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.LIFELINE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LIFELINE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LIFELINE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.LIFELINE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LIFELINE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.LIFELINE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.LIFELINE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.LIFELINE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.LIFELINE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.LIFELINE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LIFELINE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.LIFELINE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.LIFELINE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LIFELINE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LIFELINE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LIFELINE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.LIFELINE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.LIFELINE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.LIFELINE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.LIFELINE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.LIFELINE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.LIFELINE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.LIFELINE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.LIFELINE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LIFELINE___SEPARATOR :
-				return separator();
-			case UMLPackage.LIFELINE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.LIFELINE___VALIDATE_SELECTOR_SPECIFIED__DIAGNOSTICCHAIN_MAP :
-				return validateSelectorSpecified(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LIFELINE___VALIDATE_INTERACTION_USES_SHARE_LIFELINE__DIAGNOSTICCHAIN_MAP :
-				return validateInteractionUsesShareLifeline(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LIFELINE___VALIDATE_SAME_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateSameClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LIFELINE___VALIDATE_SELECTOR_INT_OR_STRING__DIAGNOSTICCHAIN_MAP :
-				return validateSelectorIntOrString(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LIFELINE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.LIFELINE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LIFELINE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LIFELINE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.LIFELINE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LIFELINE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.LIFELINE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.LIFELINE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.LIFELINE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.LIFELINE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.LIFELINE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.LIFELINE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.LIFELINE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LIFELINE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.LIFELINE___GET_MODEL:
+			return getModel();
+		case UMLPackage.LIFELINE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.LIFELINE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.LIFELINE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.LIFELINE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.LIFELINE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.LIFELINE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.LIFELINE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LIFELINE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.LIFELINE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.LIFELINE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.LIFELINE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LIFELINE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LIFELINE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.LIFELINE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LIFELINE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.LIFELINE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.LIFELINE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.LIFELINE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.LIFELINE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.LIFELINE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LIFELINE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.LIFELINE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.LIFELINE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LIFELINE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LIFELINE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LIFELINE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.LIFELINE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.LIFELINE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.LIFELINE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.LIFELINE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.LIFELINE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.LIFELINE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.LIFELINE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.LIFELINE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LIFELINE___SEPARATOR:
+			return separator();
+		case UMLPackage.LIFELINE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.LIFELINE___VALIDATE_SELECTOR_SPECIFIED__DIAGNOSTICCHAIN_MAP:
+			return validateSelectorSpecified((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LIFELINE___VALIDATE_INTERACTION_USES_SHARE_LIFELINE__DIAGNOSTICCHAIN_MAP:
+			return validateInteractionUsesShareLifeline((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LIFELINE___VALIDATE_SAME_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateSameClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LIFELINE___VALIDATE_SELECTOR_INT_OR_STRING__DIAGNOSTICCHAIN_MAP:
+			return validateSelectorIntOrString((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -815,7 +748,7 @@
 	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
-			|| eIsSet(UMLPackage.LIFELINE__INTERACTION);
+				|| eIsSet(UMLPackage.LIFELINE__INTERACTION);
 	}
 
 	/**
@@ -826,9 +759,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.LIFELINE__OWNED_COMMENT,
-		UMLPackage.LIFELINE__NAME_EXPRESSION, UMLPackage.LIFELINE__SELECTOR};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.LIFELINE__OWNED_COMMENT, UMLPackage.LIFELINE__NAME_EXPRESSION, UMLPackage.LIFELINE__SELECTOR };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -838,7 +769,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.LIFELINE__SELECTOR);
+				|| eIsSet(UMLPackage.LIFELINE__SELECTOR);
 	}
 
 } //LifelineImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkActionImpl.java
index 05d6066..c094202 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -29,6 +29,7 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -109,20 +110,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.LINK_ACTION__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.LINK_ACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.LINK_ACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.LINK_ACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -133,13 +127,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.LINK_ACTION__OWNED_COMMENT,
-		UMLPackage.LINK_ACTION__NAME_EXPRESSION,
-		UMLPackage.LINK_ACTION__HANDLER, UMLPackage.LINK_ACTION__INPUT,
-		UMLPackage.LINK_ACTION__LOCAL_POSTCONDITION,
-		UMLPackage.LINK_ACTION__LOCAL_PRECONDITION,
-		UMLPackage.LINK_ACTION__OUTPUT, UMLPackage.LINK_ACTION__END_DATA};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.LINK_ACTION__OWNED_COMMENT, UMLPackage.LINK_ACTION__NAME_EXPRESSION, UMLPackage.LINK_ACTION__HANDLER, UMLPackage.LINK_ACTION__INPUT, UMLPackage.LINK_ACTION__LOCAL_POSTCONDITION,
+			UMLPackage.LINK_ACTION__LOCAL_PRECONDITION, UMLPackage.LINK_ACTION__OUTPUT, UMLPackage.LINK_ACTION__END_DATA };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -152,18 +141,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this, UMLPackage.LINK_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.LINK_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.LINK_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.LINK_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -173,9 +157,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<LinkEndData> getEndData() {
-		return (EList<LinkEndData>) eDynamicGet(
-			UMLPackage.LINK_ACTION__END_DATA - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_ACTION__END_DATA, true, true);
+		return (EList<LinkEndData>) eDynamicGet(UMLPackage.LINK_ACTION__END_DATA - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_ACTION__END_DATA, true, true);
 	}
 
 	/**
@@ -205,9 +187,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<InputPin> getInputValues() {
-		return (EList<InputPin>) eDynamicGet(
-			UMLPackage.LINK_ACTION__INPUT_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_ACTION__INPUT_VALUE, true, true);
+		return (EList<InputPin>) eDynamicGet(UMLPackage.LINK_ACTION__INPUT_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_ACTION__INPUT_VALUE, true, true);
 	}
 
 	/**
@@ -250,20 +230,16 @@
 	 */
 	public InputPin getInputValue(String name, Type type, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		inputValueLoop : for (InputPin inputValue : getInputValues()) {
+		inputValueLoop: for (InputPin inputValue : getInputValues()) {
 			if (eClass != null && !eClass.isInstance(inputValue))
 				continue inputValueLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(inputValue.getName())
-				: name.equals(inputValue.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(inputValue.getName()) : name.equals(inputValue.getName())))
 				continue inputValueLoop;
 			if (type != null && !type.equals(inputValue.getType()))
 				continue inputValueLoop;
 			return inputValue;
 		}
-		return createOnDemand && eClass != null
-			? createInputValue(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createInputValue(name, type, eClass) : null;
 	}
 
 	/**
@@ -273,8 +249,7 @@
 	 */
 	public boolean validateSameAssociation(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LinkActionOperations.validateSameAssociation(this, diagnostics,
-			context);
+		return LinkActionOperations.validateSameAssociation(this, diagnostics, context);
 	}
 
 	/**
@@ -284,8 +259,7 @@
 	 */
 	public boolean validateNotStatic(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LinkActionOperations.validateNotStatic(this, diagnostics,
-			context);
+		return LinkActionOperations.validateNotStatic(this, diagnostics, context);
 	}
 
 	/**
@@ -295,8 +269,7 @@
 	 */
 	public boolean validateSamePins(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LinkActionOperations.validateSamePins(this, diagnostics,
-			context);
+		return LinkActionOperations.validateSamePins(this, diagnostics, context);
 	}
 
 	/**
@@ -317,43 +290,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.LINK_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LINK_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LINK_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LINK_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.LINK_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.LINK_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.LINK_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LINK_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.LINK_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LINK_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LINK_ACTION__END_DATA :
-				return ((InternalEList<?>) getEndData()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.LINK_ACTION__INPUT_VALUE :
-				return ((InternalEList<?>) getInputValues())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.LINK_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LINK_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LINK_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LINK_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.LINK_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LINK_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LINK_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LINK_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LINK_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LINK_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LINK_ACTION__END_DATA:
+			return ((InternalEList<?>) getEndData()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LINK_ACTION__INPUT_VALUE:
+			return ((InternalEList<?>) getInputValues()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -366,78 +328,78 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.LINK_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.LINK_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.LINK_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.LINK_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.LINK_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.LINK_ACTION__NAME :
-				return getName();
-			case UMLPackage.LINK_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.LINK_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.LINK_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LINK_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.LINK_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.LINK_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.LINK_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.LINK_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.LINK_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.LINK_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.LINK_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.LINK_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.LINK_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.LINK_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.LINK_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.LINK_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.LINK_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.LINK_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.LINK_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.LINK_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.LINK_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.LINK_ACTION__END_DATA :
-				return getEndData();
-			case UMLPackage.LINK_ACTION__INPUT_VALUE :
-				return getInputValues();
+		case UMLPackage.LINK_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.LINK_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.LINK_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.LINK_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.LINK_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.LINK_ACTION__NAME:
+			return getName();
+		case UMLPackage.LINK_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.LINK_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.LINK_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LINK_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.LINK_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.LINK_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.LINK_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.LINK_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.LINK_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.LINK_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.LINK_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.LINK_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.LINK_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.LINK_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.LINK_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.LINK_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.LINK_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.LINK_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.LINK_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.LINK_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.LINK_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.LINK_ACTION__END_DATA:
+			return getEndData();
+		case UMLPackage.LINK_ACTION__INPUT_VALUE:
+			return getInputValues();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -451,87 +413,75 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.LINK_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__END_DATA :
-				getEndData().clear();
-				getEndData()
-					.addAll((Collection<? extends LinkEndData>) newValue);
-				return;
-			case UMLPackage.LINK_ACTION__INPUT_VALUE :
-				getInputValues().clear();
-				getInputValues()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
+		case UMLPackage.LINK_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__END_DATA:
+			getEndData().clear();
+			getEndData().addAll((Collection<? extends LinkEndData>) newValue);
+			return;
+		case UMLPackage.LINK_ACTION__INPUT_VALUE:
+			getInputValues().clear();
+			getInputValues().addAll((Collection<? extends InputPin>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -544,63 +494,63 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LINK_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.LINK_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.LINK_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.LINK_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.LINK_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.LINK_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.LINK_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.LINK_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.LINK_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.LINK_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.LINK_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.LINK_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.LINK_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.LINK_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.LINK_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.LINK_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.LINK_ACTION__END_DATA :
-				getEndData().clear();
-				return;
-			case UMLPackage.LINK_ACTION__INPUT_VALUE :
-				getInputValues().clear();
-				return;
+		case UMLPackage.LINK_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.LINK_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.LINK_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.LINK_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.LINK_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.LINK_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.LINK_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.LINK_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.LINK_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.LINK_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.LINK_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.LINK_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.LINK_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.LINK_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.LINK_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.LINK_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.LINK_ACTION__END_DATA:
+			getEndData().clear();
+			return;
+		case UMLPackage.LINK_ACTION__INPUT_VALUE:
+			getInputValues().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -613,68 +563,66 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LINK_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.LINK_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.LINK_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.LINK_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.LINK_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.LINK_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.LINK_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.LINK_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.LINK_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.LINK_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.LINK_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.LINK_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.LINK_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.LINK_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.LINK_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.LINK_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.LINK_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.LINK_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.LINK_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.LINK_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.LINK_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.LINK_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.LINK_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.LINK_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.LINK_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.LINK_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.LINK_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.LINK_ACTION__END_DATA :
-				return !getEndData().isEmpty();
-			case UMLPackage.LINK_ACTION__INPUT_VALUE :
-				return !getInputValues().isEmpty();
+		case UMLPackage.LINK_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.LINK_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.LINK_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.LINK_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.LINK_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.LINK_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.LINK_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.LINK_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.LINK_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.LINK_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.LINK_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.LINK_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.LINK_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.LINK_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.LINK_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.LINK_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.LINK_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.LINK_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.LINK_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.LINK_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.LINK_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.LINK_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.LINK_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.LINK_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.LINK_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.LINK_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.LINK_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.LINK_ACTION__END_DATA:
+			return !getEndData().isEmpty();
+		case UMLPackage.LINK_ACTION__INPUT_VALUE:
+			return !getInputValues().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -689,164 +637,138 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.LINK_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.LINK_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.LINK_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.LINK_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.LINK_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.LINK_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.LINK_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.LINK_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.LINK_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.LINK_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LINK_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.LINK_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.LINK_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.LINK_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.LINK_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.LINK_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LINK_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LINK_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LINK_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.LINK_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LINK_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.LINK_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.LINK_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.LINK_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.LINK_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.LINK_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.LINK_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.LINK_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.LINK_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.LINK_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.LINK_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.LINK_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.LINK_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LINK_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.LINK_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.LINK_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.LINK_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.LINK_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.LINK_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.LINK_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.LINK_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.LINK_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.LINK_ACTION___VALIDATE_SAME_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateSamePins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_ACTION___VALIDATE_SAME_ASSOCIATION__DIAGNOSTICCHAIN_MAP :
-				return validateSameAssociation(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP :
-				return validateNotStatic((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_ACTION___ASSOCIATION :
-				return association();
+		case UMLPackage.LINK_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.LINK_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.LINK_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.LINK_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.LINK_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.LINK_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.LINK_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.LINK_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.LINK_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.LINK_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LINK_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.LINK_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.LINK_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.LINK_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.LINK_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.LINK_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LINK_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LINK_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LINK_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.LINK_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LINK_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.LINK_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.LINK_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.LINK_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.LINK_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.LINK_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.LINK_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.LINK_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.LINK_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.LINK_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.LINK_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.LINK_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.LINK_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LINK_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.LINK_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.LINK_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.LINK_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.LINK_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.LINK_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.LINK_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.LINK_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.LINK_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.LINK_ACTION___VALIDATE_SAME_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateSamePins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_ACTION___VALIDATE_SAME_ASSOCIATION__DIAGNOSTICCHAIN_MAP:
+			return validateSameAssociation((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP:
+			return validateNotStatic((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_ACTION___ASSOCIATION:
+			return association();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -859,7 +781,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.LINK_ACTION__END_DATA);
+				|| eIsSet(UMLPackage.LINK_ACTION__END_DATA);
 	}
 
 	/**
@@ -870,8 +792,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.LINK_ACTION__INPUT_VALUE};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.LINK_ACTION__INPUT_VALUE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -881,7 +802,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.LINK_ACTION__INPUT_VALUE);
+				|| eIsSet(UMLPackage.LINK_ACTION__INPUT_VALUE);
 	}
 
 } //LinkActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkEndCreationDataImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkEndCreationDataImpl.java
index 452584e..83cd36c 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkEndCreationDataImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkEndCreationDataImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,11 +17,17 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.InputPin;
@@ -86,11 +92,7 @@
 	 * @generated
 	 */
 	public boolean isReplaceAll() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.LINK_END_CREATION_DATA__IS_REPLACE_ALL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_CREATION_DATA__IS_REPLACE_ALL, true,
-			true);
+		return (Boolean) eDynamicGet(UMLPackage.LINK_END_CREATION_DATA__IS_REPLACE_ALL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_CREATION_DATA__IS_REPLACE_ALL, true, true);
 	}
 
 	/**
@@ -99,11 +101,7 @@
 	 * @generated
 	 */
 	public void setIsReplaceAll(boolean newIsReplaceAll) {
-		eDynamicSet(
-			UMLPackage.LINK_END_CREATION_DATA__IS_REPLACE_ALL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_CREATION_DATA__IS_REPLACE_ALL,
-			newIsReplaceAll);
+		eDynamicSet(UMLPackage.LINK_END_CREATION_DATA__IS_REPLACE_ALL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_CREATION_DATA__IS_REPLACE_ALL, newIsReplaceAll);
 	}
 
 	/**
@@ -113,8 +111,7 @@
 	 */
 	public boolean validateInsertAtPin(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LinkEndCreationDataOperations.validateInsertAtPin(this,
-			diagnostics, context);
+		return LinkEndCreationDataOperations.validateInsertAtPin(this, diagnostics, context);
 	}
 
 	/**
@@ -127,11 +124,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<InputPin> result = (EList<InputPin>) cache.get(this,
-				UMLPackage.Literals.LINK_END_DATA___ALL_PINS);
+			EList<InputPin> result = (EList<InputPin>) cache.get(this, UMLPackage.Literals.LINK_END_DATA___ALL_PINS);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.LINK_END_DATA___ALL_PINS,
-					result = LinkEndCreationDataOperations.allPins(this));
+				cache.put(this, UMLPackage.Literals.LINK_END_DATA___ALL_PINS, result = LinkEndCreationDataOperations.allPins(this));
 			}
 			return result;
 		}
@@ -144,10 +139,7 @@
 	 * @generated
 	 */
 	public InputPin getInsertAt() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.LINK_END_CREATION_DATA__INSERT_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_CREATION_DATA__INSERT_AT, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.LINK_END_CREATION_DATA__INSERT_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_CREATION_DATA__INSERT_AT, true, true);
 	}
 
 	/**
@@ -156,10 +148,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetInsertAt() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.LINK_END_CREATION_DATA__INSERT_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_CREATION_DATA__INSERT_AT, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.LINK_END_CREATION_DATA__INSERT_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_CREATION_DATA__INSERT_AT, false, true);
 	}
 
 	/**
@@ -168,10 +157,7 @@
 	 * @generated
 	 */
 	public void setInsertAt(InputPin newInsertAt) {
-		eDynamicSet(
-			UMLPackage.LINK_END_CREATION_DATA__INSERT_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_CREATION_DATA__INSERT_AT, newInsertAt);
+		eDynamicSet(UMLPackage.LINK_END_CREATION_DATA__INSERT_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_CREATION_DATA__INSERT_AT, newInsertAt);
 	}
 
 	/**
@@ -182,32 +168,32 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.LINK_END_CREATION_DATA__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.LINK_END_CREATION_DATA__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.LINK_END_CREATION_DATA__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.LINK_END_CREATION_DATA__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.LINK_END_CREATION_DATA__END :
-				if (resolve)
-					return getEnd();
-				return basicGetEnd();
-			case UMLPackage.LINK_END_CREATION_DATA__QUALIFIER :
-				return getQualifiers();
-			case UMLPackage.LINK_END_CREATION_DATA__VALUE :
-				if (resolve)
-					return getValue();
-				return basicGetValue();
-			case UMLPackage.LINK_END_CREATION_DATA__INSERT_AT :
-				if (resolve)
-					return getInsertAt();
-				return basicGetInsertAt();
-			case UMLPackage.LINK_END_CREATION_DATA__IS_REPLACE_ALL :
-				return isReplaceAll();
+		case UMLPackage.LINK_END_CREATION_DATA__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.LINK_END_CREATION_DATA__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.LINK_END_CREATION_DATA__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.LINK_END_CREATION_DATA__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.LINK_END_CREATION_DATA__END:
+			if (resolve)
+				return getEnd();
+			return basicGetEnd();
+		case UMLPackage.LINK_END_CREATION_DATA__QUALIFIER:
+			return getQualifiers();
+		case UMLPackage.LINK_END_CREATION_DATA__VALUE:
+			if (resolve)
+				return getValue();
+			return basicGetValue();
+		case UMLPackage.LINK_END_CREATION_DATA__INSERT_AT:
+			if (resolve)
+				return getInsertAt();
+			return basicGetInsertAt();
+		case UMLPackage.LINK_END_CREATION_DATA__IS_REPLACE_ALL:
+			return isReplaceAll();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -221,33 +207,30 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.LINK_END_CREATION_DATA__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.LINK_END_CREATION_DATA__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.LINK_END_CREATION_DATA__END :
-				setEnd((Property) newValue);
-				return;
-			case UMLPackage.LINK_END_CREATION_DATA__QUALIFIER :
-				getQualifiers().clear();
-				getQualifiers()
-					.addAll((Collection<? extends QualifierValue>) newValue);
-				return;
-			case UMLPackage.LINK_END_CREATION_DATA__VALUE :
-				setValue((InputPin) newValue);
-				return;
-			case UMLPackage.LINK_END_CREATION_DATA__INSERT_AT :
-				setInsertAt((InputPin) newValue);
-				return;
-			case UMLPackage.LINK_END_CREATION_DATA__IS_REPLACE_ALL :
-				setIsReplaceAll((Boolean) newValue);
-				return;
+		case UMLPackage.LINK_END_CREATION_DATA__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.LINK_END_CREATION_DATA__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.LINK_END_CREATION_DATA__END:
+			setEnd((Property) newValue);
+			return;
+		case UMLPackage.LINK_END_CREATION_DATA__QUALIFIER:
+			getQualifiers().clear();
+			getQualifiers().addAll((Collection<? extends QualifierValue>) newValue);
+			return;
+		case UMLPackage.LINK_END_CREATION_DATA__VALUE:
+			setValue((InputPin) newValue);
+			return;
+		case UMLPackage.LINK_END_CREATION_DATA__INSERT_AT:
+			setInsertAt((InputPin) newValue);
+			return;
+		case UMLPackage.LINK_END_CREATION_DATA__IS_REPLACE_ALL:
+			setIsReplaceAll((Boolean) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -260,27 +243,27 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LINK_END_CREATION_DATA__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.LINK_END_CREATION_DATA__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.LINK_END_CREATION_DATA__END :
-				setEnd((Property) null);
-				return;
-			case UMLPackage.LINK_END_CREATION_DATA__QUALIFIER :
-				getQualifiers().clear();
-				return;
-			case UMLPackage.LINK_END_CREATION_DATA__VALUE :
-				setValue((InputPin) null);
-				return;
-			case UMLPackage.LINK_END_CREATION_DATA__INSERT_AT :
-				setInsertAt((InputPin) null);
-				return;
-			case UMLPackage.LINK_END_CREATION_DATA__IS_REPLACE_ALL :
-				setIsReplaceAll(IS_REPLACE_ALL_EDEFAULT);
-				return;
+		case UMLPackage.LINK_END_CREATION_DATA__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.LINK_END_CREATION_DATA__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.LINK_END_CREATION_DATA__END:
+			setEnd((Property) null);
+			return;
+		case UMLPackage.LINK_END_CREATION_DATA__QUALIFIER:
+			getQualifiers().clear();
+			return;
+		case UMLPackage.LINK_END_CREATION_DATA__VALUE:
+			setValue((InputPin) null);
+			return;
+		case UMLPackage.LINK_END_CREATION_DATA__INSERT_AT:
+			setInsertAt((InputPin) null);
+			return;
+		case UMLPackage.LINK_END_CREATION_DATA__IS_REPLACE_ALL:
+			setIsReplaceAll(IS_REPLACE_ALL_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -293,24 +276,24 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LINK_END_CREATION_DATA__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.LINK_END_CREATION_DATA__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.LINK_END_CREATION_DATA__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.LINK_END_CREATION_DATA__OWNER :
-				return isSetOwner();
-			case UMLPackage.LINK_END_CREATION_DATA__END :
-				return basicGetEnd() != null;
-			case UMLPackage.LINK_END_CREATION_DATA__QUALIFIER :
-				return !getQualifiers().isEmpty();
-			case UMLPackage.LINK_END_CREATION_DATA__VALUE :
-				return basicGetValue() != null;
-			case UMLPackage.LINK_END_CREATION_DATA__INSERT_AT :
-				return basicGetInsertAt() != null;
-			case UMLPackage.LINK_END_CREATION_DATA__IS_REPLACE_ALL :
-				return isReplaceAll() != IS_REPLACE_ALL_EDEFAULT;
+		case UMLPackage.LINK_END_CREATION_DATA__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.LINK_END_CREATION_DATA__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.LINK_END_CREATION_DATA__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.LINK_END_CREATION_DATA__OWNER:
+			return isSetOwner();
+		case UMLPackage.LINK_END_CREATION_DATA__END:
+			return basicGetEnd() != null;
+		case UMLPackage.LINK_END_CREATION_DATA__QUALIFIER:
+			return !getQualifiers().isEmpty();
+		case UMLPackage.LINK_END_CREATION_DATA__VALUE:
+			return basicGetValue() != null;
+		case UMLPackage.LINK_END_CREATION_DATA__INSERT_AT:
+			return basicGetInsertAt() != null;
+		case UMLPackage.LINK_END_CREATION_DATA__IS_REPLACE_ALL:
+			return isReplaceAll() != IS_REPLACE_ALL_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -325,112 +308,96 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.LINK_END_CREATION_DATA___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_CREATION_DATA___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.LINK_END_CREATION_DATA___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.LINK_END_CREATION_DATA___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.LINK_END_CREATION_DATA___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.LINK_END_CREATION_DATA___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LINK_END_CREATION_DATA___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___GET_MODEL :
-				return getModel();
-			case UMLPackage.LINK_END_CREATION_DATA___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.LINK_END_CREATION_DATA___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.LINK_END_CREATION_DATA___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.LINK_END_CREATION_DATA___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.LINK_END_CREATION_DATA___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.LINK_END_CREATION_DATA___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.LINK_END_CREATION_DATA___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LINK_END_CREATION_DATA___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LINK_END_CREATION_DATA___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.LINK_END_CREATION_DATA___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_CREATION_DATA___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.LINK_END_CREATION_DATA___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_SAME_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSameType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_END_OBJECT_INPUT_PIN__DIAGNOSTICCHAIN_MAP :
-				return validateEndObjectInputPin(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_PROPERTY_IS_ASSOCIATION_END__DIAGNOSTICCHAIN_MAP :
-				return validatePropertyIsAssociationEnd(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_QUALIFIERS__DIAGNOSTICCHAIN_MAP :
-				return validateQualifiers((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_CREATION_DATA___ALL_PINS :
-				return allPins();
-			case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_INSERT_AT_PIN__DIAGNOSTICCHAIN_MAP :
-				return validateInsertAtPin((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_CREATION_DATA___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_CREATION_DATA___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.LINK_END_CREATION_DATA___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.LINK_END_CREATION_DATA___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.LINK_END_CREATION_DATA___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.LINK_END_CREATION_DATA___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LINK_END_CREATION_DATA___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___GET_MODEL:
+			return getModel();
+		case UMLPackage.LINK_END_CREATION_DATA___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.LINK_END_CREATION_DATA___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.LINK_END_CREATION_DATA___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.LINK_END_CREATION_DATA___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.LINK_END_CREATION_DATA___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.LINK_END_CREATION_DATA___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.LINK_END_CREATION_DATA___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LINK_END_CREATION_DATA___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LINK_END_CREATION_DATA___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.LINK_END_CREATION_DATA___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_CREATION_DATA___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.LINK_END_CREATION_DATA___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_SAME_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSameType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_END_OBJECT_INPUT_PIN__DIAGNOSTICCHAIN_MAP:
+			return validateEndObjectInputPin((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_PROPERTY_IS_ASSOCIATION_END__DIAGNOSTICCHAIN_MAP:
+			return validatePropertyIsAssociationEnd((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_QUALIFIERS__DIAGNOSTICCHAIN_MAP:
+			return validateQualifiers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_CREATION_DATA___ALL_PINS:
+			return allPins();
+		case UMLPackage.LINK_END_CREATION_DATA___VALIDATE_INSERT_AT_PIN__DIAGNOSTICCHAIN_MAP:
+			return validateInsertAtPin((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkEndDataImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkEndDataImpl.java
index 56276cb..1309a4e 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkEndDataImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkEndDataImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,7 +28,10 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -93,20 +97,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.LINK_END_DATA__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.LINK_END_DATA__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.LINK_END_DATA__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.LINK_END_DATA__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -117,9 +114,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.LINK_END_DATA__OWNED_COMMENT,
-		UMLPackage.LINK_END_DATA__QUALIFIER};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.LINK_END_DATA__OWNED_COMMENT, UMLPackage.LINK_END_DATA__QUALIFIER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -127,9 +122,7 @@
 	 * @generated
 	 */
 	public InputPin getValue() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.LINK_END_DATA__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_DATA__VALUE, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.LINK_END_DATA__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_DATA__VALUE, true, true);
 	}
 
 	/**
@@ -138,9 +131,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetValue() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.LINK_END_DATA__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_DATA__VALUE, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.LINK_END_DATA__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_DATA__VALUE, false, true);
 	}
 
 	/**
@@ -149,8 +140,7 @@
 	 * @generated
 	 */
 	public void setValue(InputPin newValue) {
-		eDynamicSet(UMLPackage.LINK_END_DATA__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_DATA__VALUE, newValue);
+		eDynamicSet(UMLPackage.LINK_END_DATA__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_DATA__VALUE, newValue);
 	}
 
 	/**
@@ -159,9 +149,7 @@
 	 * @generated
 	 */
 	public Property getEnd() {
-		return (Property) eDynamicGet(
-			UMLPackage.LINK_END_DATA__END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_DATA__END, true, true);
+		return (Property) eDynamicGet(UMLPackage.LINK_END_DATA__END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_DATA__END, true, true);
 	}
 
 	/**
@@ -170,9 +158,7 @@
 	 * @generated
 	 */
 	public Property basicGetEnd() {
-		return (Property) eDynamicGet(
-			UMLPackage.LINK_END_DATA__END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_DATA__END, false, true);
+		return (Property) eDynamicGet(UMLPackage.LINK_END_DATA__END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_DATA__END, false, true);
 	}
 
 	/**
@@ -181,8 +167,7 @@
 	 * @generated
 	 */
 	public void setEnd(Property newEnd) {
-		eDynamicSet(UMLPackage.LINK_END_DATA__END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_DATA__END, newEnd);
+		eDynamicSet(UMLPackage.LINK_END_DATA__END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_DATA__END, newEnd);
 	}
 
 	/**
@@ -192,9 +177,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<QualifierValue> getQualifiers() {
-		return (EList<QualifierValue>) eDynamicGet(
-			UMLPackage.LINK_END_DATA__QUALIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_DATA__QUALIFIER, true, true);
+		return (EList<QualifierValue>) eDynamicGet(UMLPackage.LINK_END_DATA__QUALIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_DATA__QUALIFIER, true, true);
 	}
 
 	/**
@@ -203,8 +186,7 @@
 	 * @generated
 	 */
 	public QualifierValue createQualifier() {
-		QualifierValue newQualifier = (QualifierValue) create(
-			UMLPackage.Literals.QUALIFIER_VALUE);
+		QualifierValue newQualifier = (QualifierValue) create(UMLPackage.Literals.QUALIFIER_VALUE);
 		getQualifiers().add(newQualifier);
 		return newQualifier;
 	}
@@ -216,8 +198,7 @@
 	 */
 	public boolean validatePropertyIsAssociationEnd(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LinkEndDataOperations.validatePropertyIsAssociationEnd(this,
-			diagnostics, context);
+		return LinkEndDataOperations.validatePropertyIsAssociationEnd(this, diagnostics, context);
 	}
 
 	/**
@@ -227,8 +208,7 @@
 	 */
 	public boolean validateSameType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LinkEndDataOperations.validateSameType(this, diagnostics,
-			context);
+		return LinkEndDataOperations.validateSameType(this, diagnostics, context);
 	}
 
 	/**
@@ -238,8 +218,7 @@
 	 */
 	public boolean validateMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LinkEndDataOperations.validateMultiplicity(this, diagnostics,
-			context);
+		return LinkEndDataOperations.validateMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -249,8 +228,7 @@
 	 */
 	public boolean validateQualifiers(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LinkEndDataOperations.validateQualifiers(this, diagnostics,
-			context);
+		return LinkEndDataOperations.validateQualifiers(this, diagnostics, context);
 	}
 
 	/**
@@ -262,11 +240,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<InputPin> result = (EList<InputPin>) cache.get(this,
-				UMLPackage.Literals.LINK_END_DATA___ALL_PINS);
+			EList<InputPin> result = (EList<InputPin>) cache.get(this, UMLPackage.Literals.LINK_END_DATA___ALL_PINS);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.LINK_END_DATA___ALL_PINS,
-					result = LinkEndDataOperations.allPins(this));
+				cache.put(this, UMLPackage.Literals.LINK_END_DATA___ALL_PINS, result = LinkEndDataOperations.allPins(this));
 			}
 			return result;
 		}
@@ -280,8 +256,7 @@
 	 */
 	public boolean validateEndObjectInputPin(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LinkEndDataOperations.validateEndObjectInputPin(this,
-			diagnostics, context);
+		return LinkEndDataOperations.validateEndObjectInputPin(this, diagnostics, context);
 	}
 
 	/**
@@ -293,15 +268,12 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.LINK_END_DATA__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LINK_END_DATA__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LINK_END_DATA__QUALIFIER :
-				return ((InternalEList<?>) getQualifiers())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.LINK_END_DATA__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LINK_END_DATA__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LINK_END_DATA__QUALIFIER:
+			return ((InternalEList<?>) getQualifiers()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -314,26 +286,26 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.LINK_END_DATA__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.LINK_END_DATA__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.LINK_END_DATA__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.LINK_END_DATA__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.LINK_END_DATA__END :
-				if (resolve)
-					return getEnd();
-				return basicGetEnd();
-			case UMLPackage.LINK_END_DATA__QUALIFIER :
-				return getQualifiers();
-			case UMLPackage.LINK_END_DATA__VALUE :
-				if (resolve)
-					return getValue();
-				return basicGetValue();
+		case UMLPackage.LINK_END_DATA__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.LINK_END_DATA__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.LINK_END_DATA__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.LINK_END_DATA__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.LINK_END_DATA__END:
+			if (resolve)
+				return getEnd();
+			return basicGetEnd();
+		case UMLPackage.LINK_END_DATA__QUALIFIER:
+			return getQualifiers();
+		case UMLPackage.LINK_END_DATA__VALUE:
+			if (resolve)
+				return getValue();
+			return basicGetValue();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -347,27 +319,24 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.LINK_END_DATA__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.LINK_END_DATA__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.LINK_END_DATA__END :
-				setEnd((Property) newValue);
-				return;
-			case UMLPackage.LINK_END_DATA__QUALIFIER :
-				getQualifiers().clear();
-				getQualifiers()
-					.addAll((Collection<? extends QualifierValue>) newValue);
-				return;
-			case UMLPackage.LINK_END_DATA__VALUE :
-				setValue((InputPin) newValue);
-				return;
+		case UMLPackage.LINK_END_DATA__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.LINK_END_DATA__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.LINK_END_DATA__END:
+			setEnd((Property) newValue);
+			return;
+		case UMLPackage.LINK_END_DATA__QUALIFIER:
+			getQualifiers().clear();
+			getQualifiers().addAll((Collection<? extends QualifierValue>) newValue);
+			return;
+		case UMLPackage.LINK_END_DATA__VALUE:
+			setValue((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -380,21 +349,21 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LINK_END_DATA__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.LINK_END_DATA__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.LINK_END_DATA__END :
-				setEnd((Property) null);
-				return;
-			case UMLPackage.LINK_END_DATA__QUALIFIER :
-				getQualifiers().clear();
-				return;
-			case UMLPackage.LINK_END_DATA__VALUE :
-				setValue((InputPin) null);
-				return;
+		case UMLPackage.LINK_END_DATA__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.LINK_END_DATA__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.LINK_END_DATA__END:
+			setEnd((Property) null);
+			return;
+		case UMLPackage.LINK_END_DATA__QUALIFIER:
+			getQualifiers().clear();
+			return;
+		case UMLPackage.LINK_END_DATA__VALUE:
+			setValue((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -407,20 +376,20 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LINK_END_DATA__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.LINK_END_DATA__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.LINK_END_DATA__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.LINK_END_DATA__OWNER :
-				return isSetOwner();
-			case UMLPackage.LINK_END_DATA__END :
-				return basicGetEnd() != null;
-			case UMLPackage.LINK_END_DATA__QUALIFIER :
-				return !getQualifiers().isEmpty();
-			case UMLPackage.LINK_END_DATA__VALUE :
-				return basicGetValue() != null;
+		case UMLPackage.LINK_END_DATA__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.LINK_END_DATA__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.LINK_END_DATA__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.LINK_END_DATA__OWNER:
+			return isSetOwner();
+		case UMLPackage.LINK_END_DATA__END:
+			return basicGetEnd() != null;
+		case UMLPackage.LINK_END_DATA__QUALIFIER:
+			return !getQualifiers().isEmpty();
+		case UMLPackage.LINK_END_DATA__VALUE:
+			return basicGetValue() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -435,109 +404,94 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.LINK_END_DATA___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_DATA___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_DATA___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.LINK_END_DATA___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.LINK_END_DATA___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.LINK_END_DATA___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.LINK_END_DATA___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LINK_END_DATA___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___GET_MODEL :
-				return getModel();
-			case UMLPackage.LINK_END_DATA___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.LINK_END_DATA___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.LINK_END_DATA___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.LINK_END_DATA___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.LINK_END_DATA___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.LINK_END_DATA___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.LINK_END_DATA___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LINK_END_DATA___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LINK_END_DATA___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.LINK_END_DATA___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_DATA___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.LINK_END_DATA___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.LINK_END_DATA___VALIDATE_SAME_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSameType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_DATA___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_DATA___VALIDATE_END_OBJECT_INPUT_PIN__DIAGNOSTICCHAIN_MAP :
-				return validateEndObjectInputPin(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_DATA___VALIDATE_PROPERTY_IS_ASSOCIATION_END__DIAGNOSTICCHAIN_MAP :
-				return validatePropertyIsAssociationEnd(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_DATA___VALIDATE_QUALIFIERS__DIAGNOSTICCHAIN_MAP :
-				return validateQualifiers((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_DATA___ALL_PINS :
-				return allPins();
+		case UMLPackage.LINK_END_DATA___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_DATA___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_DATA___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.LINK_END_DATA___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.LINK_END_DATA___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.LINK_END_DATA___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.LINK_END_DATA___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LINK_END_DATA___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___GET_MODEL:
+			return getModel();
+		case UMLPackage.LINK_END_DATA___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.LINK_END_DATA___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.LINK_END_DATA___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.LINK_END_DATA___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.LINK_END_DATA___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.LINK_END_DATA___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.LINK_END_DATA___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LINK_END_DATA___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LINK_END_DATA___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.LINK_END_DATA___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_DATA___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.LINK_END_DATA___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.LINK_END_DATA___VALIDATE_SAME_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSameType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_DATA___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_DATA___VALIDATE_END_OBJECT_INPUT_PIN__DIAGNOSTICCHAIN_MAP:
+			return validateEndObjectInputPin((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_DATA___VALIDATE_PROPERTY_IS_ASSOCIATION_END__DIAGNOSTICCHAIN_MAP:
+			return validatePropertyIsAssociationEnd((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_DATA___VALIDATE_QUALIFIERS__DIAGNOSTICCHAIN_MAP:
+			return validateQualifiers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_DATA___ALL_PINS:
+			return allPins();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -550,7 +504,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.LINK_END_DATA__QUALIFIER);
+				|| eIsSet(UMLPackage.LINK_END_DATA__QUALIFIER);
 	}
 
 } //LinkEndDataImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkEndDestructionDataImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkEndDestructionDataImpl.java
index 19e1eb0..2b0b094 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkEndDestructionDataImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LinkEndDestructionDataImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,11 +17,17 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.InputPin;
@@ -86,11 +92,7 @@
 	 * @generated
 	 */
 	public boolean isDestroyDuplicates() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES,
-			true, true);
+		return (Boolean) eDynamicGet(UMLPackage.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES, true, true);
 	}
 
 	/**
@@ -99,11 +101,7 @@
 	 * @generated
 	 */
 	public void setIsDestroyDuplicates(boolean newIsDestroyDuplicates) {
-		eDynamicSet(
-			UMLPackage.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES,
-			newIsDestroyDuplicates);
+		eDynamicSet(UMLPackage.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES, newIsDestroyDuplicates);
 	}
 
 	/**
@@ -113,8 +111,7 @@
 	 */
 	public boolean validateDestroyAtPin(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LinkEndDestructionDataOperations.validateDestroyAtPin(this,
-			diagnostics, context);
+		return LinkEndDestructionDataOperations.validateDestroyAtPin(this, diagnostics, context);
 	}
 
 	/**
@@ -127,11 +124,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<InputPin> result = (EList<InputPin>) cache.get(this,
-				UMLPackage.Literals.LINK_END_DATA___ALL_PINS);
+			EList<InputPin> result = (EList<InputPin>) cache.get(this, UMLPackage.Literals.LINK_END_DATA___ALL_PINS);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.LINK_END_DATA___ALL_PINS,
-					result = LinkEndDestructionDataOperations.allPins(this));
+				cache.put(this, UMLPackage.Literals.LINK_END_DATA___ALL_PINS, result = LinkEndDestructionDataOperations.allPins(this));
 			}
 			return result;
 		}
@@ -144,11 +139,7 @@
 	 * @generated
 	 */
 	public InputPin getDestroyAt() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.LINK_END_DESTRUCTION_DATA__DESTROY_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_DESTRUCTION_DATA__DESTROY_AT, true,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.LINK_END_DESTRUCTION_DATA__DESTROY_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_DESTRUCTION_DATA__DESTROY_AT, true, true);
 	}
 
 	/**
@@ -157,11 +148,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetDestroyAt() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.LINK_END_DESTRUCTION_DATA__DESTROY_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_DESTRUCTION_DATA__DESTROY_AT, false,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.LINK_END_DESTRUCTION_DATA__DESTROY_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_DESTRUCTION_DATA__DESTROY_AT, false, true);
 	}
 
 	/**
@@ -170,11 +157,7 @@
 	 * @generated
 	 */
 	public void setDestroyAt(InputPin newDestroyAt) {
-		eDynamicSet(
-			UMLPackage.LINK_END_DESTRUCTION_DATA__DESTROY_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LINK_END_DESTRUCTION_DATA__DESTROY_AT,
-			newDestroyAt);
+		eDynamicSet(UMLPackage.LINK_END_DESTRUCTION_DATA__DESTROY_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LINK_END_DESTRUCTION_DATA__DESTROY_AT, newDestroyAt);
 	}
 
 	/**
@@ -185,32 +168,32 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__END :
-				if (resolve)
-					return getEnd();
-				return basicGetEnd();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__QUALIFIER :
-				return getQualifiers();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__VALUE :
-				if (resolve)
-					return getValue();
-				return basicGetValue();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__DESTROY_AT :
-				if (resolve)
-					return getDestroyAt();
-				return basicGetDestroyAt();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES :
-				return isDestroyDuplicates();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__END:
+			if (resolve)
+				return getEnd();
+			return basicGetEnd();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__QUALIFIER:
+			return getQualifiers();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__VALUE:
+			if (resolve)
+				return getValue();
+			return basicGetValue();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__DESTROY_AT:
+			if (resolve)
+				return getDestroyAt();
+			return basicGetDestroyAt();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES:
+			return isDestroyDuplicates();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -224,33 +207,30 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__END :
-				setEnd((Property) newValue);
-				return;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__QUALIFIER :
-				getQualifiers().clear();
-				getQualifiers()
-					.addAll((Collection<? extends QualifierValue>) newValue);
-				return;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__VALUE :
-				setValue((InputPin) newValue);
-				return;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__DESTROY_AT :
-				setDestroyAt((InputPin) newValue);
-				return;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES :
-				setIsDestroyDuplicates((Boolean) newValue);
-				return;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__END:
+			setEnd((Property) newValue);
+			return;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__QUALIFIER:
+			getQualifiers().clear();
+			getQualifiers().addAll((Collection<? extends QualifierValue>) newValue);
+			return;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__VALUE:
+			setValue((InputPin) newValue);
+			return;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__DESTROY_AT:
+			setDestroyAt((InputPin) newValue);
+			return;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES:
+			setIsDestroyDuplicates((Boolean) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -263,27 +243,27 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__END :
-				setEnd((Property) null);
-				return;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__QUALIFIER :
-				getQualifiers().clear();
-				return;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__VALUE :
-				setValue((InputPin) null);
-				return;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__DESTROY_AT :
-				setDestroyAt((InputPin) null);
-				return;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES :
-				setIsDestroyDuplicates(IS_DESTROY_DUPLICATES_EDEFAULT);
-				return;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__END:
+			setEnd((Property) null);
+			return;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__QUALIFIER:
+			getQualifiers().clear();
+			return;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__VALUE:
+			setValue((InputPin) null);
+			return;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__DESTROY_AT:
+			setDestroyAt((InputPin) null);
+			return;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES:
+			setIsDestroyDuplicates(IS_DESTROY_DUPLICATES_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -296,24 +276,24 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNER :
-				return isSetOwner();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__END :
-				return basicGetEnd() != null;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__QUALIFIER :
-				return !getQualifiers().isEmpty();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__VALUE :
-				return basicGetValue() != null;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__DESTROY_AT :
-				return basicGetDestroyAt() != null;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES :
-				return isDestroyDuplicates() != IS_DESTROY_DUPLICATES_EDEFAULT;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__OWNER:
+			return isSetOwner();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__END:
+			return basicGetEnd() != null;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__QUALIFIER:
+			return !getQualifiers().isEmpty();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__VALUE:
+			return basicGetValue() != null;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__DESTROY_AT:
+			return basicGetDestroyAt() != null;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA__IS_DESTROY_DUPLICATES:
+			return isDestroyDuplicates() != IS_DESTROY_DUPLICATES_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -328,112 +308,96 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_MODEL :
-				return getModel();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_SAME_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSameType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_END_OBJECT_INPUT_PIN__DIAGNOSTICCHAIN_MAP :
-				return validateEndObjectInputPin(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_PROPERTY_IS_ASSOCIATION_END__DIAGNOSTICCHAIN_MAP :
-				return validatePropertyIsAssociationEnd(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_QUALIFIERS__DIAGNOSTICCHAIN_MAP :
-				return validateQualifiers((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___ALL_PINS :
-				return allPins();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_DESTROY_AT_PIN__DIAGNOSTICCHAIN_MAP :
-				return validateDestroyAtPin((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_MODEL:
+			return getModel();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_SAME_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSameType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_END_OBJECT_INPUT_PIN__DIAGNOSTICCHAIN_MAP:
+			return validateEndObjectInputPin((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_PROPERTY_IS_ASSOCIATION_END__DIAGNOSTICCHAIN_MAP:
+			return validatePropertyIsAssociationEnd((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_QUALIFIERS__DIAGNOSTICCHAIN_MAP:
+			return validateQualifiers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___ALL_PINS:
+			return allPins();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA___VALIDATE_DESTROY_AT_PIN__DIAGNOSTICCHAIN_MAP:
+			return validateDestroyAtPin((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralBooleanImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralBooleanImpl.java
index e664662..9e4b1bf 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralBooleanImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralBooleanImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,10 +17,14 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
+
 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.impl.ENotificationImpl;
+
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.LiteralBoolean;
 import org.eclipse.uml2.uml.NamedElement;
@@ -87,9 +91,7 @@
 	 * @generated
 	 */
 	public boolean isValue() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.LITERAL_BOOLEAN__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LITERAL_BOOLEAN__VALUE, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.LITERAL_BOOLEAN__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LITERAL_BOOLEAN__VALUE, true, true);
 	}
 
 	/**
@@ -98,8 +100,7 @@
 	 * @generated
 	 */
 	public void setValue(boolean newValue) {
-		eDynamicSet(UMLPackage.LITERAL_BOOLEAN__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LITERAL_BOOLEAN__VALUE, newValue);
+		eDynamicSet(UMLPackage.LITERAL_BOOLEAN__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LITERAL_BOOLEAN__VALUE, newValue);
 	}
 
 	/**
@@ -140,46 +141,46 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_BOOLEAN__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.LITERAL_BOOLEAN__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.LITERAL_BOOLEAN__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.LITERAL_BOOLEAN__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.LITERAL_BOOLEAN__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.LITERAL_BOOLEAN__NAME :
-				return getName();
-			case UMLPackage.LITERAL_BOOLEAN__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.LITERAL_BOOLEAN__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.LITERAL_BOOLEAN__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LITERAL_BOOLEAN__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.LITERAL_BOOLEAN__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.LITERAL_BOOLEAN__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.LITERAL_BOOLEAN__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.LITERAL_BOOLEAN__VALUE :
-				return isValue();
+		case UMLPackage.LITERAL_BOOLEAN__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.LITERAL_BOOLEAN__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.LITERAL_BOOLEAN__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.LITERAL_BOOLEAN__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.LITERAL_BOOLEAN__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.LITERAL_BOOLEAN__NAME:
+			return getName();
+		case UMLPackage.LITERAL_BOOLEAN__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.LITERAL_BOOLEAN__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.LITERAL_BOOLEAN__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LITERAL_BOOLEAN__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.LITERAL_BOOLEAN__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.LITERAL_BOOLEAN__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.LITERAL_BOOLEAN__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.LITERAL_BOOLEAN__VALUE:
+			return isValue();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -193,37 +194,35 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_BOOLEAN__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__VALUE :
-				setValue((Boolean) newValue);
-				return;
+		case UMLPackage.LITERAL_BOOLEAN__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__VALUE:
+			setValue((Boolean) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -236,33 +235,33 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_BOOLEAN__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__NAME :
-				unsetName();
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.LITERAL_BOOLEAN__VALUE :
-				setValue(VALUE_EDEFAULT);
-				return;
+		case UMLPackage.LITERAL_BOOLEAN__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__NAME:
+			unsetName();
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.LITERAL_BOOLEAN__VALUE:
+			setValue(VALUE_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -275,36 +274,34 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_BOOLEAN__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.LITERAL_BOOLEAN__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.LITERAL_BOOLEAN__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.LITERAL_BOOLEAN__OWNER :
-				return isSetOwner();
-			case UMLPackage.LITERAL_BOOLEAN__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.LITERAL_BOOLEAN__NAME :
-				return isSetName();
-			case UMLPackage.LITERAL_BOOLEAN__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.LITERAL_BOOLEAN__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.LITERAL_BOOLEAN__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.LITERAL_BOOLEAN__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.LITERAL_BOOLEAN__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.LITERAL_BOOLEAN__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.LITERAL_BOOLEAN__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.LITERAL_BOOLEAN__VALUE :
-				return isValue() != VALUE_EDEFAULT;
+		case UMLPackage.LITERAL_BOOLEAN__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.LITERAL_BOOLEAN__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.LITERAL_BOOLEAN__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.LITERAL_BOOLEAN__OWNER:
+			return isSetOwner();
+		case UMLPackage.LITERAL_BOOLEAN__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.LITERAL_BOOLEAN__NAME:
+			return isSetName();
+		case UMLPackage.LITERAL_BOOLEAN__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.LITERAL_BOOLEAN__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.LITERAL_BOOLEAN__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.LITERAL_BOOLEAN__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.LITERAL_BOOLEAN__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.LITERAL_BOOLEAN__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.LITERAL_BOOLEAN__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.LITERAL_BOOLEAN__VALUE:
+			return isValue() != VALUE_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -319,148 +316,130 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.LITERAL_BOOLEAN___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_BOOLEAN___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_BOOLEAN___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.LITERAL_BOOLEAN___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.LITERAL_BOOLEAN___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.LITERAL_BOOLEAN___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.LITERAL_BOOLEAN___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_BOOLEAN___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___GET_MODEL :
-				return getModel();
-			case UMLPackage.LITERAL_BOOLEAN___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.LITERAL_BOOLEAN___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.LITERAL_BOOLEAN___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.LITERAL_BOOLEAN___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.LITERAL_BOOLEAN___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.LITERAL_BOOLEAN___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.LITERAL_BOOLEAN___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_BOOLEAN___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_BOOLEAN___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.LITERAL_BOOLEAN___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.LITERAL_BOOLEAN___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.LITERAL_BOOLEAN___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_BOOLEAN___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_BOOLEAN___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_BOOLEAN___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___GET_LABEL :
-				return getLabel();
-			case UMLPackage.LITERAL_BOOLEAN___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.LITERAL_BOOLEAN___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.LITERAL_BOOLEAN___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.LITERAL_BOOLEAN___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.LITERAL_BOOLEAN___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LITERAL_BOOLEAN___SEPARATOR :
-				return separator();
-			case UMLPackage.LITERAL_BOOLEAN___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.LITERAL_BOOLEAN___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.LITERAL_BOOLEAN___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.LITERAL_BOOLEAN___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_BOOLEAN___BOOLEAN_VALUE :
-				return booleanValue();
-			case UMLPackage.LITERAL_BOOLEAN___INTEGER_VALUE :
-				return integerValue();
-			case UMLPackage.LITERAL_BOOLEAN___IS_COMPUTABLE :
-				return isComputable();
-			case UMLPackage.LITERAL_BOOLEAN___IS_NULL :
-				return isNull();
-			case UMLPackage.LITERAL_BOOLEAN___REAL_VALUE :
-				return realValue();
-			case UMLPackage.LITERAL_BOOLEAN___STRING_VALUE :
-				return stringValue();
-			case UMLPackage.LITERAL_BOOLEAN___UNLIMITED_VALUE :
-				return unlimitedValue();
+		case UMLPackage.LITERAL_BOOLEAN___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_BOOLEAN___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_BOOLEAN___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.LITERAL_BOOLEAN___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.LITERAL_BOOLEAN___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.LITERAL_BOOLEAN___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.LITERAL_BOOLEAN___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_BOOLEAN___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___GET_MODEL:
+			return getModel();
+		case UMLPackage.LITERAL_BOOLEAN___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.LITERAL_BOOLEAN___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.LITERAL_BOOLEAN___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.LITERAL_BOOLEAN___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.LITERAL_BOOLEAN___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.LITERAL_BOOLEAN___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.LITERAL_BOOLEAN___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_BOOLEAN___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_BOOLEAN___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.LITERAL_BOOLEAN___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.LITERAL_BOOLEAN___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.LITERAL_BOOLEAN___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_BOOLEAN___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_BOOLEAN___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_BOOLEAN___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___GET_LABEL:
+			return getLabel();
+		case UMLPackage.LITERAL_BOOLEAN___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.LITERAL_BOOLEAN___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.LITERAL_BOOLEAN___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.LITERAL_BOOLEAN___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.LITERAL_BOOLEAN___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LITERAL_BOOLEAN___SEPARATOR:
+			return separator();
+		case UMLPackage.LITERAL_BOOLEAN___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.LITERAL_BOOLEAN___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.LITERAL_BOOLEAN___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.LITERAL_BOOLEAN___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_BOOLEAN___BOOLEAN_VALUE:
+			return booleanValue();
+		case UMLPackage.LITERAL_BOOLEAN___INTEGER_VALUE:
+			return integerValue();
+		case UMLPackage.LITERAL_BOOLEAN___IS_COMPUTABLE:
+			return isComputable();
+		case UMLPackage.LITERAL_BOOLEAN___IS_NULL:
+			return isNull();
+		case UMLPackage.LITERAL_BOOLEAN___REAL_VALUE:
+			return realValue();
+		case UMLPackage.LITERAL_BOOLEAN___STRING_VALUE:
+			return stringValue();
+		case UMLPackage.LITERAL_BOOLEAN___UNLIMITED_VALUE:
+			return unlimitedValue();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralIntegerImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralIntegerImpl.java
index d51b4fd..6abe072 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralIntegerImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralIntegerImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -16,10 +16,14 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
+
 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.impl.ENotificationImpl;
+
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.LiteralInteger;
 import org.eclipse.uml2.uml.NamedElement;
@@ -86,9 +90,7 @@
 	 * @generated
 	 */
 	public int getValue() {
-		return (Integer) eDynamicGet(
-			UMLPackage.LITERAL_INTEGER__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LITERAL_INTEGER__VALUE, true, true);
+		return (Integer) eDynamicGet(UMLPackage.LITERAL_INTEGER__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LITERAL_INTEGER__VALUE, true, true);
 	}
 
 	/**
@@ -97,8 +99,7 @@
 	 * @generated
 	 */
 	public void setValue(int newValue) {
-		eDynamicSet(UMLPackage.LITERAL_INTEGER__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LITERAL_INTEGER__VALUE, newValue);
+		eDynamicSet(UMLPackage.LITERAL_INTEGER__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LITERAL_INTEGER__VALUE, newValue);
 	}
 
 	/**
@@ -139,46 +140,46 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_INTEGER__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.LITERAL_INTEGER__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.LITERAL_INTEGER__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.LITERAL_INTEGER__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.LITERAL_INTEGER__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.LITERAL_INTEGER__NAME :
-				return getName();
-			case UMLPackage.LITERAL_INTEGER__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.LITERAL_INTEGER__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.LITERAL_INTEGER__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LITERAL_INTEGER__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.LITERAL_INTEGER__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.LITERAL_INTEGER__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.LITERAL_INTEGER__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.LITERAL_INTEGER__VALUE :
-				return getValue();
+		case UMLPackage.LITERAL_INTEGER__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.LITERAL_INTEGER__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.LITERAL_INTEGER__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.LITERAL_INTEGER__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.LITERAL_INTEGER__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.LITERAL_INTEGER__NAME:
+			return getName();
+		case UMLPackage.LITERAL_INTEGER__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.LITERAL_INTEGER__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.LITERAL_INTEGER__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LITERAL_INTEGER__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.LITERAL_INTEGER__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.LITERAL_INTEGER__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.LITERAL_INTEGER__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.LITERAL_INTEGER__VALUE:
+			return getValue();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -192,37 +193,35 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_INTEGER__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.LITERAL_INTEGER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.LITERAL_INTEGER__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.LITERAL_INTEGER__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.LITERAL_INTEGER__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.LITERAL_INTEGER__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.LITERAL_INTEGER__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.LITERAL_INTEGER__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.LITERAL_INTEGER__VALUE :
-				setValue((Integer) newValue);
-				return;
+		case UMLPackage.LITERAL_INTEGER__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.LITERAL_INTEGER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.LITERAL_INTEGER__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.LITERAL_INTEGER__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.LITERAL_INTEGER__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.LITERAL_INTEGER__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.LITERAL_INTEGER__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.LITERAL_INTEGER__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.LITERAL_INTEGER__VALUE:
+			setValue((Integer) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -235,33 +234,33 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_INTEGER__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.LITERAL_INTEGER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.LITERAL_INTEGER__NAME :
-				unsetName();
-				return;
-			case UMLPackage.LITERAL_INTEGER__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.LITERAL_INTEGER__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.LITERAL_INTEGER__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.LITERAL_INTEGER__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.LITERAL_INTEGER__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.LITERAL_INTEGER__VALUE :
-				setValue(VALUE_EDEFAULT);
-				return;
+		case UMLPackage.LITERAL_INTEGER__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.LITERAL_INTEGER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.LITERAL_INTEGER__NAME:
+			unsetName();
+			return;
+		case UMLPackage.LITERAL_INTEGER__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.LITERAL_INTEGER__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.LITERAL_INTEGER__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.LITERAL_INTEGER__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.LITERAL_INTEGER__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.LITERAL_INTEGER__VALUE:
+			setValue(VALUE_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -274,36 +273,34 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_INTEGER__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.LITERAL_INTEGER__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.LITERAL_INTEGER__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.LITERAL_INTEGER__OWNER :
-				return isSetOwner();
-			case UMLPackage.LITERAL_INTEGER__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.LITERAL_INTEGER__NAME :
-				return isSetName();
-			case UMLPackage.LITERAL_INTEGER__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.LITERAL_INTEGER__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.LITERAL_INTEGER__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.LITERAL_INTEGER__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.LITERAL_INTEGER__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.LITERAL_INTEGER__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.LITERAL_INTEGER__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.LITERAL_INTEGER__VALUE :
-				return getValue() != VALUE_EDEFAULT;
+		case UMLPackage.LITERAL_INTEGER__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.LITERAL_INTEGER__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.LITERAL_INTEGER__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.LITERAL_INTEGER__OWNER:
+			return isSetOwner();
+		case UMLPackage.LITERAL_INTEGER__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.LITERAL_INTEGER__NAME:
+			return isSetName();
+		case UMLPackage.LITERAL_INTEGER__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.LITERAL_INTEGER__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.LITERAL_INTEGER__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.LITERAL_INTEGER__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.LITERAL_INTEGER__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.LITERAL_INTEGER__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.LITERAL_INTEGER__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.LITERAL_INTEGER__VALUE:
+			return getValue() != VALUE_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -318,148 +315,130 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.LITERAL_INTEGER___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_INTEGER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_INTEGER___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.LITERAL_INTEGER___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.LITERAL_INTEGER___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.LITERAL_INTEGER___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.LITERAL_INTEGER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_INTEGER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___GET_MODEL :
-				return getModel();
-			case UMLPackage.LITERAL_INTEGER___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.LITERAL_INTEGER___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.LITERAL_INTEGER___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.LITERAL_INTEGER___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.LITERAL_INTEGER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.LITERAL_INTEGER___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.LITERAL_INTEGER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_INTEGER___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_INTEGER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.LITERAL_INTEGER___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.LITERAL_INTEGER___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.LITERAL_INTEGER___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_INTEGER___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_INTEGER___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_INTEGER___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___GET_LABEL :
-				return getLabel();
-			case UMLPackage.LITERAL_INTEGER___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.LITERAL_INTEGER___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.LITERAL_INTEGER___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.LITERAL_INTEGER___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.LITERAL_INTEGER___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LITERAL_INTEGER___SEPARATOR :
-				return separator();
-			case UMLPackage.LITERAL_INTEGER___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.LITERAL_INTEGER___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.LITERAL_INTEGER___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.LITERAL_INTEGER___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_INTEGER___BOOLEAN_VALUE :
-				return booleanValue();
-			case UMLPackage.LITERAL_INTEGER___INTEGER_VALUE :
-				return integerValue();
-			case UMLPackage.LITERAL_INTEGER___IS_COMPUTABLE :
-				return isComputable();
-			case UMLPackage.LITERAL_INTEGER___IS_NULL :
-				return isNull();
-			case UMLPackage.LITERAL_INTEGER___REAL_VALUE :
-				return realValue();
-			case UMLPackage.LITERAL_INTEGER___STRING_VALUE :
-				return stringValue();
-			case UMLPackage.LITERAL_INTEGER___UNLIMITED_VALUE :
-				return unlimitedValue();
+		case UMLPackage.LITERAL_INTEGER___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_INTEGER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_INTEGER___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.LITERAL_INTEGER___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.LITERAL_INTEGER___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.LITERAL_INTEGER___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.LITERAL_INTEGER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_INTEGER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___GET_MODEL:
+			return getModel();
+		case UMLPackage.LITERAL_INTEGER___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.LITERAL_INTEGER___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.LITERAL_INTEGER___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.LITERAL_INTEGER___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.LITERAL_INTEGER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.LITERAL_INTEGER___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.LITERAL_INTEGER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_INTEGER___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_INTEGER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.LITERAL_INTEGER___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.LITERAL_INTEGER___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.LITERAL_INTEGER___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_INTEGER___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_INTEGER___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_INTEGER___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___GET_LABEL:
+			return getLabel();
+		case UMLPackage.LITERAL_INTEGER___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.LITERAL_INTEGER___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.LITERAL_INTEGER___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.LITERAL_INTEGER___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.LITERAL_INTEGER___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LITERAL_INTEGER___SEPARATOR:
+			return separator();
+		case UMLPackage.LITERAL_INTEGER___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.LITERAL_INTEGER___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.LITERAL_INTEGER___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.LITERAL_INTEGER___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_INTEGER___BOOLEAN_VALUE:
+			return booleanValue();
+		case UMLPackage.LITERAL_INTEGER___INTEGER_VALUE:
+			return integerValue();
+		case UMLPackage.LITERAL_INTEGER___IS_COMPUTABLE:
+			return isComputable();
+		case UMLPackage.LITERAL_INTEGER___IS_NULL:
+			return isNull();
+		case UMLPackage.LITERAL_INTEGER___REAL_VALUE:
+			return realValue();
+		case UMLPackage.LITERAL_INTEGER___STRING_VALUE:
+			return stringValue();
+		case UMLPackage.LITERAL_INTEGER___UNLIMITED_VALUE:
+			return unlimitedValue();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralNullImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralNullImpl.java
index 87d06da..6e5224a 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralNullImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralNullImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -88,148 +88,130 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.LITERAL_NULL___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_NULL___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_NULL___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.LITERAL_NULL___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.LITERAL_NULL___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.LITERAL_NULL___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.LITERAL_NULL___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_NULL___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___GET_MODEL :
-				return getModel();
-			case UMLPackage.LITERAL_NULL___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.LITERAL_NULL___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.LITERAL_NULL___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.LITERAL_NULL___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.LITERAL_NULL___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.LITERAL_NULL___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.LITERAL_NULL___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_NULL___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_NULL___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.LITERAL_NULL___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.LITERAL_NULL___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.LITERAL_NULL___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_NULL___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_NULL___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_NULL___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___GET_LABEL :
-				return getLabel();
-			case UMLPackage.LITERAL_NULL___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.LITERAL_NULL___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.LITERAL_NULL___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.LITERAL_NULL___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.LITERAL_NULL___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LITERAL_NULL___SEPARATOR :
-				return separator();
-			case UMLPackage.LITERAL_NULL___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.LITERAL_NULL___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.LITERAL_NULL___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.LITERAL_NULL___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_NULL___BOOLEAN_VALUE :
-				return booleanValue();
-			case UMLPackage.LITERAL_NULL___INTEGER_VALUE :
-				return integerValue();
-			case UMLPackage.LITERAL_NULL___IS_COMPUTABLE :
-				return isComputable();
-			case UMLPackage.LITERAL_NULL___IS_NULL :
-				return isNull();
-			case UMLPackage.LITERAL_NULL___REAL_VALUE :
-				return realValue();
-			case UMLPackage.LITERAL_NULL___STRING_VALUE :
-				return stringValue();
-			case UMLPackage.LITERAL_NULL___UNLIMITED_VALUE :
-				return unlimitedValue();
+		case UMLPackage.LITERAL_NULL___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_NULL___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_NULL___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.LITERAL_NULL___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.LITERAL_NULL___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.LITERAL_NULL___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.LITERAL_NULL___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_NULL___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___GET_MODEL:
+			return getModel();
+		case UMLPackage.LITERAL_NULL___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.LITERAL_NULL___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.LITERAL_NULL___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.LITERAL_NULL___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.LITERAL_NULL___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.LITERAL_NULL___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.LITERAL_NULL___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_NULL___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_NULL___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.LITERAL_NULL___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.LITERAL_NULL___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.LITERAL_NULL___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_NULL___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_NULL___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_NULL___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___GET_LABEL:
+			return getLabel();
+		case UMLPackage.LITERAL_NULL___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.LITERAL_NULL___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.LITERAL_NULL___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.LITERAL_NULL___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.LITERAL_NULL___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LITERAL_NULL___SEPARATOR:
+			return separator();
+		case UMLPackage.LITERAL_NULL___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.LITERAL_NULL___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.LITERAL_NULL___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.LITERAL_NULL___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_NULL___BOOLEAN_VALUE:
+			return booleanValue();
+		case UMLPackage.LITERAL_NULL___INTEGER_VALUE:
+			return integerValue();
+		case UMLPackage.LITERAL_NULL___IS_COMPUTABLE:
+			return isComputable();
+		case UMLPackage.LITERAL_NULL___IS_NULL:
+			return isNull();
+		case UMLPackage.LITERAL_NULL___REAL_VALUE:
+			return realValue();
+		case UMLPackage.LITERAL_NULL___STRING_VALUE:
+			return stringValue();
+		case UMLPackage.LITERAL_NULL___UNLIMITED_VALUE:
+			return unlimitedValue();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralRealImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralRealImpl.java
index 9da4ec4..1d649ed 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralRealImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralRealImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2011, 2017 CEA and others.
+ * Copyright (c) 2011, 2018 CEA and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   Kenn Hussey (CEA) - initial API and implementation
  *   Kenn Hussey (CEA) - 351774, 418466, 451350, 485756
- *   Kenn Hussey - 519572
+ *   Kenn Hussey - 519572, 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -18,12 +18,16 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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.impl.ENotificationImpl;
+
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.LiteralReal;
 import org.eclipse.uml2.uml.NamedElement;
@@ -90,9 +94,7 @@
 	 * @generated
 	 */
 	public double getValue() {
-		return (Double) eDynamicGet(
-			UMLPackage.LITERAL_REAL__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LITERAL_REAL__VALUE, true, true);
+		return (Double) eDynamicGet(UMLPackage.LITERAL_REAL__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LITERAL_REAL__VALUE, true, true);
 	}
 
 	/**
@@ -101,8 +103,7 @@
 	 * @generated
 	 */
 	public void setValue(double newValue) {
-		eDynamicSet(UMLPackage.LITERAL_REAL__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LITERAL_REAL__VALUE, newValue);
+		eDynamicSet(UMLPackage.LITERAL_REAL__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LITERAL_REAL__VALUE, newValue);
 	}
 
 	/**
@@ -143,46 +144,46 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_REAL__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.LITERAL_REAL__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.LITERAL_REAL__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.LITERAL_REAL__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.LITERAL_REAL__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.LITERAL_REAL__NAME :
-				return getName();
-			case UMLPackage.LITERAL_REAL__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.LITERAL_REAL__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.LITERAL_REAL__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LITERAL_REAL__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.LITERAL_REAL__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.LITERAL_REAL__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.LITERAL_REAL__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.LITERAL_REAL__VALUE :
-				return getValue();
+		case UMLPackage.LITERAL_REAL__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.LITERAL_REAL__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.LITERAL_REAL__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.LITERAL_REAL__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.LITERAL_REAL__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.LITERAL_REAL__NAME:
+			return getName();
+		case UMLPackage.LITERAL_REAL__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.LITERAL_REAL__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.LITERAL_REAL__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LITERAL_REAL__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.LITERAL_REAL__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.LITERAL_REAL__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.LITERAL_REAL__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.LITERAL_REAL__VALUE:
+			return getValue();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -196,37 +197,35 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_REAL__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.LITERAL_REAL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.LITERAL_REAL__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.LITERAL_REAL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.LITERAL_REAL__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.LITERAL_REAL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.LITERAL_REAL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.LITERAL_REAL__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.LITERAL_REAL__VALUE :
-				setValue((Double) newValue);
-				return;
+		case UMLPackage.LITERAL_REAL__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.LITERAL_REAL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.LITERAL_REAL__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.LITERAL_REAL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.LITERAL_REAL__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.LITERAL_REAL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.LITERAL_REAL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.LITERAL_REAL__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.LITERAL_REAL__VALUE:
+			setValue((Double) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -239,33 +238,33 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_REAL__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.LITERAL_REAL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.LITERAL_REAL__NAME :
-				unsetName();
-				return;
-			case UMLPackage.LITERAL_REAL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.LITERAL_REAL__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.LITERAL_REAL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.LITERAL_REAL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.LITERAL_REAL__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.LITERAL_REAL__VALUE :
-				setValue(VALUE_EDEFAULT);
-				return;
+		case UMLPackage.LITERAL_REAL__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.LITERAL_REAL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.LITERAL_REAL__NAME:
+			unsetName();
+			return;
+		case UMLPackage.LITERAL_REAL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.LITERAL_REAL__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.LITERAL_REAL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.LITERAL_REAL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.LITERAL_REAL__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.LITERAL_REAL__VALUE:
+			setValue(VALUE_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -278,36 +277,34 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_REAL__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.LITERAL_REAL__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.LITERAL_REAL__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.LITERAL_REAL__OWNER :
-				return isSetOwner();
-			case UMLPackage.LITERAL_REAL__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.LITERAL_REAL__NAME :
-				return isSetName();
-			case UMLPackage.LITERAL_REAL__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.LITERAL_REAL__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.LITERAL_REAL__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.LITERAL_REAL__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.LITERAL_REAL__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.LITERAL_REAL__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.LITERAL_REAL__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.LITERAL_REAL__VALUE :
-				return getValue() != VALUE_EDEFAULT;
+		case UMLPackage.LITERAL_REAL__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.LITERAL_REAL__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.LITERAL_REAL__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.LITERAL_REAL__OWNER:
+			return isSetOwner();
+		case UMLPackage.LITERAL_REAL__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.LITERAL_REAL__NAME:
+			return isSetName();
+		case UMLPackage.LITERAL_REAL__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.LITERAL_REAL__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.LITERAL_REAL__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.LITERAL_REAL__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.LITERAL_REAL__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.LITERAL_REAL__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.LITERAL_REAL__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.LITERAL_REAL__VALUE:
+			return getValue() != VALUE_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -322,148 +319,130 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.LITERAL_REAL___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_REAL___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_REAL___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.LITERAL_REAL___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.LITERAL_REAL___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.LITERAL_REAL___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.LITERAL_REAL___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_REAL___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___GET_MODEL :
-				return getModel();
-			case UMLPackage.LITERAL_REAL___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.LITERAL_REAL___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.LITERAL_REAL___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.LITERAL_REAL___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.LITERAL_REAL___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.LITERAL_REAL___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.LITERAL_REAL___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_REAL___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_REAL___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.LITERAL_REAL___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.LITERAL_REAL___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.LITERAL_REAL___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_REAL___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_REAL___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_REAL___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___GET_LABEL :
-				return getLabel();
-			case UMLPackage.LITERAL_REAL___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.LITERAL_REAL___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.LITERAL_REAL___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.LITERAL_REAL___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.LITERAL_REAL___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LITERAL_REAL___SEPARATOR :
-				return separator();
-			case UMLPackage.LITERAL_REAL___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.LITERAL_REAL___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.LITERAL_REAL___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.LITERAL_REAL___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_REAL___BOOLEAN_VALUE :
-				return booleanValue();
-			case UMLPackage.LITERAL_REAL___INTEGER_VALUE :
-				return integerValue();
-			case UMLPackage.LITERAL_REAL___IS_COMPUTABLE :
-				return isComputable();
-			case UMLPackage.LITERAL_REAL___IS_NULL :
-				return isNull();
-			case UMLPackage.LITERAL_REAL___REAL_VALUE :
-				return realValue();
-			case UMLPackage.LITERAL_REAL___STRING_VALUE :
-				return stringValue();
-			case UMLPackage.LITERAL_REAL___UNLIMITED_VALUE :
-				return unlimitedValue();
+		case UMLPackage.LITERAL_REAL___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_REAL___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_REAL___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.LITERAL_REAL___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.LITERAL_REAL___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.LITERAL_REAL___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.LITERAL_REAL___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_REAL___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___GET_MODEL:
+			return getModel();
+		case UMLPackage.LITERAL_REAL___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.LITERAL_REAL___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.LITERAL_REAL___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.LITERAL_REAL___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.LITERAL_REAL___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.LITERAL_REAL___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.LITERAL_REAL___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_REAL___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_REAL___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.LITERAL_REAL___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.LITERAL_REAL___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.LITERAL_REAL___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_REAL___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_REAL___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_REAL___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___GET_LABEL:
+			return getLabel();
+		case UMLPackage.LITERAL_REAL___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.LITERAL_REAL___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.LITERAL_REAL___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.LITERAL_REAL___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.LITERAL_REAL___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LITERAL_REAL___SEPARATOR:
+			return separator();
+		case UMLPackage.LITERAL_REAL___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.LITERAL_REAL___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.LITERAL_REAL___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.LITERAL_REAL___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_REAL___BOOLEAN_VALUE:
+			return booleanValue();
+		case UMLPackage.LITERAL_REAL___INTEGER_VALUE:
+			return integerValue();
+		case UMLPackage.LITERAL_REAL___IS_COMPUTABLE:
+			return isComputable();
+		case UMLPackage.LITERAL_REAL___IS_NULL:
+			return isNull();
+		case UMLPackage.LITERAL_REAL___REAL_VALUE:
+			return realValue();
+		case UMLPackage.LITERAL_REAL___STRING_VALUE:
+			return stringValue();
+		case UMLPackage.LITERAL_REAL___UNLIMITED_VALUE:
+			return unlimitedValue();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralSpecificationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralSpecificationImpl.java
index bd46281..93ce9a2 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralSpecificationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralSpecificationImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralStringImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralStringImpl.java
index 9cff446..fe7db8a 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralStringImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralStringImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,10 +17,14 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
+
 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.impl.ENotificationImpl;
+
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.LiteralString;
 import org.eclipse.uml2.uml.NamedElement;
@@ -87,9 +91,7 @@
 	 * @generated
 	 */
 	public String getValue() {
-		return (String) eDynamicGet(
-			UMLPackage.LITERAL_STRING__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LITERAL_STRING__VALUE, true, true);
+		return (String) eDynamicGet(UMLPackage.LITERAL_STRING__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LITERAL_STRING__VALUE, true, true);
 	}
 
 	/**
@@ -98,8 +100,7 @@
 	 * @generated
 	 */
 	public void setValue(String newValue) {
-		eDynamicSet(UMLPackage.LITERAL_STRING__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LITERAL_STRING__VALUE, newValue);
+		eDynamicSet(UMLPackage.LITERAL_STRING__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LITERAL_STRING__VALUE, newValue);
 	}
 
 	/**
@@ -108,8 +109,7 @@
 	 * @generated
 	 */
 	public void unsetValue() {
-		eDynamicUnset(UMLPackage.LITERAL_STRING__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LITERAL_STRING__VALUE);
+		eDynamicUnset(UMLPackage.LITERAL_STRING__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LITERAL_STRING__VALUE);
 	}
 
 	/**
@@ -118,9 +118,7 @@
 	 * @generated
 	 */
 	public boolean isSetValue() {
-		return eDynamicIsSet(
-			UMLPackage.LITERAL_STRING__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LITERAL_STRING__VALUE);
+		return eDynamicIsSet(UMLPackage.LITERAL_STRING__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LITERAL_STRING__VALUE);
 	}
 
 	/**
@@ -171,46 +169,46 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_STRING__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.LITERAL_STRING__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.LITERAL_STRING__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.LITERAL_STRING__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.LITERAL_STRING__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.LITERAL_STRING__NAME :
-				return getName();
-			case UMLPackage.LITERAL_STRING__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.LITERAL_STRING__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.LITERAL_STRING__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LITERAL_STRING__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.LITERAL_STRING__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.LITERAL_STRING__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.LITERAL_STRING__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.LITERAL_STRING__VALUE :
-				return getValue();
+		case UMLPackage.LITERAL_STRING__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.LITERAL_STRING__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.LITERAL_STRING__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.LITERAL_STRING__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.LITERAL_STRING__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.LITERAL_STRING__NAME:
+			return getName();
+		case UMLPackage.LITERAL_STRING__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.LITERAL_STRING__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.LITERAL_STRING__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LITERAL_STRING__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.LITERAL_STRING__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.LITERAL_STRING__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.LITERAL_STRING__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.LITERAL_STRING__VALUE:
+			return getValue();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -224,37 +222,35 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_STRING__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.LITERAL_STRING__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.LITERAL_STRING__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.LITERAL_STRING__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.LITERAL_STRING__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.LITERAL_STRING__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.LITERAL_STRING__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.LITERAL_STRING__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.LITERAL_STRING__VALUE :
-				setValue((String) newValue);
-				return;
+		case UMLPackage.LITERAL_STRING__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.LITERAL_STRING__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.LITERAL_STRING__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.LITERAL_STRING__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.LITERAL_STRING__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.LITERAL_STRING__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.LITERAL_STRING__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.LITERAL_STRING__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.LITERAL_STRING__VALUE:
+			setValue((String) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -267,33 +263,33 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_STRING__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.LITERAL_STRING__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.LITERAL_STRING__NAME :
-				unsetName();
-				return;
-			case UMLPackage.LITERAL_STRING__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.LITERAL_STRING__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.LITERAL_STRING__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.LITERAL_STRING__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.LITERAL_STRING__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.LITERAL_STRING__VALUE :
-				unsetValue();
-				return;
+		case UMLPackage.LITERAL_STRING__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.LITERAL_STRING__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.LITERAL_STRING__NAME:
+			unsetName();
+			return;
+		case UMLPackage.LITERAL_STRING__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.LITERAL_STRING__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.LITERAL_STRING__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.LITERAL_STRING__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.LITERAL_STRING__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.LITERAL_STRING__VALUE:
+			unsetValue();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -306,36 +302,34 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_STRING__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.LITERAL_STRING__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.LITERAL_STRING__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.LITERAL_STRING__OWNER :
-				return isSetOwner();
-			case UMLPackage.LITERAL_STRING__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.LITERAL_STRING__NAME :
-				return isSetName();
-			case UMLPackage.LITERAL_STRING__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.LITERAL_STRING__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.LITERAL_STRING__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.LITERAL_STRING__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.LITERAL_STRING__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.LITERAL_STRING__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.LITERAL_STRING__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.LITERAL_STRING__VALUE :
-				return isSetValue();
+		case UMLPackage.LITERAL_STRING__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.LITERAL_STRING__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.LITERAL_STRING__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.LITERAL_STRING__OWNER:
+			return isSetOwner();
+		case UMLPackage.LITERAL_STRING__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.LITERAL_STRING__NAME:
+			return isSetName();
+		case UMLPackage.LITERAL_STRING__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.LITERAL_STRING__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.LITERAL_STRING__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.LITERAL_STRING__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.LITERAL_STRING__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.LITERAL_STRING__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.LITERAL_STRING__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.LITERAL_STRING__VALUE:
+			return isSetValue();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -350,148 +344,130 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.LITERAL_STRING___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_STRING___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_STRING___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.LITERAL_STRING___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.LITERAL_STRING___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.LITERAL_STRING___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.LITERAL_STRING___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_STRING___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___GET_MODEL :
-				return getModel();
-			case UMLPackage.LITERAL_STRING___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.LITERAL_STRING___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.LITERAL_STRING___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.LITERAL_STRING___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.LITERAL_STRING___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.LITERAL_STRING___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.LITERAL_STRING___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_STRING___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_STRING___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.LITERAL_STRING___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.LITERAL_STRING___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.LITERAL_STRING___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_STRING___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_STRING___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_STRING___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___GET_LABEL :
-				return getLabel();
-			case UMLPackage.LITERAL_STRING___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.LITERAL_STRING___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.LITERAL_STRING___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.LITERAL_STRING___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.LITERAL_STRING___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LITERAL_STRING___SEPARATOR :
-				return separator();
-			case UMLPackage.LITERAL_STRING___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.LITERAL_STRING___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.LITERAL_STRING___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.LITERAL_STRING___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_STRING___BOOLEAN_VALUE :
-				return booleanValue();
-			case UMLPackage.LITERAL_STRING___INTEGER_VALUE :
-				return integerValue();
-			case UMLPackage.LITERAL_STRING___IS_COMPUTABLE :
-				return isComputable();
-			case UMLPackage.LITERAL_STRING___IS_NULL :
-				return isNull();
-			case UMLPackage.LITERAL_STRING___REAL_VALUE :
-				return realValue();
-			case UMLPackage.LITERAL_STRING___STRING_VALUE :
-				return stringValue();
-			case UMLPackage.LITERAL_STRING___UNLIMITED_VALUE :
-				return unlimitedValue();
+		case UMLPackage.LITERAL_STRING___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_STRING___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_STRING___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.LITERAL_STRING___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.LITERAL_STRING___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.LITERAL_STRING___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.LITERAL_STRING___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_STRING___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___GET_MODEL:
+			return getModel();
+		case UMLPackage.LITERAL_STRING___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.LITERAL_STRING___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.LITERAL_STRING___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.LITERAL_STRING___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.LITERAL_STRING___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.LITERAL_STRING___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.LITERAL_STRING___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_STRING___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_STRING___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.LITERAL_STRING___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.LITERAL_STRING___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.LITERAL_STRING___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_STRING___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_STRING___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_STRING___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___GET_LABEL:
+			return getLabel();
+		case UMLPackage.LITERAL_STRING___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.LITERAL_STRING___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.LITERAL_STRING___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.LITERAL_STRING___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.LITERAL_STRING___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LITERAL_STRING___SEPARATOR:
+			return separator();
+		case UMLPackage.LITERAL_STRING___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.LITERAL_STRING___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.LITERAL_STRING___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.LITERAL_STRING___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_STRING___BOOLEAN_VALUE:
+			return booleanValue();
+		case UMLPackage.LITERAL_STRING___INTEGER_VALUE:
+			return integerValue();
+		case UMLPackage.LITERAL_STRING___IS_COMPUTABLE:
+			return isComputable();
+		case UMLPackage.LITERAL_STRING___IS_NULL:
+			return isNull();
+		case UMLPackage.LITERAL_STRING___REAL_VALUE:
+			return realValue();
+		case UMLPackage.LITERAL_STRING___STRING_VALUE:
+			return stringValue();
+		case UMLPackage.LITERAL_STRING___UNLIMITED_VALUE:
+			return unlimitedValue();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralUnlimitedNaturalImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralUnlimitedNaturalImpl.java
index 7735523..9a76ad3 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralUnlimitedNaturalImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LiteralUnlimitedNaturalImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -16,10 +16,14 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
+
 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.impl.ENotificationImpl;
+
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.LiteralUnlimitedNatural;
 import org.eclipse.uml2.uml.NamedElement;
@@ -86,9 +90,7 @@
 	 * @generated
 	 */
 	public int getValue() {
-		return (Integer) eDynamicGet(
-			UMLPackage.LITERAL_UNLIMITED_NATURAL__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LITERAL_UNLIMITED_NATURAL__VALUE, true, true);
+		return (Integer) eDynamicGet(UMLPackage.LITERAL_UNLIMITED_NATURAL__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LITERAL_UNLIMITED_NATURAL__VALUE, true, true);
 	}
 
 	/**
@@ -97,9 +99,7 @@
 	 * @generated
 	 */
 	public void setValue(int newValue) {
-		eDynamicSet(
-			UMLPackage.LITERAL_UNLIMITED_NATURAL__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LITERAL_UNLIMITED_NATURAL__VALUE, newValue);
+		eDynamicSet(UMLPackage.LITERAL_UNLIMITED_NATURAL__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LITERAL_UNLIMITED_NATURAL__VALUE, newValue);
 	}
 
 	/**
@@ -140,46 +140,46 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME :
-				return getName();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__VALUE :
-				return getValue();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME:
+			return getName();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__VALUE:
+			return getValue();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -193,37 +193,35 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__VALUE :
-				setValue((Integer) newValue);
-				return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__VALUE:
+			setValue((Integer) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -236,33 +234,33 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME :
-				unsetName();
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__VALUE :
-				setValue(VALUE_EDEFAULT);
-				return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME:
+			unsetName();
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__VALUE:
+			setValue(VALUE_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -275,36 +273,34 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNER :
-				return isSetOwner();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME :
-				return isSetName();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL__VALUE :
-				return getValue() != VALUE_EDEFAULT;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNER:
+			return isSetOwner();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME:
+			return isSetName();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL__VALUE:
+			return getValue() != VALUE_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -319,148 +315,130 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_MODEL :
-				return getModel();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_LABEL :
-				return getLabel();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___SEPARATOR :
-				return separator();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___BOOLEAN_VALUE :
-				return booleanValue();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___INTEGER_VALUE :
-				return integerValue();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_COMPUTABLE :
-				return isComputable();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_NULL :
-				return isNull();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___REAL_VALUE :
-				return realValue();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___STRING_VALUE :
-				return stringValue();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL___UNLIMITED_VALUE :
-				return unlimitedValue();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_MODEL:
+			return getModel();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_LABEL:
+			return getLabel();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___SEPARATOR:
+			return separator();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___BOOLEAN_VALUE:
+			return booleanValue();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___INTEGER_VALUE:
+			return integerValue();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_COMPUTABLE:
+			return isComputable();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___IS_NULL:
+			return isNull();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___REAL_VALUE:
+			return realValue();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___STRING_VALUE:
+			return stringValue();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL___UNLIMITED_VALUE:
+			return unlimitedValue();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LoopNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LoopNodeImpl.java
index d6c1007..5478a57 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LoopNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/LoopNodeImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 397139, 397141, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,7 +29,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -129,20 +134,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.LOOP_NODE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.LOOP_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.LOOP_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.LOOP_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -153,16 +151,9 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.LOOP_NODE__OWNED_COMMENT,
-		UMLPackage.LOOP_NODE__NAME_EXPRESSION, UMLPackage.LOOP_NODE__HANDLER,
-		UMLPackage.LOOP_NODE__INPUT, UMLPackage.LOOP_NODE__LOCAL_POSTCONDITION,
-		UMLPackage.LOOP_NODE__LOCAL_PRECONDITION, UMLPackage.LOOP_NODE__OUTPUT,
-		UMLPackage.LOOP_NODE__ELEMENT_IMPORT,
-		UMLPackage.LOOP_NODE__PACKAGE_IMPORT,
-		UMLPackage.LOOP_NODE__OWNED_MEMBER, UMLPackage.LOOP_NODE__SUBGROUP,
-		UMLPackage.LOOP_NODE__EDGE, UMLPackage.LOOP_NODE__NODE,
-		UMLPackage.LOOP_NODE__LOOP_VARIABLE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.LOOP_NODE__OWNED_COMMENT, UMLPackage.LOOP_NODE__NAME_EXPRESSION, UMLPackage.LOOP_NODE__HANDLER, UMLPackage.LOOP_NODE__INPUT, UMLPackage.LOOP_NODE__LOCAL_POSTCONDITION,
+			UMLPackage.LOOP_NODE__LOCAL_PRECONDITION, UMLPackage.LOOP_NODE__OUTPUT, UMLPackage.LOOP_NODE__ELEMENT_IMPORT, UMLPackage.LOOP_NODE__PACKAGE_IMPORT, UMLPackage.LOOP_NODE__OWNED_MEMBER, UMLPackage.LOOP_NODE__SUBGROUP, UMLPackage.LOOP_NODE__EDGE,
+			UMLPackage.LOOP_NODE__NODE, UMLPackage.LOOP_NODE__LOOP_VARIABLE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -170,9 +161,7 @@
 	 * @generated
 	 */
 	public boolean isTestedFirst() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.LOOP_NODE__IS_TESTED_FIRST - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LOOP_NODE__IS_TESTED_FIRST, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.LOOP_NODE__IS_TESTED_FIRST - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LOOP_NODE__IS_TESTED_FIRST, true, true);
 	}
 
 	/**
@@ -181,9 +170,7 @@
 	 * @generated
 	 */
 	public void setIsTestedFirst(boolean newIsTestedFirst) {
-		eDynamicSet(
-			UMLPackage.LOOP_NODE__IS_TESTED_FIRST - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LOOP_NODE__IS_TESTED_FIRST, newIsTestedFirst);
+		eDynamicSet(UMLPackage.LOOP_NODE__IS_TESTED_FIRST - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LOOP_NODE__IS_TESTED_FIRST, newIsTestedFirst);
 	}
 
 	/**
@@ -193,9 +180,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ExecutableNode> getBodyParts() {
-		return (EList<ExecutableNode>) eDynamicGet(
-			UMLPackage.LOOP_NODE__BODY_PART - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LOOP_NODE__BODY_PART, true, true);
+		return (EList<ExecutableNode>) eDynamicGet(UMLPackage.LOOP_NODE__BODY_PART - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LOOP_NODE__BODY_PART, true, true);
 	}
 
 	/**
@@ -214,12 +199,10 @@
 	 */
 	public ExecutableNode getBodyPart(String name, boolean ignoreCase,
 			EClass eClass) {
-		bodyPartLoop : for (ExecutableNode bodyPart : getBodyParts()) {
+		bodyPartLoop: for (ExecutableNode bodyPart : getBodyParts()) {
 			if (eClass != null && !eClass.isInstance(bodyPart))
 				continue bodyPartLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(bodyPart.getName())
-				: name.equals(bodyPart.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(bodyPart.getName()) : name.equals(bodyPart.getName())))
 				continue bodyPartLoop;
 			return bodyPart;
 		}
@@ -233,9 +216,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ExecutableNode> getSetupParts() {
-		return (EList<ExecutableNode>) eDynamicGet(
-			UMLPackage.LOOP_NODE__SETUP_PART - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LOOP_NODE__SETUP_PART, true, true);
+		return (EList<ExecutableNode>) eDynamicGet(UMLPackage.LOOP_NODE__SETUP_PART - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LOOP_NODE__SETUP_PART, true, true);
 	}
 
 	/**
@@ -254,12 +235,10 @@
 	 */
 	public ExecutableNode getSetupPart(String name, boolean ignoreCase,
 			EClass eClass) {
-		setupPartLoop : for (ExecutableNode setupPart : getSetupParts()) {
+		setupPartLoop: for (ExecutableNode setupPart : getSetupParts()) {
 			if (eClass != null && !eClass.isInstance(setupPart))
 				continue setupPartLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(setupPart.getName())
-				: name.equals(setupPart.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(setupPart.getName()) : name.equals(setupPart.getName())))
 				continue setupPartLoop;
 			return setupPart;
 		}
@@ -272,9 +251,7 @@
 	 * @generated
 	 */
 	public OutputPin getDecider() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.LOOP_NODE__DECIDER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LOOP_NODE__DECIDER, true, true);
+		return (OutputPin) eDynamicGet(UMLPackage.LOOP_NODE__DECIDER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LOOP_NODE__DECIDER, true, true);
 	}
 
 	/**
@@ -283,9 +260,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetDecider() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.LOOP_NODE__DECIDER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LOOP_NODE__DECIDER, false, true);
+		return (OutputPin) eDynamicGet(UMLPackage.LOOP_NODE__DECIDER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LOOP_NODE__DECIDER, false, true);
 	}
 
 	/**
@@ -294,8 +269,7 @@
 	 * @generated
 	 */
 	public void setDecider(OutputPin newDecider) {
-		eDynamicSet(UMLPackage.LOOP_NODE__DECIDER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LOOP_NODE__DECIDER, newDecider);
+		eDynamicSet(UMLPackage.LOOP_NODE__DECIDER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LOOP_NODE__DECIDER, newDecider);
 	}
 
 	/**
@@ -305,9 +279,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ExecutableNode> getTests() {
-		return (EList<ExecutableNode>) eDynamicGet(
-			UMLPackage.LOOP_NODE__TEST - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LOOP_NODE__TEST, true, true);
+		return (EList<ExecutableNode>) eDynamicGet(UMLPackage.LOOP_NODE__TEST - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LOOP_NODE__TEST, true, true);
 	}
 
 	/**
@@ -326,12 +298,10 @@
 	 */
 	public ExecutableNode getTest(String name, boolean ignoreCase,
 			EClass eClass) {
-		testLoop : for (ExecutableNode test : getTests()) {
+		testLoop: for (ExecutableNode test : getTests()) {
 			if (eClass != null && !eClass.isInstance(test))
 				continue testLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(test.getName())
-				: name.equals(test.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(test.getName()) : name.equals(test.getName())))
 				continue testLoop;
 			return test;
 		}
@@ -345,9 +315,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<OutputPin> getResults() {
-		return (EList<OutputPin>) eDynamicGet(
-			UMLPackage.LOOP_NODE__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LOOP_NODE__RESULT, true, true);
+		return (EList<OutputPin>) eDynamicGet(UMLPackage.LOOP_NODE__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LOOP_NODE__RESULT, true, true);
 	}
 
 	/**
@@ -356,8 +324,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		getResults().add(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -382,18 +349,14 @@
 	 */
 	public OutputPin getResult(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		resultLoop : for (OutputPin result : getResults()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(result.getName())
-				: name.equals(result.getName())))
+		resultLoop: for (OutputPin result : getResults()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(result.getName()) : name.equals(result.getName())))
 				continue resultLoop;
 			if (type != null && !type.equals(result.getType()))
 				continue resultLoop;
 			return result;
 		}
-		return createOnDemand
-			? createResult(name, type)
-			: null;
+		return createOnDemand ? createResult(name, type) : null;
 	}
 
 	/**
@@ -412,9 +375,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<OutputPin> getLoopVariables() {
-		return (EList<OutputPin>) eDynamicGet(
-			UMLPackage.LOOP_NODE__LOOP_VARIABLE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LOOP_NODE__LOOP_VARIABLE, true, true);
+		return (EList<OutputPin>) eDynamicGet(UMLPackage.LOOP_NODE__LOOP_VARIABLE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LOOP_NODE__LOOP_VARIABLE, true, true);
 	}
 
 	/**
@@ -423,8 +384,7 @@
 	 * @generated
 	 */
 	public OutputPin createLoopVariable(String name, Type type) {
-		OutputPin newLoopVariable = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newLoopVariable = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		getLoopVariables().add(newLoopVariable);
 		if (name != null)
 			newLoopVariable.setName(name);
@@ -459,18 +419,14 @@
 	 */
 	public OutputPin getLoopVariable(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		loopVariableLoop : for (OutputPin loopVariable : getLoopVariables()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(loopVariable.getName())
-				: name.equals(loopVariable.getName())))
+		loopVariableLoop: for (OutputPin loopVariable : getLoopVariables()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(loopVariable.getName()) : name.equals(loopVariable.getName())))
 				continue loopVariableLoop;
 			if (type != null && !type.equals(loopVariable.getType()))
 				continue loopVariableLoop;
 			return loopVariable;
 		}
-		return createOnDemand
-			? createLoopVariable(name, type)
-			: null;
+		return createOnDemand ? createLoopVariable(name, type) : null;
 	}
 
 	/**
@@ -480,9 +436,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<OutputPin> getBodyOutputs() {
-		return (EList<OutputPin>) eDynamicGet(
-			UMLPackage.LOOP_NODE__BODY_OUTPUT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LOOP_NODE__BODY_OUTPUT, true, true);
+		return (EList<OutputPin>) eDynamicGet(UMLPackage.LOOP_NODE__BODY_OUTPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LOOP_NODE__BODY_OUTPUT, true, true);
 	}
 
 	/**
@@ -500,10 +454,8 @@
 	 * @generated
 	 */
 	public OutputPin getBodyOutput(String name, Type type, boolean ignoreCase) {
-		bodyOutputLoop : for (OutputPin bodyOutput : getBodyOutputs()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(bodyOutput.getName())
-				: name.equals(bodyOutput.getName())))
+		bodyOutputLoop: for (OutputPin bodyOutput : getBodyOutputs()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(bodyOutput.getName()) : name.equals(bodyOutput.getName())))
 				continue bodyOutputLoop;
 			if (type != null && !type.equals(bodyOutput.getType()))
 				continue bodyOutputLoop;
@@ -519,9 +471,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<InputPin> getLoopVariableInputs() {
-		return (EList<InputPin>) eDynamicGet(
-			UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.LOOP_NODE__LOOP_VARIABLE_INPUT, true, true);
+		return (EList<InputPin>) eDynamicGet(UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.LOOP_NODE__LOOP_VARIABLE_INPUT, true, true);
 	}
 
 	/**
@@ -546,8 +496,7 @@
 	 * @generated
 	 */
 	public InputPin createLoopVariableInput(String name, Type type) {
-		return createLoopVariableInput(name, type,
-			UMLPackage.Literals.INPUT_PIN);
+		return createLoopVariableInput(name, type, UMLPackage.Literals.INPUT_PIN);
 	}
 
 	/**
@@ -566,20 +515,16 @@
 	 */
 	public InputPin getLoopVariableInput(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		loopVariableInputLoop : for (InputPin loopVariableInput : getLoopVariableInputs()) {
+		loopVariableInputLoop: for (InputPin loopVariableInput : getLoopVariableInputs()) {
 			if (eClass != null && !eClass.isInstance(loopVariableInput))
 				continue loopVariableInputLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(loopVariableInput.getName())
-				: name.equals(loopVariableInput.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(loopVariableInput.getName()) : name.equals(loopVariableInput.getName())))
 				continue loopVariableInputLoop;
 			if (type != null && !type.equals(loopVariableInput.getType()))
 				continue loopVariableInputLoop;
 			return loopVariableInput;
 		}
-		return createOnDemand && eClass != null
-			? createLoopVariableInput(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createLoopVariableInput(name, type, eClass) : null;
 	}
 
 	/**
@@ -598,8 +543,7 @@
 	 */
 	public boolean validateInputEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LoopNodeOperations.validateInputEdges(this, diagnostics,
-			context);
+		return LoopNodeOperations.validateInputEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -609,8 +553,7 @@
 	 */
 	public boolean validateExecutableNodes(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LoopNodeOperations.validateExecutableNodes(this, diagnostics,
-			context);
+		return LoopNodeOperations.validateExecutableNodes(this, diagnostics, context);
 	}
 
 	/**
@@ -620,8 +563,7 @@
 	 */
 	public boolean validateBodyOutputPins(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LoopNodeOperations.validateBodyOutputPins(this, diagnostics,
-			context);
+		return LoopNodeOperations.validateBodyOutputPins(this, diagnostics, context);
 	}
 
 	/**
@@ -631,8 +573,7 @@
 	 */
 	public boolean validateSetupTestAndBody(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LoopNodeOperations.validateSetupTestAndBody(this, diagnostics,
-			context);
+		return LoopNodeOperations.validateSetupTestAndBody(this, diagnostics, context);
 	}
 
 	/**
@@ -642,8 +583,7 @@
 	 */
 	public boolean validateMatchingOutputPins(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LoopNodeOperations.validateMatchingOutputPins(this, diagnostics,
-			context);
+		return LoopNodeOperations.validateMatchingOutputPins(this, diagnostics, context);
 	}
 
 	/**
@@ -653,8 +593,7 @@
 	 */
 	public boolean validateMatchingLoopVariables(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LoopNodeOperations.validateMatchingLoopVariables(this,
-			diagnostics, context);
+		return LoopNodeOperations.validateMatchingLoopVariables(this, diagnostics, context);
 	}
 
 	/**
@@ -664,8 +603,7 @@
 	 */
 	public boolean validateMatchingResultPins(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LoopNodeOperations.validateMatchingResultPins(this, diagnostics,
-			context);
+		return LoopNodeOperations.validateMatchingResultPins(this, diagnostics, context);
 	}
 
 	/**
@@ -675,8 +613,7 @@
 	 */
 	public boolean validateLoopVariableOutgoing(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LoopNodeOperations.validateLoopVariableOutgoing(this,
-			diagnostics, context);
+		return LoopNodeOperations.validateLoopVariableOutgoing(this, diagnostics, context);
 	}
 
 	/**
@@ -689,11 +626,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Action> result = (EList<Action>) cache.get(this,
-				UMLPackage.Literals.ACTION___ALL_ACTIONS);
+			EList<Action> result = (EList<Action>) cache.get(this, UMLPackage.Literals.ACTION___ALL_ACTIONS);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.ACTION___ALL_ACTIONS,
-					result = LoopNodeOperations.allActions(this));
+				cache.put(this, UMLPackage.Literals.ACTION___ALL_ACTIONS, result = LoopNodeOperations.allActions(this));
 			}
 			return result;
 		}
@@ -717,8 +652,7 @@
 	 */
 	public boolean validateResultNoIncoming(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return LoopNodeOperations.validateResultNoIncoming(this, diagnostics,
-			context);
+		return LoopNodeOperations.validateResultNoIncoming(this, diagnostics, context);
 	}
 
 	/**
@@ -730,70 +664,50 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.LOOP_NODE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LOOP_NODE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LOOP_NODE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.LOOP_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LOOP_NODE__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.LOOP_NODE__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.LOOP_NODE__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.LOOP_NODE__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LOOP_NODE__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.LOOP_NODE__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LOOP_NODE__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LOOP_NODE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LOOP_NODE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LOOP_NODE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LOOP_NODE__EDGE :
-				return ((InternalEList<?>) getEdges()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.LOOP_NODE__STRUCTURED_NODE_INPUT :
-				return ((InternalEList<?>) getStructuredNodeInputs())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LOOP_NODE__STRUCTURED_NODE_OUTPUT :
-				return ((InternalEList<?>) getStructuredNodeOutputs())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LOOP_NODE__VARIABLE :
-				return ((InternalEList<?>) getVariables()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.LOOP_NODE__NODE :
-				return ((InternalEList<?>) getNodes()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.LOOP_NODE__LOOP_VARIABLE :
-				return ((InternalEList<?>) getLoopVariables())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT :
-				return ((InternalEList<?>) getLoopVariableInputs())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.LOOP_NODE__RESULT :
-				return ((InternalEList<?>) getResults()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.LOOP_NODE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.LOOP_NODE__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.LOOP_NODE__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__EDGE:
+			return ((InternalEList<?>) getEdges()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__STRUCTURED_NODE_INPUT:
+			return ((InternalEList<?>) getStructuredNodeInputs()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__STRUCTURED_NODE_OUTPUT:
+			return ((InternalEList<?>) getStructuredNodeOutputs()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__VARIABLE:
+			return ((InternalEList<?>) getVariables()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__NODE:
+			return ((InternalEList<?>) getNodes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__LOOP_VARIABLE:
+			return ((InternalEList<?>) getLoopVariables()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT:
+			return ((InternalEList<?>) getLoopVariableInputs()).basicRemove(otherEnd, msgs);
+		case UMLPackage.LOOP_NODE__RESULT:
+			return ((InternalEList<?>) getResults()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -806,132 +720,132 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.LOOP_NODE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.LOOP_NODE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.LOOP_NODE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.LOOP_NODE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.LOOP_NODE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.LOOP_NODE__NAME :
-				return getName();
-			case UMLPackage.LOOP_NODE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.LOOP_NODE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.LOOP_NODE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LOOP_NODE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.LOOP_NODE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.LOOP_NODE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.LOOP_NODE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.LOOP_NODE__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.LOOP_NODE__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.LOOP_NODE__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.LOOP_NODE__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.LOOP_NODE__INCOMING :
-				return getIncomings();
-			case UMLPackage.LOOP_NODE__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.LOOP_NODE__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.LOOP_NODE__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.LOOP_NODE__HANDLER :
-				return getHandlers();
-			case UMLPackage.LOOP_NODE__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.LOOP_NODE__INPUT :
-				return getInputs();
-			case UMLPackage.LOOP_NODE__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.LOOP_NODE__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.LOOP_NODE__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.LOOP_NODE__OUTPUT :
-				return getOutputs();
-			case UMLPackage.LOOP_NODE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.LOOP_NODE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.LOOP_NODE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.LOOP_NODE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.LOOP_NODE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.LOOP_NODE__MEMBER :
-				return getMembers();
-			case UMLPackage.LOOP_NODE__CONTAINED_EDGE :
-				return getContainedEdges();
-			case UMLPackage.LOOP_NODE__CONTAINED_NODE :
-				return getContainedNodes();
-			case UMLPackage.LOOP_NODE__IN_ACTIVITY :
-				if (resolve)
-					return getInActivity();
-				return basicGetInActivity();
-			case UMLPackage.LOOP_NODE__SUBGROUP :
-				return getSubgroups();
-			case UMLPackage.LOOP_NODE__SUPER_GROUP :
-				if (resolve)
-					return getSuperGroup();
-				return basicGetSuperGroup();
-			case UMLPackage.LOOP_NODE__EDGE :
-				return getEdges();
-			case UMLPackage.LOOP_NODE__MUST_ISOLATE :
-				return isMustIsolate();
-			case UMLPackage.LOOP_NODE__STRUCTURED_NODE_INPUT :
-				return getStructuredNodeInputs();
-			case UMLPackage.LOOP_NODE__STRUCTURED_NODE_OUTPUT :
-				return getStructuredNodeOutputs();
-			case UMLPackage.LOOP_NODE__VARIABLE :
-				return getVariables();
-			case UMLPackage.LOOP_NODE__NODE :
-				return getNodes();
-			case UMLPackage.LOOP_NODE__BODY_OUTPUT :
-				return getBodyOutputs();
-			case UMLPackage.LOOP_NODE__BODY_PART :
-				return getBodyParts();
-			case UMLPackage.LOOP_NODE__DECIDER :
-				if (resolve)
-					return getDecider();
-				return basicGetDecider();
-			case UMLPackage.LOOP_NODE__IS_TESTED_FIRST :
-				return isTestedFirst();
-			case UMLPackage.LOOP_NODE__LOOP_VARIABLE :
-				return getLoopVariables();
-			case UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT :
-				return getLoopVariableInputs();
-			case UMLPackage.LOOP_NODE__RESULT :
-				return getResults();
-			case UMLPackage.LOOP_NODE__SETUP_PART :
-				return getSetupParts();
-			case UMLPackage.LOOP_NODE__TEST :
-				return getTests();
+		case UMLPackage.LOOP_NODE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.LOOP_NODE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.LOOP_NODE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.LOOP_NODE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.LOOP_NODE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.LOOP_NODE__NAME:
+			return getName();
+		case UMLPackage.LOOP_NODE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.LOOP_NODE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.LOOP_NODE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LOOP_NODE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.LOOP_NODE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.LOOP_NODE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.LOOP_NODE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.LOOP_NODE__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.LOOP_NODE__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.LOOP_NODE__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.LOOP_NODE__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.LOOP_NODE__INCOMING:
+			return getIncomings();
+		case UMLPackage.LOOP_NODE__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.LOOP_NODE__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.LOOP_NODE__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.LOOP_NODE__HANDLER:
+			return getHandlers();
+		case UMLPackage.LOOP_NODE__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.LOOP_NODE__INPUT:
+			return getInputs();
+		case UMLPackage.LOOP_NODE__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.LOOP_NODE__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.LOOP_NODE__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.LOOP_NODE__OUTPUT:
+			return getOutputs();
+		case UMLPackage.LOOP_NODE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.LOOP_NODE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.LOOP_NODE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.LOOP_NODE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.LOOP_NODE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.LOOP_NODE__MEMBER:
+			return getMembers();
+		case UMLPackage.LOOP_NODE__CONTAINED_EDGE:
+			return getContainedEdges();
+		case UMLPackage.LOOP_NODE__CONTAINED_NODE:
+			return getContainedNodes();
+		case UMLPackage.LOOP_NODE__IN_ACTIVITY:
+			if (resolve)
+				return getInActivity();
+			return basicGetInActivity();
+		case UMLPackage.LOOP_NODE__SUBGROUP:
+			return getSubgroups();
+		case UMLPackage.LOOP_NODE__SUPER_GROUP:
+			if (resolve)
+				return getSuperGroup();
+			return basicGetSuperGroup();
+		case UMLPackage.LOOP_NODE__EDGE:
+			return getEdges();
+		case UMLPackage.LOOP_NODE__MUST_ISOLATE:
+			return isMustIsolate();
+		case UMLPackage.LOOP_NODE__STRUCTURED_NODE_INPUT:
+			return getStructuredNodeInputs();
+		case UMLPackage.LOOP_NODE__STRUCTURED_NODE_OUTPUT:
+			return getStructuredNodeOutputs();
+		case UMLPackage.LOOP_NODE__VARIABLE:
+			return getVariables();
+		case UMLPackage.LOOP_NODE__NODE:
+			return getNodes();
+		case UMLPackage.LOOP_NODE__BODY_OUTPUT:
+			return getBodyOutputs();
+		case UMLPackage.LOOP_NODE__BODY_PART:
+			return getBodyParts();
+		case UMLPackage.LOOP_NODE__DECIDER:
+			if (resolve)
+				return getDecider();
+			return basicGetDecider();
+		case UMLPackage.LOOP_NODE__IS_TESTED_FIRST:
+			return isTestedFirst();
+		case UMLPackage.LOOP_NODE__LOOP_VARIABLE:
+			return getLoopVariables();
+		case UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT:
+			return getLoopVariableInputs();
+		case UMLPackage.LOOP_NODE__RESULT:
+			return getResults();
+		case UMLPackage.LOOP_NODE__SETUP_PART:
+			return getSetupParts();
+		case UMLPackage.LOOP_NODE__TEST:
+			return getTests();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -945,163 +859,139 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.LOOP_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__IN_ACTIVITY :
-				setInActivity((Activity) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__EDGE :
-				getEdges().clear();
-				getEdges()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__MUST_ISOLATE :
-				setMustIsolate((Boolean) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__STRUCTURED_NODE_INPUT :
-				getStructuredNodeInputs().clear();
-				getStructuredNodeInputs()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__STRUCTURED_NODE_OUTPUT :
-				getStructuredNodeOutputs().clear();
-				getStructuredNodeOutputs()
-					.addAll((Collection<? extends OutputPin>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__VARIABLE :
-				getVariables().clear();
-				getVariables()
-					.addAll((Collection<? extends Variable>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__NODE :
-				getNodes().clear();
-				getNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__BODY_OUTPUT :
-				getBodyOutputs().clear();
-				getBodyOutputs()
-					.addAll((Collection<? extends OutputPin>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__BODY_PART :
-				getBodyParts().clear();
-				getBodyParts()
-					.addAll((Collection<? extends ExecutableNode>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__DECIDER :
-				setDecider((OutputPin) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__IS_TESTED_FIRST :
-				setIsTestedFirst((Boolean) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__LOOP_VARIABLE :
-				getLoopVariables().clear();
-				getLoopVariables()
-					.addAll((Collection<? extends OutputPin>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT :
-				getLoopVariableInputs().clear();
-				getLoopVariableInputs()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__RESULT :
-				getResults().clear();
-				getResults().addAll((Collection<? extends OutputPin>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__SETUP_PART :
-				getSetupParts().clear();
-				getSetupParts()
-					.addAll((Collection<? extends ExecutableNode>) newValue);
-				return;
-			case UMLPackage.LOOP_NODE__TEST :
-				getTests().clear();
-				getTests()
-					.addAll((Collection<? extends ExecutableNode>) newValue);
-				return;
+		case UMLPackage.LOOP_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__IN_ACTIVITY:
+			setInActivity((Activity) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__EDGE:
+			getEdges().clear();
+			getEdges().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__MUST_ISOLATE:
+			setMustIsolate((Boolean) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__STRUCTURED_NODE_INPUT:
+			getStructuredNodeInputs().clear();
+			getStructuredNodeInputs().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__STRUCTURED_NODE_OUTPUT:
+			getStructuredNodeOutputs().clear();
+			getStructuredNodeOutputs().addAll((Collection<? extends OutputPin>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__VARIABLE:
+			getVariables().clear();
+			getVariables().addAll((Collection<? extends Variable>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__NODE:
+			getNodes().clear();
+			getNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__BODY_OUTPUT:
+			getBodyOutputs().clear();
+			getBodyOutputs().addAll((Collection<? extends OutputPin>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__BODY_PART:
+			getBodyParts().clear();
+			getBodyParts().addAll((Collection<? extends ExecutableNode>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__DECIDER:
+			setDecider((OutputPin) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__IS_TESTED_FIRST:
+			setIsTestedFirst((Boolean) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__LOOP_VARIABLE:
+			getLoopVariables().clear();
+			getLoopVariables().addAll((Collection<? extends OutputPin>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT:
+			getLoopVariableInputs().clear();
+			getLoopVariableInputs().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__RESULT:
+			getResults().clear();
+			getResults().addAll((Collection<? extends OutputPin>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__SETUP_PART:
+			getSetupParts().clear();
+			getSetupParts().addAll((Collection<? extends ExecutableNode>) newValue);
+			return;
+		case UMLPackage.LOOP_NODE__TEST:
+			getTests().clear();
+			getTests().addAll((Collection<? extends ExecutableNode>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -1114,114 +1004,114 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LOOP_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.LOOP_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.LOOP_NODE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.LOOP_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.LOOP_NODE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.LOOP_NODE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.LOOP_NODE__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.LOOP_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.LOOP_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.LOOP_NODE__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.LOOP_NODE__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.LOOP_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.LOOP_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.LOOP_NODE__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.LOOP_NODE__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.LOOP_NODE__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.LOOP_NODE__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.LOOP_NODE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.LOOP_NODE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.LOOP_NODE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.LOOP_NODE__IN_ACTIVITY :
-				setInActivity((Activity) null);
-				return;
-			case UMLPackage.LOOP_NODE__EDGE :
-				getEdges().clear();
-				return;
-			case UMLPackage.LOOP_NODE__MUST_ISOLATE :
-				setMustIsolate(MUST_ISOLATE_EDEFAULT);
-				return;
-			case UMLPackage.LOOP_NODE__STRUCTURED_NODE_INPUT :
-				getStructuredNodeInputs().clear();
-				return;
-			case UMLPackage.LOOP_NODE__STRUCTURED_NODE_OUTPUT :
-				getStructuredNodeOutputs().clear();
-				return;
-			case UMLPackage.LOOP_NODE__VARIABLE :
-				getVariables().clear();
-				return;
-			case UMLPackage.LOOP_NODE__NODE :
-				getNodes().clear();
-				return;
-			case UMLPackage.LOOP_NODE__BODY_OUTPUT :
-				getBodyOutputs().clear();
-				return;
-			case UMLPackage.LOOP_NODE__BODY_PART :
-				getBodyParts().clear();
-				return;
-			case UMLPackage.LOOP_NODE__DECIDER :
-				setDecider((OutputPin) null);
-				return;
-			case UMLPackage.LOOP_NODE__IS_TESTED_FIRST :
-				setIsTestedFirst(IS_TESTED_FIRST_EDEFAULT);
-				return;
-			case UMLPackage.LOOP_NODE__LOOP_VARIABLE :
-				getLoopVariables().clear();
-				return;
-			case UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT :
-				getLoopVariableInputs().clear();
-				return;
-			case UMLPackage.LOOP_NODE__RESULT :
-				getResults().clear();
-				return;
-			case UMLPackage.LOOP_NODE__SETUP_PART :
-				getSetupParts().clear();
-				return;
-			case UMLPackage.LOOP_NODE__TEST :
-				getTests().clear();
-				return;
+		case UMLPackage.LOOP_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.LOOP_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.LOOP_NODE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.LOOP_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.LOOP_NODE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.LOOP_NODE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.LOOP_NODE__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.LOOP_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.LOOP_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.LOOP_NODE__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.LOOP_NODE__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.LOOP_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.LOOP_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.LOOP_NODE__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.LOOP_NODE__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.LOOP_NODE__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.LOOP_NODE__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.LOOP_NODE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.LOOP_NODE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.LOOP_NODE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.LOOP_NODE__IN_ACTIVITY:
+			setInActivity((Activity) null);
+			return;
+		case UMLPackage.LOOP_NODE__EDGE:
+			getEdges().clear();
+			return;
+		case UMLPackage.LOOP_NODE__MUST_ISOLATE:
+			setMustIsolate(MUST_ISOLATE_EDEFAULT);
+			return;
+		case UMLPackage.LOOP_NODE__STRUCTURED_NODE_INPUT:
+			getStructuredNodeInputs().clear();
+			return;
+		case UMLPackage.LOOP_NODE__STRUCTURED_NODE_OUTPUT:
+			getStructuredNodeOutputs().clear();
+			return;
+		case UMLPackage.LOOP_NODE__VARIABLE:
+			getVariables().clear();
+			return;
+		case UMLPackage.LOOP_NODE__NODE:
+			getNodes().clear();
+			return;
+		case UMLPackage.LOOP_NODE__BODY_OUTPUT:
+			getBodyOutputs().clear();
+			return;
+		case UMLPackage.LOOP_NODE__BODY_PART:
+			getBodyParts().clear();
+			return;
+		case UMLPackage.LOOP_NODE__DECIDER:
+			setDecider((OutputPin) null);
+			return;
+		case UMLPackage.LOOP_NODE__IS_TESTED_FIRST:
+			setIsTestedFirst(IS_TESTED_FIRST_EDEFAULT);
+			return;
+		case UMLPackage.LOOP_NODE__LOOP_VARIABLE:
+			getLoopVariables().clear();
+			return;
+		case UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT:
+			getLoopVariableInputs().clear();
+			return;
+		case UMLPackage.LOOP_NODE__RESULT:
+			getResults().clear();
+			return;
+		case UMLPackage.LOOP_NODE__SETUP_PART:
+			getSetupParts().clear();
+			return;
+		case UMLPackage.LOOP_NODE__TEST:
+			getTests().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1234,116 +1124,114 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.LOOP_NODE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.LOOP_NODE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.LOOP_NODE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.LOOP_NODE__OWNER :
-				return isSetOwner();
-			case UMLPackage.LOOP_NODE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.LOOP_NODE__NAME :
-				return isSetName();
-			case UMLPackage.LOOP_NODE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.LOOP_NODE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.LOOP_NODE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.LOOP_NODE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.LOOP_NODE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.LOOP_NODE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.LOOP_NODE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.LOOP_NODE__ACTIVITY :
-				return isSetActivity();
-			case UMLPackage.LOOP_NODE__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.LOOP_NODE__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.LOOP_NODE__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.LOOP_NODE__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.LOOP_NODE__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.LOOP_NODE__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.LOOP_NODE__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.LOOP_NODE__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.LOOP_NODE__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.LOOP_NODE__INPUT :
-				return isSetInputs();
-			case UMLPackage.LOOP_NODE__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.LOOP_NODE__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.LOOP_NODE__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.LOOP_NODE__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.LOOP_NODE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.LOOP_NODE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.LOOP_NODE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.LOOP_NODE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.LOOP_NODE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.LOOP_NODE__MEMBER :
-				return isSetMembers();
-			case UMLPackage.LOOP_NODE__CONTAINED_EDGE :
-				return isSetContainedEdges();
-			case UMLPackage.LOOP_NODE__CONTAINED_NODE :
-				return isSetContainedNodes();
-			case UMLPackage.LOOP_NODE__IN_ACTIVITY :
-				return isSetInActivity();
-			case UMLPackage.LOOP_NODE__SUBGROUP :
-				return isSetSubgroups();
-			case UMLPackage.LOOP_NODE__SUPER_GROUP :
-				return isSetSuperGroup();
-			case UMLPackage.LOOP_NODE__EDGE :
-				return !getEdges().isEmpty();
-			case UMLPackage.LOOP_NODE__MUST_ISOLATE :
-				return isMustIsolate() != MUST_ISOLATE_EDEFAULT;
-			case UMLPackage.LOOP_NODE__STRUCTURED_NODE_INPUT :
-				return isSetStructuredNodeInputs();
-			case UMLPackage.LOOP_NODE__STRUCTURED_NODE_OUTPUT :
-				return isSetStructuredNodeOutputs();
-			case UMLPackage.LOOP_NODE__VARIABLE :
-				return !getVariables().isEmpty();
-			case UMLPackage.LOOP_NODE__NODE :
-				return !getNodes().isEmpty();
-			case UMLPackage.LOOP_NODE__BODY_OUTPUT :
-				return !getBodyOutputs().isEmpty();
-			case UMLPackage.LOOP_NODE__BODY_PART :
-				return !getBodyParts().isEmpty();
-			case UMLPackage.LOOP_NODE__DECIDER :
-				return basicGetDecider() != null;
-			case UMLPackage.LOOP_NODE__IS_TESTED_FIRST :
-				return isTestedFirst() != IS_TESTED_FIRST_EDEFAULT;
-			case UMLPackage.LOOP_NODE__LOOP_VARIABLE :
-				return !getLoopVariables().isEmpty();
-			case UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT :
-				return isSetLoopVariableInputs();
-			case UMLPackage.LOOP_NODE__RESULT :
-				return isSetResults();
-			case UMLPackage.LOOP_NODE__SETUP_PART :
-				return !getSetupParts().isEmpty();
-			case UMLPackage.LOOP_NODE__TEST :
-				return !getTests().isEmpty();
+		case UMLPackage.LOOP_NODE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.LOOP_NODE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.LOOP_NODE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.LOOP_NODE__OWNER:
+			return isSetOwner();
+		case UMLPackage.LOOP_NODE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.LOOP_NODE__NAME:
+			return isSetName();
+		case UMLPackage.LOOP_NODE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.LOOP_NODE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.LOOP_NODE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.LOOP_NODE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.LOOP_NODE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.LOOP_NODE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.LOOP_NODE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.LOOP_NODE__ACTIVITY:
+			return isSetActivity();
+		case UMLPackage.LOOP_NODE__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.LOOP_NODE__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.LOOP_NODE__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.LOOP_NODE__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.LOOP_NODE__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.LOOP_NODE__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.LOOP_NODE__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.LOOP_NODE__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.LOOP_NODE__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.LOOP_NODE__INPUT:
+			return isSetInputs();
+		case UMLPackage.LOOP_NODE__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.LOOP_NODE__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.LOOP_NODE__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.LOOP_NODE__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.LOOP_NODE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.LOOP_NODE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.LOOP_NODE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.LOOP_NODE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.LOOP_NODE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.LOOP_NODE__MEMBER:
+			return isSetMembers();
+		case UMLPackage.LOOP_NODE__CONTAINED_EDGE:
+			return isSetContainedEdges();
+		case UMLPackage.LOOP_NODE__CONTAINED_NODE:
+			return isSetContainedNodes();
+		case UMLPackage.LOOP_NODE__IN_ACTIVITY:
+			return isSetInActivity();
+		case UMLPackage.LOOP_NODE__SUBGROUP:
+			return isSetSubgroups();
+		case UMLPackage.LOOP_NODE__SUPER_GROUP:
+			return isSetSuperGroup();
+		case UMLPackage.LOOP_NODE__EDGE:
+			return !getEdges().isEmpty();
+		case UMLPackage.LOOP_NODE__MUST_ISOLATE:
+			return isMustIsolate() != MUST_ISOLATE_EDEFAULT;
+		case UMLPackage.LOOP_NODE__STRUCTURED_NODE_INPUT:
+			return isSetStructuredNodeInputs();
+		case UMLPackage.LOOP_NODE__STRUCTURED_NODE_OUTPUT:
+			return isSetStructuredNodeOutputs();
+		case UMLPackage.LOOP_NODE__VARIABLE:
+			return !getVariables().isEmpty();
+		case UMLPackage.LOOP_NODE__NODE:
+			return !getNodes().isEmpty();
+		case UMLPackage.LOOP_NODE__BODY_OUTPUT:
+			return !getBodyOutputs().isEmpty();
+		case UMLPackage.LOOP_NODE__BODY_PART:
+			return !getBodyParts().isEmpty();
+		case UMLPackage.LOOP_NODE__DECIDER:
+			return basicGetDecider() != null;
+		case UMLPackage.LOOP_NODE__IS_TESTED_FIRST:
+			return isTestedFirst() != IS_TESTED_FIRST_EDEFAULT;
+		case UMLPackage.LOOP_NODE__LOOP_VARIABLE:
+			return !getLoopVariables().isEmpty();
+		case UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT:
+			return isSetLoopVariableInputs();
+		case UMLPackage.LOOP_NODE__RESULT:
+			return isSetResults();
+		case UMLPackage.LOOP_NODE__SETUP_PART:
+			return !getSetupParts().isEmpty();
+		case UMLPackage.LOOP_NODE__TEST:
+			return !getTests().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1358,245 +1246,188 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.LOOP_NODE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.LOOP_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.LOOP_NODE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LOOP_NODE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.LOOP_NODE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.LOOP_NODE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.LOOP_NODE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.LOOP_NODE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.LOOP_NODE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.LOOP_NODE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.LOOP_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LOOP_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.LOOP_NODE___GET_MODEL :
-				return getModel();
-			case UMLPackage.LOOP_NODE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.LOOP_NODE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.LOOP_NODE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.LOOP_NODE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.LOOP_NODE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.LOOP_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.LOOP_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LOOP_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.LOOP_NODE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.LOOP_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.LOOP_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.LOOP_NODE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LOOP_NODE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.LOOP_NODE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.LOOP_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.LOOP_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.LOOP_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.LOOP_NODE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.LOOP_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.LOOP_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.LOOP_NODE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.LOOP_NODE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.LOOP_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.LOOP_NODE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.LOOP_NODE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.LOOP_NODE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.LOOP_NODE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.LOOP_NODE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.LOOP_NODE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.LOOP_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.LOOP_NODE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.LOOP_NODE___SEPARATOR :
-				return separator();
-			case UMLPackage.LOOP_NODE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.LOOP_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.LOOP_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.LOOP_NODE___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.LOOP_NODE___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.LOOP_NODE___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.LOOP_NODE___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.LOOP_NODE___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.LOOP_NODE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.LOOP_NODE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.LOOP_NODE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.LOOP_NODE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.LOOP_NODE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.LOOP_NODE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.LOOP_NODE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.LOOP_NODE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.LOOP_NODE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.LOOP_NODE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.LOOP_NODE___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateNodesAndEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP :
-				return validateNotContained((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_OUTPUT_PIN_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateOutputPinEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_INPUT_PIN_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateInputPinEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___SOURCE_NODES :
-				return sourceNodes();
-			case UMLPackage.LOOP_NODE___TARGET_NODES :
-				return targetNodes();
-			case UMLPackage.LOOP_NODE___VALIDATE_RESULT_NO_INCOMING__DIAGNOSTICCHAIN_MAP :
-				return validateResultNoIncoming(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_INPUT_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateInputEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_EXECUTABLE_NODES__DIAGNOSTICCHAIN_MAP :
-				return validateExecutableNodes(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_BODY_OUTPUT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateBodyOutputPins(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_SETUP_TEST_AND_BODY__DIAGNOSTICCHAIN_MAP :
-				return validateSetupTestAndBody(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_MATCHING_OUTPUT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateMatchingOutputPins(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_MATCHING_LOOP_VARIABLES__DIAGNOSTICCHAIN_MAP :
-				return validateMatchingLoopVariables(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_MATCHING_RESULT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateMatchingResultPins(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.LOOP_NODE___VALIDATE_LOOP_VARIABLE_OUTGOING__DIAGNOSTICCHAIN_MAP :
-				return validateLoopVariableOutgoing(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.LOOP_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.LOOP_NODE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LOOP_NODE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.LOOP_NODE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.LOOP_NODE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.LOOP_NODE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.LOOP_NODE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.LOOP_NODE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.LOOP_NODE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.LOOP_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LOOP_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.LOOP_NODE___GET_MODEL:
+			return getModel();
+		case UMLPackage.LOOP_NODE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.LOOP_NODE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.LOOP_NODE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.LOOP_NODE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.LOOP_NODE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.LOOP_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.LOOP_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LOOP_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.LOOP_NODE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.LOOP_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.LOOP_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.LOOP_NODE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LOOP_NODE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.LOOP_NODE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.LOOP_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.LOOP_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.LOOP_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.LOOP_NODE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.LOOP_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.LOOP_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.LOOP_NODE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.LOOP_NODE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.LOOP_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.LOOP_NODE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.LOOP_NODE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.LOOP_NODE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.LOOP_NODE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.LOOP_NODE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.LOOP_NODE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.LOOP_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.LOOP_NODE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.LOOP_NODE___SEPARATOR:
+			return separator();
+		case UMLPackage.LOOP_NODE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.LOOP_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.LOOP_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.LOOP_NODE___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.LOOP_NODE___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.LOOP_NODE___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.LOOP_NODE___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.LOOP_NODE___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.LOOP_NODE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.LOOP_NODE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.LOOP_NODE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.LOOP_NODE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.LOOP_NODE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.LOOP_NODE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.LOOP_NODE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.LOOP_NODE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.LOOP_NODE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.LOOP_NODE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.LOOP_NODE___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateNodesAndEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP:
+			return validateNotContained((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_OUTPUT_PIN_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateOutputPinEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_INPUT_PIN_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateInputPinEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___SOURCE_NODES:
+			return sourceNodes();
+		case UMLPackage.LOOP_NODE___TARGET_NODES:
+			return targetNodes();
+		case UMLPackage.LOOP_NODE___VALIDATE_RESULT_NO_INCOMING__DIAGNOSTICCHAIN_MAP:
+			return validateResultNoIncoming((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_INPUT_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateInputEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_EXECUTABLE_NODES__DIAGNOSTICCHAIN_MAP:
+			return validateExecutableNodes((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_BODY_OUTPUT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateBodyOutputPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_SETUP_TEST_AND_BODY__DIAGNOSTICCHAIN_MAP:
+			return validateSetupTestAndBody((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_MATCHING_OUTPUT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateMatchingOutputPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_MATCHING_LOOP_VARIABLES__DIAGNOSTICCHAIN_MAP:
+			return validateMatchingLoopVariables((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_MATCHING_RESULT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateMatchingResultPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.LOOP_NODE___VALIDATE_LOOP_VARIABLE_OUTGOING__DIAGNOSTICCHAIN_MAP:
+			return validateLoopVariableOutgoing((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1609,7 +1440,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.LOOP_NODE__LOOP_VARIABLE);
+				|| eIsSet(UMLPackage.LOOP_NODE__LOOP_VARIABLE);
 	}
 
 	/**
@@ -1650,8 +1481,8 @@
 		return false;
 	}
 
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT};
+	protected static final int[] INPUT_ESUBSETS = new int[] {
+			UMLPackage.LOOP_NODE__LOOP_VARIABLE_INPUT };
 
 	@Override
 	public EList<InputPin> getInputs() {
@@ -1660,21 +1491,21 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+					this, UMLPackage.Literals.ACTION__INPUT);
 			if (inputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT,
-					inputs = new DerivedUnionEObjectEList<InputPin>(
-						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>(InputPin.class, this,
-			UMLPackage.LOOP_NODE__INPUT, INPUT_ESUBSETS);
+				UMLPackage.LOOP_NODE__INPUT, INPUT_ESUBSETS);
 	}
 
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.LOOP_NODE__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] {
+			UMLPackage.LOOP_NODE__RESULT };
 
 	@Override
 	public EList<OutputPin> getOutputs() {
@@ -1683,17 +1514,17 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+					this, UMLPackage.Literals.ACTION__OUTPUT);
 			if (outputs == null) {
 				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT,
-					outputs = new DerivedUnionEObjectEList<OutputPin>(
-						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>(OutputPin.class, this,
-			UMLPackage.LOOP_NODE__OUTPUT, OUTPUT_ESUBSETS);
+				UMLPackage.LOOP_NODE__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 } //LoopNodeImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ManifestationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ManifestationImpl.java
index 3cf2326..25f28fb 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ManifestationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ManifestationImpl.java
@@ -1,25 +1,36 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Eike Stepper - 540786
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
 
+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.EStructuralFeature;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectResolvingEList;
+
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Manifestation;
 import org.eclipse.uml2.uml.NamedElement;
@@ -67,17 +78,9 @@
 		return UMLPackage.Literals.MANIFESTATION;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.DEPENDENCY__SUPPLIER) {
 			return createSuppliersList();
 		}
@@ -93,15 +96,13 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<NamedElement> getSuppliers() {
-		return (EList<NamedElement>) eDynamicGet(
-			UMLPackage.MANIFESTATION__SUPPLIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPENDENCY__SUPPLIER, true, true);
+		return (EList<NamedElement>) eDynamicGet(UMLPackage.MANIFESTATION__SUPPLIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPENDENCY__SUPPLIER, true, true);
 	}
 
 	private EList<NamedElement> createSuppliersList() {
 		return new SubsetSupersetEObjectResolvingEList<NamedElement>(
-			NamedElement.class, this, UMLPackage.MANIFESTATION__SUPPLIER, null,
-			SUPPLIER_ESUBSETS);
+				NamedElement.class, this, UMLPackage.MANIFESTATION__SUPPLIER, null,
+				SUPPLIER_ESUBSETS);
 	}
 
 	/**
@@ -112,8 +113,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SUPPLIER_ESUBSETS = new int[]{
-		UMLPackage.MANIFESTATION__UTILIZED_ELEMENT};
+	protected static final int[] SUPPLIER_ESUBSETS = new int[] { UMLPackage.MANIFESTATION__UTILIZED_ELEMENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -121,9 +121,7 @@
 	 * @generated
 	 */
 	public PackageableElement getUtilizedElement() {
-		return (PackageableElement) eDynamicGet(
-			UMLPackage.MANIFESTATION__UTILIZED_ELEMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MANIFESTATION__UTILIZED_ELEMENT, true, true);
+		return (PackageableElement) eDynamicGet(UMLPackage.MANIFESTATION__UTILIZED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MANIFESTATION__UTILIZED_ELEMENT, true, true);
 	}
 
 	/**
@@ -132,9 +130,7 @@
 	 * @generated
 	 */
 	public PackageableElement basicGetUtilizedElement() {
-		return (PackageableElement) eDynamicGet(
-			UMLPackage.MANIFESTATION__UTILIZED_ELEMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MANIFESTATION__UTILIZED_ELEMENT, false, true);
+		return (PackageableElement) eDynamicGet(UMLPackage.MANIFESTATION__UTILIZED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MANIFESTATION__UTILIZED_ELEMENT, false, true);
 	}
 
 	/**
@@ -143,10 +139,7 @@
 	 * @generated
 	 */
 	public void setUtilizedElement(PackageableElement newUtilizedElement) {
-		eDynamicSet(
-			UMLPackage.MANIFESTATION__UTILIZED_ELEMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MANIFESTATION__UTILIZED_ELEMENT,
-			newUtilizedElement);
+		eDynamicSet(UMLPackage.MANIFESTATION__UTILIZED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MANIFESTATION__UTILIZED_ELEMENT, newUtilizedElement);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newUtilizedElement != null) {
@@ -166,58 +159,58 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.MANIFESTATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.MANIFESTATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.MANIFESTATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.MANIFESTATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.MANIFESTATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.MANIFESTATION__NAME :
-				return getName();
-			case UMLPackage.MANIFESTATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.MANIFESTATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.MANIFESTATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.MANIFESTATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.MANIFESTATION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.MANIFESTATION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.MANIFESTATION__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.MANIFESTATION__SOURCE :
-				return getSources();
-			case UMLPackage.MANIFESTATION__TARGET :
-				return getTargets();
-			case UMLPackage.MANIFESTATION__CLIENT :
-				return getClients();
-			case UMLPackage.MANIFESTATION__SUPPLIER :
-				return getSuppliers();
-			case UMLPackage.MANIFESTATION__MAPPING :
-				if (resolve)
-					return getMapping();
-				return basicGetMapping();
-			case UMLPackage.MANIFESTATION__UTILIZED_ELEMENT :
-				if (resolve)
-					return getUtilizedElement();
-				return basicGetUtilizedElement();
+		case UMLPackage.MANIFESTATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.MANIFESTATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.MANIFESTATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.MANIFESTATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.MANIFESTATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.MANIFESTATION__NAME:
+			return getName();
+		case UMLPackage.MANIFESTATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.MANIFESTATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.MANIFESTATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.MANIFESTATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.MANIFESTATION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.MANIFESTATION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.MANIFESTATION__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.MANIFESTATION__SOURCE:
+			return getSources();
+		case UMLPackage.MANIFESTATION__TARGET:
+			return getTargets();
+		case UMLPackage.MANIFESTATION__CLIENT:
+			return getClients();
+		case UMLPackage.MANIFESTATION__SUPPLIER:
+			return getSuppliers();
+		case UMLPackage.MANIFESTATION__MAPPING:
+			if (resolve)
+				return getMapping();
+			return basicGetMapping();
+		case UMLPackage.MANIFESTATION__UTILIZED_ELEMENT:
+			if (resolve)
+				return getUtilizedElement();
+			return basicGetUtilizedElement();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -231,47 +224,43 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.MANIFESTATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.MANIFESTATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.MANIFESTATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.MANIFESTATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.MANIFESTATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.MANIFESTATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.MANIFESTATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.MANIFESTATION__CLIENT :
-				getClients().clear();
-				getClients()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.MANIFESTATION__SUPPLIER :
-				getSuppliers().clear();
-				getSuppliers()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.MANIFESTATION__MAPPING :
-				setMapping((OpaqueExpression) newValue);
-				return;
-			case UMLPackage.MANIFESTATION__UTILIZED_ELEMENT :
-				setUtilizedElement((PackageableElement) newValue);
-				return;
+		case UMLPackage.MANIFESTATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.MANIFESTATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.MANIFESTATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.MANIFESTATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.MANIFESTATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.MANIFESTATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.MANIFESTATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.MANIFESTATION__CLIENT:
+			getClients().clear();
+			getClients().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.MANIFESTATION__SUPPLIER:
+			getSuppliers().clear();
+			getSuppliers().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.MANIFESTATION__MAPPING:
+			setMapping((OpaqueExpression) newValue);
+			return;
+		case UMLPackage.MANIFESTATION__UTILIZED_ELEMENT:
+			setUtilizedElement((PackageableElement) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -284,39 +273,39 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.MANIFESTATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.MANIFESTATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.MANIFESTATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.MANIFESTATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.MANIFESTATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.MANIFESTATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.MANIFESTATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.MANIFESTATION__CLIENT :
-				getClients().clear();
-				return;
-			case UMLPackage.MANIFESTATION__SUPPLIER :
-				getSuppliers().clear();
-				return;
-			case UMLPackage.MANIFESTATION__MAPPING :
-				setMapping((OpaqueExpression) null);
-				return;
-			case UMLPackage.MANIFESTATION__UTILIZED_ELEMENT :
-				setUtilizedElement((PackageableElement) null);
-				return;
+		case UMLPackage.MANIFESTATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.MANIFESTATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.MANIFESTATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.MANIFESTATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.MANIFESTATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.MANIFESTATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.MANIFESTATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.MANIFESTATION__CLIENT:
+			getClients().clear();
+			return;
+		case UMLPackage.MANIFESTATION__SUPPLIER:
+			getSuppliers().clear();
+			return;
+		case UMLPackage.MANIFESTATION__MAPPING:
+			setMapping((OpaqueExpression) null);
+			return;
+		case UMLPackage.MANIFESTATION__UTILIZED_ELEMENT:
+			setUtilizedElement((PackageableElement) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -329,46 +318,44 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.MANIFESTATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.MANIFESTATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.MANIFESTATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.MANIFESTATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.MANIFESTATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.MANIFESTATION__NAME :
-				return isSetName();
-			case UMLPackage.MANIFESTATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.MANIFESTATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.MANIFESTATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.MANIFESTATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.MANIFESTATION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.MANIFESTATION__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.MANIFESTATION__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.MANIFESTATION__SOURCE :
-				return isSetSources();
-			case UMLPackage.MANIFESTATION__TARGET :
-				return isSetTargets();
-			case UMLPackage.MANIFESTATION__CLIENT :
-				return !getClients().isEmpty();
-			case UMLPackage.MANIFESTATION__SUPPLIER :
-				return !getSuppliers().isEmpty();
-			case UMLPackage.MANIFESTATION__MAPPING :
-				return basicGetMapping() != null;
-			case UMLPackage.MANIFESTATION__UTILIZED_ELEMENT :
-				return basicGetUtilizedElement() != null;
+		case UMLPackage.MANIFESTATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.MANIFESTATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.MANIFESTATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.MANIFESTATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.MANIFESTATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.MANIFESTATION__NAME:
+			return isSetName();
+		case UMLPackage.MANIFESTATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.MANIFESTATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.MANIFESTATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.MANIFESTATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.MANIFESTATION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.MANIFESTATION__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.MANIFESTATION__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.MANIFESTATION__SOURCE:
+			return isSetSources();
+		case UMLPackage.MANIFESTATION__TARGET:
+			return isSetTargets();
+		case UMLPackage.MANIFESTATION__CLIENT:
+			return !getClients().isEmpty();
+		case UMLPackage.MANIFESTATION__SUPPLIER:
+			return !getSuppliers().isEmpty();
+		case UMLPackage.MANIFESTATION__MAPPING:
+			return basicGetMapping() != null;
+		case UMLPackage.MANIFESTATION__UTILIZED_ELEMENT:
+			return basicGetUtilizedElement() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MergeNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MergeNodeImpl.java
index 14f230b..d4e4e40 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MergeNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MergeNodeImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -67,8 +67,7 @@
 	 */
 	public boolean validateOneOutgoingEdge(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MergeNodeOperations.validateOneOutgoingEdge(this, diagnostics,
-			context);
+		return MergeNodeOperations.validateOneOutgoingEdge(this, diagnostics, context);
 	}
 
 	/**
@@ -91,151 +90,126 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.MERGE_NODE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.MERGE_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MERGE_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MERGE_NODE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.MERGE_NODE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.MERGE_NODE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.MERGE_NODE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.MERGE_NODE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.MERGE_NODE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.MERGE_NODE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.MERGE_NODE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.MERGE_NODE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.MERGE_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MERGE_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.MERGE_NODE___GET_MODEL :
-				return getModel();
-			case UMLPackage.MERGE_NODE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.MERGE_NODE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.MERGE_NODE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.MERGE_NODE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.MERGE_NODE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.MERGE_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.MERGE_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.MERGE_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.MERGE_NODE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.MERGE_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.MERGE_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.MERGE_NODE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MERGE_NODE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.MERGE_NODE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MERGE_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.MERGE_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.MERGE_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.MERGE_NODE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.MERGE_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.MERGE_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.MERGE_NODE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.MERGE_NODE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.MERGE_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MERGE_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MERGE_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MERGE_NODE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.MERGE_NODE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.MERGE_NODE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.MERGE_NODE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.MERGE_NODE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.MERGE_NODE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.MERGE_NODE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.MERGE_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.MERGE_NODE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.MERGE_NODE___SEPARATOR :
-				return separator();
-			case UMLPackage.MERGE_NODE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.MERGE_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MERGE_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MERGE_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MERGE_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.MERGE_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.MERGE_NODE___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.MERGE_NODE___VALIDATE_ONE_OUTGOING_EDGE__DIAGNOSTICCHAIN_MAP :
-				return validateOneOutgoingEdge(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MERGE_NODE___VALIDATE_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MERGE_NODE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.MERGE_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MERGE_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MERGE_NODE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.MERGE_NODE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.MERGE_NODE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.MERGE_NODE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.MERGE_NODE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.MERGE_NODE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.MERGE_NODE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.MERGE_NODE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.MERGE_NODE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.MERGE_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MERGE_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.MERGE_NODE___GET_MODEL:
+			return getModel();
+		case UMLPackage.MERGE_NODE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.MERGE_NODE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.MERGE_NODE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.MERGE_NODE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.MERGE_NODE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.MERGE_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.MERGE_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.MERGE_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.MERGE_NODE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.MERGE_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.MERGE_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.MERGE_NODE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MERGE_NODE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.MERGE_NODE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MERGE_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.MERGE_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.MERGE_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.MERGE_NODE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.MERGE_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.MERGE_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.MERGE_NODE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.MERGE_NODE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.MERGE_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MERGE_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MERGE_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MERGE_NODE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.MERGE_NODE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.MERGE_NODE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.MERGE_NODE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.MERGE_NODE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.MERGE_NODE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.MERGE_NODE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.MERGE_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.MERGE_NODE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.MERGE_NODE___SEPARATOR:
+			return separator();
+		case UMLPackage.MERGE_NODE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.MERGE_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MERGE_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MERGE_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MERGE_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.MERGE_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.MERGE_NODE___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.MERGE_NODE___VALIDATE_ONE_OUTGOING_EDGE__DIAGNOSTICCHAIN_MAP:
+			return validateOneOutgoingEdge((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MERGE_NODE___VALIDATE_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageEndImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageEndImpl.java
index ccc2e74..ef8458e 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageEndImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageEndImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -15,10 +16,16 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.InteractionFragment;
@@ -74,9 +81,7 @@
 	 * @generated
 	 */
 	public Message getMessage() {
-		return (Message) eDynamicGet(
-			UMLPackage.MESSAGE_END__MESSAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE_END__MESSAGE, true, true);
+		return (Message) eDynamicGet(UMLPackage.MESSAGE_END__MESSAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE_END__MESSAGE, true, true);
 	}
 
 	/**
@@ -85,9 +90,7 @@
 	 * @generated
 	 */
 	public Message basicGetMessage() {
-		return (Message) eDynamicGet(
-			UMLPackage.MESSAGE_END__MESSAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE_END__MESSAGE, false, true);
+		return (Message) eDynamicGet(UMLPackage.MESSAGE_END__MESSAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE_END__MESSAGE, false, true);
 	}
 
 	/**
@@ -96,8 +99,7 @@
 	 * @generated
 	 */
 	public void setMessage(Message newMessage) {
-		eDynamicSet(UMLPackage.MESSAGE_END__MESSAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE_END__MESSAGE, newMessage);
+		eDynamicSet(UMLPackage.MESSAGE_END__MESSAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE_END__MESSAGE, newMessage);
 	}
 
 	/**
@@ -109,11 +111,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<MessageEnd> result = (EList<MessageEnd>) cache.get(this,
-				UMLPackage.Literals.MESSAGE_END___OPPOSITE_END);
+			EList<MessageEnd> result = (EList<MessageEnd>) cache.get(this, UMLPackage.Literals.MESSAGE_END___OPPOSITE_END);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.MESSAGE_END___OPPOSITE_END,
-					result = MessageEndOperations.oppositeEnd(this));
+				cache.put(this, UMLPackage.Literals.MESSAGE_END___OPPOSITE_END, result = MessageEndOperations.oppositeEnd(this));
 			}
 			return result;
 		}
@@ -147,13 +147,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<InteractionFragment> result = (EList<InteractionFragment>) cache
-				.get(this,
-					UMLPackage.Literals.MESSAGE_END___ENCLOSING_FRAGMENT);
+			EList<InteractionFragment> result = (EList<InteractionFragment>) cache.get(this, UMLPackage.Literals.MESSAGE_END___ENCLOSING_FRAGMENT);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.MESSAGE_END___ENCLOSING_FRAGMENT,
-					result = MessageEndOperations.enclosingFragment(this));
+				cache.put(this, UMLPackage.Literals.MESSAGE_END___ENCLOSING_FRAGMENT, result = MessageEndOperations.enclosingFragment(this));
 			}
 			return result;
 		}
@@ -168,36 +164,36 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.MESSAGE_END__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.MESSAGE_END__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.MESSAGE_END__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.MESSAGE_END__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.MESSAGE_END__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.MESSAGE_END__NAME :
-				return getName();
-			case UMLPackage.MESSAGE_END__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.MESSAGE_END__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.MESSAGE_END__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.MESSAGE_END__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.MESSAGE_END__MESSAGE :
-				if (resolve)
-					return getMessage();
-				return basicGetMessage();
+		case UMLPackage.MESSAGE_END__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.MESSAGE_END__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.MESSAGE_END__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.MESSAGE_END__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.MESSAGE_END__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.MESSAGE_END__NAME:
+			return getName();
+		case UMLPackage.MESSAGE_END__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.MESSAGE_END__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.MESSAGE_END__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.MESSAGE_END__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.MESSAGE_END__MESSAGE:
+			if (resolve)
+				return getMessage();
+			return basicGetMessage();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -211,28 +207,26 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.MESSAGE_END__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.MESSAGE_END__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.MESSAGE_END__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.MESSAGE_END__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.MESSAGE_END__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.MESSAGE_END__MESSAGE :
-				setMessage((Message) newValue);
-				return;
+		case UMLPackage.MESSAGE_END__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.MESSAGE_END__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.MESSAGE_END__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.MESSAGE_END__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.MESSAGE_END__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.MESSAGE_END__MESSAGE:
+			setMessage((Message) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -245,24 +239,24 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.MESSAGE_END__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.MESSAGE_END__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.MESSAGE_END__NAME :
-				unsetName();
-				return;
-			case UMLPackage.MESSAGE_END__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.MESSAGE_END__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.MESSAGE_END__MESSAGE :
-				setMessage((Message) null);
-				return;
+		case UMLPackage.MESSAGE_END__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.MESSAGE_END__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.MESSAGE_END__NAME:
+			unsetName();
+			return;
+		case UMLPackage.MESSAGE_END__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.MESSAGE_END__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.MESSAGE_END__MESSAGE:
+			setMessage((Message) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -275,30 +269,28 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.MESSAGE_END__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.MESSAGE_END__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.MESSAGE_END__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.MESSAGE_END__OWNER :
-				return isSetOwner();
-			case UMLPackage.MESSAGE_END__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.MESSAGE_END__NAME :
-				return isSetName();
-			case UMLPackage.MESSAGE_END__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.MESSAGE_END__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.MESSAGE_END__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.MESSAGE_END__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.MESSAGE_END__MESSAGE :
-				return basicGetMessage() != null;
+		case UMLPackage.MESSAGE_END__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.MESSAGE_END__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.MESSAGE_END__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.MESSAGE_END__OWNER:
+			return isSetOwner();
+		case UMLPackage.MESSAGE_END__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.MESSAGE_END__NAME:
+			return isSetName();
+		case UMLPackage.MESSAGE_END__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.MESSAGE_END__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.MESSAGE_END__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.MESSAGE_END__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.MESSAGE_END__MESSAGE:
+			return basicGetMessage() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -313,133 +305,118 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.MESSAGE_END___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.MESSAGE_END___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE_END___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE_END___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.MESSAGE_END___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE_END___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.MESSAGE_END___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.MESSAGE_END___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.MESSAGE_END___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.MESSAGE_END___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.MESSAGE_END___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.MESSAGE_END___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.MESSAGE_END___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MESSAGE_END___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE_END___GET_MODEL :
-				return getModel();
-			case UMLPackage.MESSAGE_END___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.MESSAGE_END___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.MESSAGE_END___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.MESSAGE_END___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.MESSAGE_END___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.MESSAGE_END___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.MESSAGE_END___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.MESSAGE_END___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE_END___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.MESSAGE_END___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.MESSAGE_END___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.MESSAGE_END___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MESSAGE_END___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.MESSAGE_END___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MESSAGE_END___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE_END___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE_END___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE_END___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.MESSAGE_END___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.MESSAGE_END___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE_END___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.MESSAGE_END___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.MESSAGE_END___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE_END___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE_END___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE_END___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.MESSAGE_END___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.MESSAGE_END___GET_LABEL :
-				return getLabel();
-			case UMLPackage.MESSAGE_END___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.MESSAGE_END___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.MESSAGE_END___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.MESSAGE_END___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.MESSAGE_END___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.MESSAGE_END___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.MESSAGE_END___SEPARATOR :
-				return separator();
-			case UMLPackage.MESSAGE_END___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.MESSAGE_END___OPPOSITE_END :
-				return oppositeEnd();
-			case UMLPackage.MESSAGE_END___IS_SEND :
-				return isSend();
-			case UMLPackage.MESSAGE_END___IS_RECEIVE :
-				return isReceive();
-			case UMLPackage.MESSAGE_END___ENCLOSING_FRAGMENT :
-				return enclosingFragment();
+		case UMLPackage.MESSAGE_END___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.MESSAGE_END___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE_END___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE_END___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.MESSAGE_END___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE_END___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.MESSAGE_END___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.MESSAGE_END___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.MESSAGE_END___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.MESSAGE_END___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.MESSAGE_END___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.MESSAGE_END___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.MESSAGE_END___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MESSAGE_END___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE_END___GET_MODEL:
+			return getModel();
+		case UMLPackage.MESSAGE_END___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.MESSAGE_END___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.MESSAGE_END___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.MESSAGE_END___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.MESSAGE_END___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.MESSAGE_END___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.MESSAGE_END___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.MESSAGE_END___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE_END___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.MESSAGE_END___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.MESSAGE_END___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.MESSAGE_END___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MESSAGE_END___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.MESSAGE_END___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MESSAGE_END___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE_END___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE_END___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE_END___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.MESSAGE_END___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.MESSAGE_END___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE_END___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.MESSAGE_END___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.MESSAGE_END___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE_END___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE_END___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE_END___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.MESSAGE_END___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.MESSAGE_END___GET_LABEL:
+			return getLabel();
+		case UMLPackage.MESSAGE_END___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.MESSAGE_END___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.MESSAGE_END___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.MESSAGE_END___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.MESSAGE_END___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.MESSAGE_END___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.MESSAGE_END___SEPARATOR:
+			return separator();
+		case UMLPackage.MESSAGE_END___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.MESSAGE_END___OPPOSITE_END:
+			return oppositeEnd();
+		case UMLPackage.MESSAGE_END___IS_SEND:
+			return isSend();
+		case UMLPackage.MESSAGE_END___IS_RECEIVE:
+			return isReceive();
+		case UMLPackage.MESSAGE_END___ENCLOSING_FRAGMENT:
+			return enclosingFragment();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageEventImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageEventImpl.java
index 8bfcc82..4d7554e 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageEventImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageEventImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageImpl.java
index 225d1a2..caed961 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,8 +29,12 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -127,9 +132,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -143,19 +146,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.MESSAGE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.MESSAGE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.MESSAGE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.MESSAGE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -173,9 +170,7 @@
 	 * @generated
 	 */
 	public MessageSort getMessageSort() {
-		return (MessageSort) eDynamicGet(
-			UMLPackage.MESSAGE__MESSAGE_SORT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__MESSAGE_SORT, true, true);
+		return (MessageSort) eDynamicGet(UMLPackage.MESSAGE__MESSAGE_SORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__MESSAGE_SORT, true, true);
 	}
 
 	/**
@@ -184,8 +179,7 @@
 	 * @generated
 	 */
 	public void setMessageSort(MessageSort newMessageSort) {
-		eDynamicSet(UMLPackage.MESSAGE__MESSAGE_SORT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__MESSAGE_SORT, newMessageSort);
+		eDynamicSet(UMLPackage.MESSAGE__MESSAGE_SORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__MESSAGE_SORT, newMessageSort);
 	}
 
 	/**
@@ -194,9 +188,7 @@
 	 * @generated
 	 */
 	public MessageEnd getReceiveEvent() {
-		return (MessageEnd) eDynamicGet(
-			UMLPackage.MESSAGE__RECEIVE_EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__RECEIVE_EVENT, true, true);
+		return (MessageEnd) eDynamicGet(UMLPackage.MESSAGE__RECEIVE_EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__RECEIVE_EVENT, true, true);
 	}
 
 	/**
@@ -205,9 +197,7 @@
 	 * @generated
 	 */
 	public MessageEnd basicGetReceiveEvent() {
-		return (MessageEnd) eDynamicGet(
-			UMLPackage.MESSAGE__RECEIVE_EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__RECEIVE_EVENT, false, true);
+		return (MessageEnd) eDynamicGet(UMLPackage.MESSAGE__RECEIVE_EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__RECEIVE_EVENT, false, true);
 	}
 
 	/**
@@ -216,8 +206,7 @@
 	 * @generated
 	 */
 	public void setReceiveEvent(MessageEnd newReceiveEvent) {
-		eDynamicSet(UMLPackage.MESSAGE__RECEIVE_EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__RECEIVE_EVENT, newReceiveEvent);
+		eDynamicSet(UMLPackage.MESSAGE__RECEIVE_EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__RECEIVE_EVENT, newReceiveEvent);
 	}
 
 	/**
@@ -226,9 +215,7 @@
 	 * @generated
 	 */
 	public MessageEnd getSendEvent() {
-		return (MessageEnd) eDynamicGet(
-			UMLPackage.MESSAGE__SEND_EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__SEND_EVENT, true, true);
+		return (MessageEnd) eDynamicGet(UMLPackage.MESSAGE__SEND_EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__SEND_EVENT, true, true);
 	}
 
 	/**
@@ -237,9 +224,7 @@
 	 * @generated
 	 */
 	public MessageEnd basicGetSendEvent() {
-		return (MessageEnd) eDynamicGet(
-			UMLPackage.MESSAGE__SEND_EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__SEND_EVENT, false, true);
+		return (MessageEnd) eDynamicGet(UMLPackage.MESSAGE__SEND_EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__SEND_EVENT, false, true);
 	}
 
 	/**
@@ -248,8 +233,7 @@
 	 * @generated
 	 */
 	public void setSendEvent(MessageEnd newSendEvent) {
-		eDynamicSet(UMLPackage.MESSAGE__SEND_EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__SEND_EVENT, newSendEvent);
+		eDynamicSet(UMLPackage.MESSAGE__SEND_EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__SEND_EVENT, newSendEvent);
 	}
 
 	/**
@@ -258,9 +242,7 @@
 	 * @generated
 	 */
 	public Connector getConnector() {
-		return (Connector) eDynamicGet(
-			UMLPackage.MESSAGE__CONNECTOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__CONNECTOR, true, true);
+		return (Connector) eDynamicGet(UMLPackage.MESSAGE__CONNECTOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__CONNECTOR, true, true);
 	}
 
 	/**
@@ -269,9 +251,7 @@
 	 * @generated
 	 */
 	public Connector basicGetConnector() {
-		return (Connector) eDynamicGet(
-			UMLPackage.MESSAGE__CONNECTOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__CONNECTOR, false, true);
+		return (Connector) eDynamicGet(UMLPackage.MESSAGE__CONNECTOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__CONNECTOR, false, true);
 	}
 
 	/**
@@ -280,8 +260,7 @@
 	 * @generated
 	 */
 	public void setConnector(Connector newConnector) {
-		eDynamicSet(UMLPackage.MESSAGE__CONNECTOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__CONNECTOR, newConnector);
+		eDynamicSet(UMLPackage.MESSAGE__CONNECTOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__CONNECTOR, newConnector);
 	}
 
 	/**
@@ -290,9 +269,7 @@
 	 * @generated
 	 */
 	public Interaction getInteraction() {
-		return (Interaction) eDynamicGet(
-			UMLPackage.MESSAGE__INTERACTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__INTERACTION, true, true);
+		return (Interaction) eDynamicGet(UMLPackage.MESSAGE__INTERACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__INTERACTION, true, true);
 	}
 
 	/**
@@ -301,9 +278,7 @@
 	 * @generated
 	 */
 	public Interaction basicGetInteraction() {
-		return (Interaction) eDynamicGet(
-			UMLPackage.MESSAGE__INTERACTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__INTERACTION, false, true);
+		return (Interaction) eDynamicGet(UMLPackage.MESSAGE__INTERACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__INTERACTION, false, true);
 	}
 
 	/**
@@ -313,8 +288,7 @@
 	 */
 	public NotificationChain basicSetInteraction(Interaction newInteraction,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newInteraction,
-			UMLPackage.MESSAGE__INTERACTION, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newInteraction, UMLPackage.MESSAGE__INTERACTION, msgs);
 		return msgs;
 	}
 
@@ -324,8 +298,7 @@
 	 * @generated
 	 */
 	public void setInteraction(Interaction newInteraction) {
-		eDynamicSet(UMLPackage.MESSAGE__INTERACTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__INTERACTION, newInteraction);
+		eDynamicSet(UMLPackage.MESSAGE__INTERACTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__INTERACTION, newInteraction);
 	}
 
 	/**
@@ -335,9 +308,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ValueSpecification> getArguments() {
-		return (EList<ValueSpecification>) eDynamicGet(
-			UMLPackage.MESSAGE__ARGUMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__ARGUMENT, true, true);
+		return (EList<ValueSpecification>) eDynamicGet(UMLPackage.MESSAGE__ARGUMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__ARGUMENT, true, true);
 	}
 
 	/**
@@ -372,20 +343,16 @@
 	 */
 	public ValueSpecification getArgument(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		argumentLoop : for (ValueSpecification argument : getArguments()) {
+		argumentLoop: for (ValueSpecification argument : getArguments()) {
 			if (eClass != null && !eClass.isInstance(argument))
 				continue argumentLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(argument.getName())
-				: name.equals(argument.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(argument.getName()) : name.equals(argument.getName())))
 				continue argumentLoop;
 			if (type != null && !type.equals(argument.getType()))
 				continue argumentLoop;
 			return argument;
 		}
-		return createOnDemand && eClass != null
-			? createArgument(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createArgument(name, type, eClass) : null;
 	}
 
 	/**
@@ -394,9 +361,7 @@
 	 * @generated
 	 */
 	public NamedElement getSignature() {
-		return (NamedElement) eDynamicGet(
-			UMLPackage.MESSAGE__SIGNATURE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__SIGNATURE, true, true);
+		return (NamedElement) eDynamicGet(UMLPackage.MESSAGE__SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__SIGNATURE, true, true);
 	}
 
 	/**
@@ -405,9 +370,7 @@
 	 * @generated
 	 */
 	public NamedElement basicGetSignature() {
-		return (NamedElement) eDynamicGet(
-			UMLPackage.MESSAGE__SIGNATURE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__SIGNATURE, false, true);
+		return (NamedElement) eDynamicGet(UMLPackage.MESSAGE__SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__SIGNATURE, false, true);
 	}
 
 	/**
@@ -416,8 +379,7 @@
 	 * @generated
 	 */
 	public void setSignature(NamedElement newSignature) {
-		eDynamicSet(UMLPackage.MESSAGE__SIGNATURE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE__SIGNATURE, newSignature);
+		eDynamicSet(UMLPackage.MESSAGE__SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE__SIGNATURE, newSignature);
 	}
 
 	/**
@@ -427,8 +389,7 @@
 	 */
 	public boolean validateSendingReceivingMessageEvent(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return MessageOperations.validateSendingReceivingMessageEvent(this,
-			diagnostics, context);
+		return MessageOperations.validateSendingReceivingMessageEvent(this, diagnostics, context);
 	}
 
 	/**
@@ -438,8 +399,7 @@
 	 */
 	public boolean validateSignatureReferTo(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MessageOperations.validateSignatureReferTo(this, diagnostics,
-			context);
+		return MessageOperations.validateSignatureReferTo(this, diagnostics, context);
 	}
 
 	/**
@@ -449,8 +409,7 @@
 	 */
 	public boolean validateSignatureIsOperationRequest(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return MessageOperations.validateSignatureIsOperationRequest(this,
-			diagnostics, context);
+		return MessageOperations.validateSignatureIsOperationRequest(this, diagnostics, context);
 	}
 
 	/**
@@ -460,8 +419,7 @@
 	 */
 	public boolean validateSignatureIsOperationReply(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return MessageOperations.validateSignatureIsOperationReply(this,
-			diagnostics, context);
+		return MessageOperations.validateSignatureIsOperationReply(this, diagnostics, context);
 	}
 
 	/**
@@ -481,8 +439,7 @@
 	 */
 	public boolean validateSignatureIsSignal(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MessageOperations.validateSignatureIsSignal(this, diagnostics,
-			context);
+		return MessageOperations.validateSignatureIsSignal(this, diagnostics, context);
 	}
 
 	/**
@@ -502,8 +459,7 @@
 	 */
 	public boolean validateCannotCrossBoundaries(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MessageOperations.validateCannotCrossBoundaries(this,
-			diagnostics, context);
+		return MessageOperations.validateCannotCrossBoundaries(this, diagnostics, context);
 	}
 
 	/**
@@ -513,8 +469,7 @@
 	 */
 	public boolean validateOccurrenceSpecifications(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MessageOperations.validateOccurrenceSpecifications(this,
-			diagnostics, context);
+		return MessageOperations.validateOccurrenceSpecifications(this, diagnostics, context);
 	}
 
 	/**
@@ -527,13 +482,12 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.MESSAGE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.MESSAGE__INTERACTION :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetInteraction((Interaction) otherEnd, msgs);
+		case UMLPackage.MESSAGE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.MESSAGE__INTERACTION:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetInteraction((Interaction) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -547,19 +501,16 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.MESSAGE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.MESSAGE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.MESSAGE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.MESSAGE__ARGUMENT :
-				return ((InternalEList<?>) getArguments()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.MESSAGE__INTERACTION :
-				return basicSetInteraction(null, msgs);
+		case UMLPackage.MESSAGE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.MESSAGE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.MESSAGE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.MESSAGE__ARGUMENT:
+			return ((InternalEList<?>) getArguments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.MESSAGE__INTERACTION:
+			return basicSetInteraction(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -573,9 +524,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.MESSAGE__INTERACTION :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.INTERACTION__MESSAGE, Interaction.class, msgs);
+		case UMLPackage.MESSAGE__INTERACTION:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.INTERACTION__MESSAGE, Interaction.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -588,58 +538,58 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.MESSAGE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.MESSAGE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.MESSAGE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.MESSAGE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.MESSAGE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.MESSAGE__NAME :
-				return getName();
-			case UMLPackage.MESSAGE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.MESSAGE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.MESSAGE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.MESSAGE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.MESSAGE__ARGUMENT :
-				return getArguments();
-			case UMLPackage.MESSAGE__CONNECTOR :
-				if (resolve)
-					return getConnector();
-				return basicGetConnector();
-			case UMLPackage.MESSAGE__INTERACTION :
-				if (resolve)
-					return getInteraction();
-				return basicGetInteraction();
-			case UMLPackage.MESSAGE__MESSAGE_KIND :
-				return getMessageKind();
-			case UMLPackage.MESSAGE__MESSAGE_SORT :
-				return getMessageSort();
-			case UMLPackage.MESSAGE__RECEIVE_EVENT :
-				if (resolve)
-					return getReceiveEvent();
-				return basicGetReceiveEvent();
-			case UMLPackage.MESSAGE__SEND_EVENT :
-				if (resolve)
-					return getSendEvent();
-				return basicGetSendEvent();
-			case UMLPackage.MESSAGE__SIGNATURE :
-				if (resolve)
-					return getSignature();
-				return basicGetSignature();
+		case UMLPackage.MESSAGE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.MESSAGE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.MESSAGE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.MESSAGE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.MESSAGE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.MESSAGE__NAME:
+			return getName();
+		case UMLPackage.MESSAGE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.MESSAGE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.MESSAGE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.MESSAGE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.MESSAGE__ARGUMENT:
+			return getArguments();
+		case UMLPackage.MESSAGE__CONNECTOR:
+			if (resolve)
+				return getConnector();
+			return basicGetConnector();
+		case UMLPackage.MESSAGE__INTERACTION:
+			if (resolve)
+				return getInteraction();
+			return basicGetInteraction();
+		case UMLPackage.MESSAGE__MESSAGE_KIND:
+			return getMessageKind();
+		case UMLPackage.MESSAGE__MESSAGE_SORT:
+			return getMessageSort();
+		case UMLPackage.MESSAGE__RECEIVE_EVENT:
+			if (resolve)
+				return getReceiveEvent();
+			return basicGetReceiveEvent();
+		case UMLPackage.MESSAGE__SEND_EVENT:
+			if (resolve)
+				return getSendEvent();
+			return basicGetSendEvent();
+		case UMLPackage.MESSAGE__SIGNATURE:
+			if (resolve)
+				return getSignature();
+			return basicGetSignature();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -653,48 +603,45 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.MESSAGE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.MESSAGE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.MESSAGE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.MESSAGE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.MESSAGE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.MESSAGE__ARGUMENT :
-				getArguments().clear();
-				getArguments().addAll(
-					(Collection<? extends ValueSpecification>) newValue);
-				return;
-			case UMLPackage.MESSAGE__CONNECTOR :
-				setConnector((Connector) newValue);
-				return;
-			case UMLPackage.MESSAGE__INTERACTION :
-				setInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.MESSAGE__MESSAGE_SORT :
-				setMessageSort((MessageSort) newValue);
-				return;
-			case UMLPackage.MESSAGE__RECEIVE_EVENT :
-				setReceiveEvent((MessageEnd) newValue);
-				return;
-			case UMLPackage.MESSAGE__SEND_EVENT :
-				setSendEvent((MessageEnd) newValue);
-				return;
-			case UMLPackage.MESSAGE__SIGNATURE :
-				setSignature((NamedElement) newValue);
-				return;
+		case UMLPackage.MESSAGE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.MESSAGE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.MESSAGE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.MESSAGE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.MESSAGE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.MESSAGE__ARGUMENT:
+			getArguments().clear();
+			getArguments().addAll((Collection<? extends ValueSpecification>) newValue);
+			return;
+		case UMLPackage.MESSAGE__CONNECTOR:
+			setConnector((Connector) newValue);
+			return;
+		case UMLPackage.MESSAGE__INTERACTION:
+			setInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.MESSAGE__MESSAGE_SORT:
+			setMessageSort((MessageSort) newValue);
+			return;
+		case UMLPackage.MESSAGE__RECEIVE_EVENT:
+			setReceiveEvent((MessageEnd) newValue);
+			return;
+		case UMLPackage.MESSAGE__SEND_EVENT:
+			setSendEvent((MessageEnd) newValue);
+			return;
+		case UMLPackage.MESSAGE__SIGNATURE:
+			setSignature((NamedElement) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -707,42 +654,42 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.MESSAGE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.MESSAGE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.MESSAGE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.MESSAGE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.MESSAGE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.MESSAGE__ARGUMENT :
-				getArguments().clear();
-				return;
-			case UMLPackage.MESSAGE__CONNECTOR :
-				setConnector((Connector) null);
-				return;
-			case UMLPackage.MESSAGE__INTERACTION :
-				setInteraction((Interaction) null);
-				return;
-			case UMLPackage.MESSAGE__MESSAGE_SORT :
-				setMessageSort(MESSAGE_SORT_EDEFAULT);
-				return;
-			case UMLPackage.MESSAGE__RECEIVE_EVENT :
-				setReceiveEvent((MessageEnd) null);
-				return;
-			case UMLPackage.MESSAGE__SEND_EVENT :
-				setSendEvent((MessageEnd) null);
-				return;
-			case UMLPackage.MESSAGE__SIGNATURE :
-				setSignature((NamedElement) null);
-				return;
+		case UMLPackage.MESSAGE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.MESSAGE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.MESSAGE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.MESSAGE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.MESSAGE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.MESSAGE__ARGUMENT:
+			getArguments().clear();
+			return;
+		case UMLPackage.MESSAGE__CONNECTOR:
+			setConnector((Connector) null);
+			return;
+		case UMLPackage.MESSAGE__INTERACTION:
+			setInteraction((Interaction) null);
+			return;
+		case UMLPackage.MESSAGE__MESSAGE_SORT:
+			setMessageSort(MESSAGE_SORT_EDEFAULT);
+			return;
+		case UMLPackage.MESSAGE__RECEIVE_EVENT:
+			setReceiveEvent((MessageEnd) null);
+			return;
+		case UMLPackage.MESSAGE__SEND_EVENT:
+			setSendEvent((MessageEnd) null);
+			return;
+		case UMLPackage.MESSAGE__SIGNATURE:
+			setSignature((NamedElement) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -755,44 +702,42 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.MESSAGE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.MESSAGE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.MESSAGE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.MESSAGE__OWNER :
-				return isSetOwner();
-			case UMLPackage.MESSAGE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.MESSAGE__NAME :
-				return isSetName();
-			case UMLPackage.MESSAGE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.MESSAGE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.MESSAGE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.MESSAGE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.MESSAGE__ARGUMENT :
-				return !getArguments().isEmpty();
-			case UMLPackage.MESSAGE__CONNECTOR :
-				return basicGetConnector() != null;
-			case UMLPackage.MESSAGE__INTERACTION :
-				return basicGetInteraction() != null;
-			case UMLPackage.MESSAGE__MESSAGE_KIND :
-				return getMessageKind() != MESSAGE_KIND_EDEFAULT;
-			case UMLPackage.MESSAGE__MESSAGE_SORT :
-				return getMessageSort() != MESSAGE_SORT_EDEFAULT;
-			case UMLPackage.MESSAGE__RECEIVE_EVENT :
-				return basicGetReceiveEvent() != null;
-			case UMLPackage.MESSAGE__SEND_EVENT :
-				return basicGetSendEvent() != null;
-			case UMLPackage.MESSAGE__SIGNATURE :
-				return basicGetSignature() != null;
+		case UMLPackage.MESSAGE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.MESSAGE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.MESSAGE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.MESSAGE__OWNER:
+			return isSetOwner();
+		case UMLPackage.MESSAGE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.MESSAGE__NAME:
+			return isSetName();
+		case UMLPackage.MESSAGE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.MESSAGE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.MESSAGE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.MESSAGE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.MESSAGE__ARGUMENT:
+			return !getArguments().isEmpty();
+		case UMLPackage.MESSAGE__CONNECTOR:
+			return basicGetConnector() != null;
+		case UMLPackage.MESSAGE__INTERACTION:
+			return basicGetInteraction() != null;
+		case UMLPackage.MESSAGE__MESSAGE_KIND:
+			return getMessageKind() != MESSAGE_KIND_EDEFAULT;
+		case UMLPackage.MESSAGE__MESSAGE_SORT:
+			return getMessageSort() != MESSAGE_SORT_EDEFAULT;
+		case UMLPackage.MESSAGE__RECEIVE_EVENT:
+			return basicGetReceiveEvent() != null;
+		case UMLPackage.MESSAGE__SEND_EVENT:
+			return basicGetSendEvent() != null;
+		case UMLPackage.MESSAGE__SIGNATURE:
+			return basicGetSignature() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -807,158 +752,128 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.MESSAGE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.MESSAGE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.MESSAGE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.MESSAGE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.MESSAGE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.MESSAGE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.MESSAGE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.MESSAGE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.MESSAGE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.MESSAGE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MESSAGE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE___GET_MODEL :
-				return getModel();
-			case UMLPackage.MESSAGE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.MESSAGE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.MESSAGE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.MESSAGE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.MESSAGE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.MESSAGE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.MESSAGE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.MESSAGE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.MESSAGE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.MESSAGE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.MESSAGE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MESSAGE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.MESSAGE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MESSAGE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.MESSAGE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.MESSAGE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.MESSAGE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.MESSAGE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.MESSAGE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.MESSAGE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.MESSAGE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.MESSAGE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.MESSAGE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.MESSAGE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.MESSAGE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.MESSAGE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.MESSAGE___SEPARATOR :
-				return separator();
-			case UMLPackage.MESSAGE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.MESSAGE___VALIDATE_SENDING_RECEIVING_MESSAGE_EVENT__DIAGNOSTICCHAIN_MAP :
-				return validateSendingReceivingMessageEvent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE___VALIDATE_ARGUMENTS__DIAGNOSTICCHAIN_MAP :
-				return validateArguments((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE___VALIDATE_CANNOT_CROSS_BOUNDARIES__DIAGNOSTICCHAIN_MAP :
-				return validateCannotCrossBoundaries(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE___VALIDATE_SIGNATURE_IS_SIGNAL__DIAGNOSTICCHAIN_MAP :
-				return validateSignatureIsSignal(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE___VALIDATE_OCCURRENCE_SPECIFICATIONS__DIAGNOSTICCHAIN_MAP :
-				return validateOccurrenceSpecifications(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE___VALIDATE_SIGNATURE_REFER_TO__DIAGNOSTICCHAIN_MAP :
-				return validateSignatureReferTo(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE___VALIDATE_SIGNATURE_IS_OPERATION_REQUEST__DIAGNOSTICCHAIN_MAP :
-				return validateSignatureIsOperationRequest(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE___VALIDATE_SIGNATURE_IS_OPERATION_REPLY__DIAGNOSTICCHAIN_MAP :
-				return validateSignatureIsOperationReply(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE___GET_MESSAGE_KIND :
-				return getMessageKind();
+		case UMLPackage.MESSAGE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.MESSAGE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.MESSAGE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.MESSAGE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.MESSAGE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.MESSAGE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.MESSAGE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.MESSAGE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.MESSAGE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.MESSAGE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MESSAGE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE___GET_MODEL:
+			return getModel();
+		case UMLPackage.MESSAGE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.MESSAGE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.MESSAGE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.MESSAGE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.MESSAGE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.MESSAGE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.MESSAGE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.MESSAGE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.MESSAGE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.MESSAGE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.MESSAGE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MESSAGE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.MESSAGE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MESSAGE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.MESSAGE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.MESSAGE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.MESSAGE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.MESSAGE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.MESSAGE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.MESSAGE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.MESSAGE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.MESSAGE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.MESSAGE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.MESSAGE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.MESSAGE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.MESSAGE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.MESSAGE___SEPARATOR:
+			return separator();
+		case UMLPackage.MESSAGE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.MESSAGE___VALIDATE_SENDING_RECEIVING_MESSAGE_EVENT__DIAGNOSTICCHAIN_MAP:
+			return validateSendingReceivingMessageEvent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE___VALIDATE_ARGUMENTS__DIAGNOSTICCHAIN_MAP:
+			return validateArguments((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE___VALIDATE_CANNOT_CROSS_BOUNDARIES__DIAGNOSTICCHAIN_MAP:
+			return validateCannotCrossBoundaries((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE___VALIDATE_SIGNATURE_IS_SIGNAL__DIAGNOSTICCHAIN_MAP:
+			return validateSignatureIsSignal((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE___VALIDATE_OCCURRENCE_SPECIFICATIONS__DIAGNOSTICCHAIN_MAP:
+			return validateOccurrenceSpecifications((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE___VALIDATE_SIGNATURE_REFER_TO__DIAGNOSTICCHAIN_MAP:
+			return validateSignatureReferTo((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE___VALIDATE_SIGNATURE_IS_OPERATION_REQUEST__DIAGNOSTICCHAIN_MAP:
+			return validateSignatureIsOperationRequest((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE___VALIDATE_SIGNATURE_IS_OPERATION_REPLY__DIAGNOSTICCHAIN_MAP:
+			return validateSignatureIsOperationReply((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE___GET_MESSAGE_KIND:
+			return getMessageKind();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -985,7 +900,7 @@
 	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
-			|| eIsSet(UMLPackage.MESSAGE__INTERACTION);
+				|| eIsSet(UMLPackage.MESSAGE__INTERACTION);
 	}
 
 	/**
@@ -996,9 +911,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.MESSAGE__OWNED_COMMENT, UMLPackage.MESSAGE__NAME_EXPRESSION,
-		UMLPackage.MESSAGE__ARGUMENT};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.MESSAGE__OWNED_COMMENT, UMLPackage.MESSAGE__NAME_EXPRESSION, UMLPackage.MESSAGE__ARGUMENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1008,7 +921,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.MESSAGE__ARGUMENT);
+				|| eIsSet(UMLPackage.MESSAGE__ARGUMENT);
 	}
 
 } //MessageImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageOccurrenceSpecificationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageOccurrenceSpecificationImpl.java
index 3c0274c..dec5b2c 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageOccurrenceSpecificationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MessageOccurrenceSpecificationImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -15,10 +16,16 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.GeneralOrdering;
@@ -79,10 +86,7 @@
 	 * @generated
 	 */
 	public Message getMessage() {
-		return (Message) eDynamicGet(
-			UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE_END__MESSAGE, true, true);
+		return (Message) eDynamicGet(UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE_END__MESSAGE, true, true);
 	}
 
 	/**
@@ -91,10 +95,7 @@
 	 * @generated
 	 */
 	public Message basicGetMessage() {
-		return (Message) eDynamicGet(
-			UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE_END__MESSAGE, false, true);
+		return (Message) eDynamicGet(UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE_END__MESSAGE, false, true);
 	}
 
 	/**
@@ -103,10 +104,7 @@
 	 * @generated
 	 */
 	public void setMessage(Message newMessage) {
-		eDynamicSet(
-			UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MESSAGE_END__MESSAGE, newMessage);
+		eDynamicSet(UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MESSAGE_END__MESSAGE, newMessage);
 	}
 
 	/**
@@ -118,11 +116,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<MessageEnd> result = (EList<MessageEnd>) cache.get(this,
-				UMLPackage.Literals.MESSAGE_END___OPPOSITE_END);
+			EList<MessageEnd> result = (EList<MessageEnd>) cache.get(this, UMLPackage.Literals.MESSAGE_END___OPPOSITE_END);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.MESSAGE_END___OPPOSITE_END,
-					result = MessageEndOperations.oppositeEnd(this));
+				cache.put(this, UMLPackage.Literals.MESSAGE_END___OPPOSITE_END, result = MessageEndOperations.oppositeEnd(this));
 			}
 			return result;
 		}
@@ -156,13 +152,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<InteractionFragment> result = (EList<InteractionFragment>) cache
-				.get(this,
-					UMLPackage.Literals.MESSAGE_END___ENCLOSING_FRAGMENT);
+			EList<InteractionFragment> result = (EList<InteractionFragment>) cache.get(this, UMLPackage.Literals.MESSAGE_END___ENCLOSING_FRAGMENT);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.MESSAGE_END___ENCLOSING_FRAGMENT,
-					result = MessageEndOperations.enclosingFragment(this));
+				cache.put(this, UMLPackage.Literals.MESSAGE_END___ENCLOSING_FRAGMENT, result = MessageEndOperations.enclosingFragment(this));
 			}
 			return result;
 		}
@@ -177,52 +169,52 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME :
-				return getName();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__COVERED :
-				return getCovereds();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND :
-				if (resolve)
-					return getEnclosingOperand();
-				return basicGetEnclosingOperand();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
-				if (resolve)
-					return getEnclosingInteraction();
-				return basicGetEnclosingInteraction();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
-				return getGeneralOrderings();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_AFTER :
-				return getToAfters();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				return getToBefores();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE :
-				if (resolve)
-					return getMessage();
-				return basicGetMessage();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME:
+			return getName();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__COVERED:
+			return getCovereds();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND:
+			if (resolve)
+				return getEnclosingOperand();
+			return basicGetEnclosingOperand();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION:
+			if (resolve)
+				return getEnclosingInteraction();
+			return basicGetEnclosingInteraction();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING:
+			return getGeneralOrderings();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_AFTER:
+			return getToAfters();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_BEFORE:
+			return getToBefores();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE:
+			if (resolve)
+				return getMessage();
+			return basicGetMessage();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -236,53 +228,48 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__COVERED :
-				getCovereds().clear();
-				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) newValue);
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				getGeneralOrderings()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_AFTER :
-				getToAfters().clear();
-				getToAfters()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				getToBefores().clear();
-				getToBefores()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE :
-				setMessage((Message) newValue);
-				return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__COVERED:
+			getCovereds().clear();
+			getCovereds().addAll((Collection<? extends Lifeline>) newValue);
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) newValue);
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			getGeneralOrderings().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_AFTER:
+			getToAfters().clear();
+			getToAfters().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_BEFORE:
+			getToBefores().clear();
+			getToBefores().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE:
+			setMessage((Message) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -295,42 +282,42 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__COVERED :
-				getCovereds().clear();
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) null);
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) null);
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_AFTER :
-				getToAfters().clear();
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				getToBefores().clear();
-				return;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE :
-				setMessage((Message) null);
-				return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__COVERED:
+			getCovereds().clear();
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) null);
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) null);
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_AFTER:
+			getToAfters().clear();
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_BEFORE:
+			getToBefores().clear();
+			return;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE:
+			setMessage((Message) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -343,42 +330,40 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME :
-				return isSetName();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__COVERED :
-				return isSetCovereds();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND :
-				return basicGetEnclosingOperand() != null;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
-				return basicGetEnclosingInteraction() != null;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
-				return !getGeneralOrderings().isEmpty();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_AFTER :
-				return !getToAfters().isEmpty();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				return !getToBefores().isEmpty();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE :
-				return basicGetMessage() != null;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME:
+			return isSetName();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__COVERED:
+			return isSetCovereds();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND:
+			return basicGetEnclosingOperand() != null;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION:
+			return basicGetEnclosingInteraction() != null;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__GENERAL_ORDERING:
+			return !getGeneralOrderings().isEmpty();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_AFTER:
+			return !getToAfters().isEmpty();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__TO_BEFORE:
+			return !getToBefores().isEmpty();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE:
+			return basicGetMessage() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -393,10 +378,10 @@
 			Class<?> baseClass) {
 		if (baseClass == MessageEnd.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE :
-					return UMLPackage.MESSAGE_END__MESSAGE;
-				default :
-					return -1;
+			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE:
+				return UMLPackage.MESSAGE_END__MESSAGE;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -412,10 +397,10 @@
 			Class<?> baseClass) {
 		if (baseClass == MessageEnd.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.MESSAGE_END__MESSAGE :
-					return UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE;
-				default :
-					return -1;
+			case UMLPackage.MESSAGE_END__MESSAGE:
+				return UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION__MESSAGE;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -430,16 +415,16 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == MessageEnd.class) {
 			switch (baseOperationID) {
-				case UMLPackage.MESSAGE_END___OPPOSITE_END :
-					return UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___OPPOSITE_END;
-				case UMLPackage.MESSAGE_END___IS_SEND :
-					return UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_SEND;
-				case UMLPackage.MESSAGE_END___IS_RECEIVE :
-					return UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_RECEIVE;
-				case UMLPackage.MESSAGE_END___ENCLOSING_FRAGMENT :
-					return UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___ENCLOSING_FRAGMENT;
-				default :
-					return -1;
+			case UMLPackage.MESSAGE_END___OPPOSITE_END:
+				return UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___OPPOSITE_END;
+			case UMLPackage.MESSAGE_END___IS_SEND:
+				return UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_SEND;
+			case UMLPackage.MESSAGE_END___IS_RECEIVE:
+				return UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_RECEIVE;
+			case UMLPackage.MESSAGE_END___ENCLOSING_FRAGMENT:
+				return UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___ENCLOSING_FRAGMENT;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -455,138 +440,123 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___SEPARATOR :
-				return separator();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_COVERED :
-				return getCovered();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___SET_COVERED__LIFELINE :
-				setCovered((Lifeline) arguments.get(0));
-				return null;
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___OPPOSITE_END :
-				return oppositeEnd();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_SEND :
-				return isSend();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_RECEIVE :
-				return isReceive();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___ENCLOSING_FRAGMENT :
-				return enclosingFragment();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___SEPARATOR:
+			return separator();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___GET_COVERED:
+			return getCovered();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___SET_COVERED__LIFELINE:
+			setCovered((Lifeline) arguments.get(0));
+			return null;
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___OPPOSITE_END:
+			return oppositeEnd();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_SEND:
+			return isSend();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___IS_RECEIVE:
+			return isReceive();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION___ENCLOSING_FRAGMENT:
+			return enclosingFragment();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ModelImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ModelImpl.java
index 68bc324..7d16800 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ModelImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ModelImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,10 +17,14 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
+
 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.impl.ENotificationImpl;
+
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Constraint;
 import org.eclipse.uml2.uml.ElementImport;
@@ -96,9 +100,7 @@
 	 * @generated
 	 */
 	public String getViewpoint() {
-		return (String) eDynamicGet(
-			UMLPackage.MODEL__VIEWPOINT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MODEL__VIEWPOINT, true, true);
+		return (String) eDynamicGet(UMLPackage.MODEL__VIEWPOINT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MODEL__VIEWPOINT, true, true);
 	}
 
 	/**
@@ -107,8 +109,7 @@
 	 * @generated
 	 */
 	public void setViewpoint(String newViewpoint) {
-		eDynamicSet(UMLPackage.MODEL__VIEWPOINT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MODEL__VIEWPOINT, newViewpoint);
+		eDynamicSet(UMLPackage.MODEL__VIEWPOINT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MODEL__VIEWPOINT, newViewpoint);
 	}
 
 	/**
@@ -117,8 +118,7 @@
 	 * @generated
 	 */
 	public void unsetViewpoint() {
-		eDynamicUnset(UMLPackage.MODEL__VIEWPOINT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MODEL__VIEWPOINT);
+		eDynamicUnset(UMLPackage.MODEL__VIEWPOINT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MODEL__VIEWPOINT);
 	}
 
 	/**
@@ -127,9 +127,7 @@
 	 * @generated
 	 */
 	public boolean isSetViewpoint() {
-		return eDynamicIsSet(
-			UMLPackage.MODEL__VIEWPOINT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MODEL__VIEWPOINT);
+		return eDynamicIsSet(UMLPackage.MODEL__VIEWPOINT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MODEL__VIEWPOINT);
 	}
 
 	/**
@@ -149,78 +147,78 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.MODEL__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.MODEL__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.MODEL__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.MODEL__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.MODEL__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.MODEL__NAME :
-				return getName();
-			case UMLPackage.MODEL__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.MODEL__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.MODEL__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.MODEL__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.MODEL__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.MODEL__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.MODEL__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.MODEL__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.MODEL__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.MODEL__MEMBER :
-				return getMembers();
-			case UMLPackage.MODEL__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.MODEL__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.MODEL__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.MODEL__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.MODEL__URI :
-				return getURI();
-			case UMLPackage.MODEL__NESTED_PACKAGE :
-				return getNestedPackages();
-			case UMLPackage.MODEL__NESTING_PACKAGE :
-				if (resolve)
-					return getNestingPackage();
-				return basicGetNestingPackage();
-			case UMLPackage.MODEL__OWNED_STEREOTYPE :
-				return getOwnedStereotypes();
-			case UMLPackage.MODEL__OWNED_TYPE :
-				return getOwnedTypes();
-			case UMLPackage.MODEL__PACKAGE_MERGE :
-				return getPackageMerges();
-			case UMLPackage.MODEL__PACKAGED_ELEMENT :
-				return getPackagedElements();
-			case UMLPackage.MODEL__PROFILE_APPLICATION :
-				return getProfileApplications();
-			case UMLPackage.MODEL__VIEWPOINT :
-				return getViewpoint();
+		case UMLPackage.MODEL__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.MODEL__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.MODEL__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.MODEL__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.MODEL__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.MODEL__NAME:
+			return getName();
+		case UMLPackage.MODEL__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.MODEL__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.MODEL__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.MODEL__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.MODEL__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.MODEL__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.MODEL__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.MODEL__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.MODEL__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.MODEL__MEMBER:
+			return getMembers();
+		case UMLPackage.MODEL__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.MODEL__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.MODEL__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.MODEL__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.MODEL__URI:
+			return getURI();
+		case UMLPackage.MODEL__NESTED_PACKAGE:
+			return getNestedPackages();
+		case UMLPackage.MODEL__NESTING_PACKAGE:
+			if (resolve)
+				return getNestingPackage();
+			return basicGetNestingPackage();
+		case UMLPackage.MODEL__OWNED_STEREOTYPE:
+			return getOwnedStereotypes();
+		case UMLPackage.MODEL__OWNED_TYPE:
+			return getOwnedTypes();
+		case UMLPackage.MODEL__PACKAGE_MERGE:
+			return getPackageMerges();
+		case UMLPackage.MODEL__PACKAGED_ELEMENT:
+			return getPackagedElements();
+		case UMLPackage.MODEL__PROFILE_APPLICATION:
+			return getProfileApplications();
+		case UMLPackage.MODEL__VIEWPOINT:
+			return getViewpoint();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -234,87 +232,77 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.MODEL__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.MODEL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.MODEL__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.MODEL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.MODEL__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.MODEL__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.MODEL__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.MODEL__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.MODEL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.MODEL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.MODEL__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.MODEL__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.MODEL__URI :
-				setURI((String) newValue);
-				return;
-			case UMLPackage.MODEL__NESTED_PACKAGE :
-				getNestedPackages().clear();
-				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__OWNED_TYPE :
-				getOwnedTypes().clear();
-				getOwnedTypes().addAll((Collection<? extends Type>) newValue);
-				return;
-			case UMLPackage.MODEL__PACKAGE_MERGE :
-				getPackageMerges().clear();
-				getPackageMerges()
-					.addAll((Collection<? extends PackageMerge>) newValue);
-				return;
-			case UMLPackage.MODEL__PACKAGED_ELEMENT :
-				getPackagedElements().clear();
-				getPackagedElements().addAll(
-					(Collection<? extends PackageableElement>) newValue);
-				return;
-			case UMLPackage.MODEL__PROFILE_APPLICATION :
-				getProfileApplications().clear();
-				getProfileApplications().addAll(
-					(Collection<? extends ProfileApplication>) newValue);
-				return;
-			case UMLPackage.MODEL__VIEWPOINT :
-				setViewpoint((String) newValue);
-				return;
+		case UMLPackage.MODEL__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.MODEL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.MODEL__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.MODEL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.MODEL__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.MODEL__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.MODEL__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.MODEL__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.MODEL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.MODEL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.MODEL__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.MODEL__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.MODEL__URI:
+			setURI((String) newValue);
+			return;
+		case UMLPackage.MODEL__NESTED_PACKAGE:
+			getNestedPackages().clear();
+			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__OWNED_TYPE:
+			getOwnedTypes().clear();
+			getOwnedTypes().addAll((Collection<? extends Type>) newValue);
+			return;
+		case UMLPackage.MODEL__PACKAGE_MERGE:
+			getPackageMerges().clear();
+			getPackageMerges().addAll((Collection<? extends PackageMerge>) newValue);
+			return;
+		case UMLPackage.MODEL__PACKAGED_ELEMENT:
+			getPackagedElements().clear();
+			getPackagedElements().addAll((Collection<? extends PackageableElement>) newValue);
+			return;
+		case UMLPackage.MODEL__PROFILE_APPLICATION:
+			getProfileApplications().clear();
+			getProfileApplications().addAll((Collection<? extends ProfileApplication>) newValue);
+			return;
+		case UMLPackage.MODEL__VIEWPOINT:
+			setViewpoint((String) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -327,66 +315,66 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.MODEL__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.MODEL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.MODEL__NAME :
-				unsetName();
-				return;
-			case UMLPackage.MODEL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.MODEL__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.MODEL__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.MODEL__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.MODEL__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.MODEL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.MODEL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.MODEL__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.MODEL__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.MODEL__URI :
-				setURI(URI_EDEFAULT);
-				return;
-			case UMLPackage.MODEL__NESTED_PACKAGE :
-				getNestedPackages().clear();
-				return;
-			case UMLPackage.MODEL__NESTING_PACKAGE :
-				setNestingPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.MODEL__OWNED_TYPE :
-				getOwnedTypes().clear();
-				return;
-			case UMLPackage.MODEL__PACKAGE_MERGE :
-				getPackageMerges().clear();
-				return;
-			case UMLPackage.MODEL__PACKAGED_ELEMENT :
-				getPackagedElements().clear();
-				return;
-			case UMLPackage.MODEL__PROFILE_APPLICATION :
-				getProfileApplications().clear();
-				return;
-			case UMLPackage.MODEL__VIEWPOINT :
-				unsetViewpoint();
-				return;
+		case UMLPackage.MODEL__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.MODEL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.MODEL__NAME:
+			unsetName();
+			return;
+		case UMLPackage.MODEL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.MODEL__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.MODEL__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.MODEL__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.MODEL__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.MODEL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.MODEL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.MODEL__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.MODEL__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.MODEL__URI:
+			setURI(URI_EDEFAULT);
+			return;
+		case UMLPackage.MODEL__NESTED_PACKAGE:
+			getNestedPackages().clear();
+			return;
+		case UMLPackage.MODEL__NESTING_PACKAGE:
+			setNestingPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.MODEL__OWNED_TYPE:
+			getOwnedTypes().clear();
+			return;
+		case UMLPackage.MODEL__PACKAGE_MERGE:
+			getPackageMerges().clear();
+			return;
+		case UMLPackage.MODEL__PACKAGED_ELEMENT:
+			getPackagedElements().clear();
+			return;
+		case UMLPackage.MODEL__PROFILE_APPLICATION:
+			getProfileApplications().clear();
+			return;
+		case UMLPackage.MODEL__VIEWPOINT:
+			unsetViewpoint();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -399,68 +387,64 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.MODEL__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.MODEL__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.MODEL__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.MODEL__OWNER :
-				return isSetOwner();
-			case UMLPackage.MODEL__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.MODEL__NAME :
-				return isSetName();
-			case UMLPackage.MODEL__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.MODEL__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.MODEL__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.MODEL__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.MODEL__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.MODEL__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.MODEL__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.MODEL__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.MODEL__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.MODEL__MEMBER :
-				return isSetMembers();
-			case UMLPackage.MODEL__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.MODEL__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.MODEL__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.MODEL__OWNED_TEMPLATE_SIGNATURE :
-				return basicGetOwnedTemplateSignature() != null;
-			case UMLPackage.MODEL__URI :
-				return URI_EDEFAULT == null
-					? getURI() != null
-					: !URI_EDEFAULT.equals(getURI());
-			case UMLPackage.MODEL__NESTED_PACKAGE :
-				return !getNestedPackages().isEmpty();
-			case UMLPackage.MODEL__NESTING_PACKAGE :
-				return basicGetNestingPackage() != null;
-			case UMLPackage.MODEL__OWNED_STEREOTYPE :
-				return !getOwnedStereotypes().isEmpty();
-			case UMLPackage.MODEL__OWNED_TYPE :
-				return !getOwnedTypes().isEmpty();
-			case UMLPackage.MODEL__PACKAGE_MERGE :
-				return !getPackageMerges().isEmpty();
-			case UMLPackage.MODEL__PACKAGED_ELEMENT :
-				return !getPackagedElements().isEmpty();
-			case UMLPackage.MODEL__PROFILE_APPLICATION :
-				return !getProfileApplications().isEmpty();
-			case UMLPackage.MODEL__VIEWPOINT :
-				return isSetViewpoint();
+		case UMLPackage.MODEL__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.MODEL__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.MODEL__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.MODEL__OWNER:
+			return isSetOwner();
+		case UMLPackage.MODEL__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.MODEL__NAME:
+			return isSetName();
+		case UMLPackage.MODEL__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.MODEL__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.MODEL__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.MODEL__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.MODEL__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.MODEL__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.MODEL__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.MODEL__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.MODEL__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.MODEL__MEMBER:
+			return isSetMembers();
+		case UMLPackage.MODEL__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.MODEL__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.MODEL__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.MODEL__OWNED_TEMPLATE_SIGNATURE:
+			return basicGetOwnedTemplateSignature() != null;
+		case UMLPackage.MODEL__URI:
+			return URI_EDEFAULT == null ? getURI() != null : !URI_EDEFAULT.equals(getURI());
+		case UMLPackage.MODEL__NESTED_PACKAGE:
+			return !getNestedPackages().isEmpty();
+		case UMLPackage.MODEL__NESTING_PACKAGE:
+			return basicGetNestingPackage() != null;
+		case UMLPackage.MODEL__OWNED_STEREOTYPE:
+			return !getOwnedStereotypes().isEmpty();
+		case UMLPackage.MODEL__OWNED_TYPE:
+			return !getOwnedTypes().isEmpty();
+		case UMLPackage.MODEL__PACKAGE_MERGE:
+			return !getPackageMerges().isEmpty();
+		case UMLPackage.MODEL__PACKAGED_ELEMENT:
+			return !getPackagedElements().isEmpty();
+		case UMLPackage.MODEL__PROFILE_APPLICATION:
+			return !getProfileApplications().isEmpty();
+		case UMLPackage.MODEL__VIEWPOINT:
+			return isSetViewpoint();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -475,234 +459,198 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.MODEL___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.MODEL___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MODEL___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MODEL___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.MODEL___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.MODEL___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.MODEL___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.MODEL___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.MODEL___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.MODEL___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.MODEL___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.MODEL___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.MODEL___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MODEL___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.MODEL___GET_MODEL :
-				return getModel();
-			case UMLPackage.MODEL___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.MODEL___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.MODEL___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.MODEL___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.MODEL___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.MODEL___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.MODEL___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.MODEL___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.MODEL___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.MODEL___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.MODEL___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.MODEL___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MODEL___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.MODEL___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MODEL___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.MODEL___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.MODEL___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.MODEL___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.MODEL___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.MODEL___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.MODEL___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.MODEL___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.MODEL___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MODEL___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MODEL___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MODEL___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.MODEL___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.MODEL___GET_LABEL :
-				return getLabel();
-			case UMLPackage.MODEL___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.MODEL___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.MODEL___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.MODEL___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.MODEL___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.MODEL___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.MODEL___SEPARATOR :
-				return separator();
-			case UMLPackage.MODEL___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.MODEL___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MODEL___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MODEL___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MODEL___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.MODEL___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.MODEL___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.MODEL___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.MODEL___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.MODEL___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.MODEL___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.MODEL___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.MODEL___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.MODEL___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.MODEL___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.MODEL___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.MODEL___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MODEL___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.MODEL___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.MODEL___VALIDATE_ELEMENTS_PUBLIC_OR_PRIVATE__DIAGNOSTICCHAIN_MAP :
-				return validateElementsPublicOrPrivate(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MODEL___APPLY_PROFILE__PROFILE :
-				return applyProfile((Profile) arguments.get(0));
-			case UMLPackage.MODEL___CREATE_OWNED_CLASS__STRING_BOOLEAN :
-				return createOwnedClass((String) arguments.get(0),
-					(Boolean) arguments.get(1));
-			case UMLPackage.MODEL___CREATE_OWNED_ENUMERATION__STRING :
-				return createOwnedEnumeration((String) arguments.get(0));
-			case UMLPackage.MODEL___CREATE_OWNED_INTERFACE__STRING :
-				return createOwnedInterface((String) arguments.get(0));
-			case UMLPackage.MODEL___CREATE_OWNED_PRIMITIVE_TYPE__STRING :
-				return createOwnedPrimitiveType((String) arguments.get(0));
-			case UMLPackage.MODEL___CREATE_OWNED_STEREOTYPE__STRING_BOOLEAN :
-				return createOwnedStereotype((String) arguments.get(0),
-					(Boolean) arguments.get(1));
-			case UMLPackage.MODEL___GET_ALL_APPLIED_PROFILES :
-				return getAllAppliedProfiles();
-			case UMLPackage.MODEL___GET_ALL_PROFILE_APPLICATIONS :
-				return getAllProfileApplications();
-			case UMLPackage.MODEL___GET_APPLIED_PROFILE__STRING :
-				return getAppliedProfile((String) arguments.get(0));
-			case UMLPackage.MODEL___GET_APPLIED_PROFILE__STRING_BOOLEAN :
-				return getAppliedProfile((String) arguments.get(0),
-					(Boolean) arguments.get(1));
-			case UMLPackage.MODEL___GET_APPLIED_PROFILES :
-				return getAppliedProfiles();
-			case UMLPackage.MODEL___GET_PROFILE_APPLICATION__PROFILE :
-				return getProfileApplication((Profile) arguments.get(0));
-			case UMLPackage.MODEL___GET_PROFILE_APPLICATION__PROFILE_BOOLEAN :
-				return getProfileApplication((Profile) arguments.get(0),
-					(Boolean) arguments.get(1));
-			case UMLPackage.MODEL___IS_MODEL_LIBRARY :
-				return isModelLibrary();
-			case UMLPackage.MODEL___IS_PROFILE_APPLIED__PROFILE :
-				return isProfileApplied((Profile) arguments.get(0));
-			case UMLPackage.MODEL___UNAPPLY_PROFILE__PROFILE :
-				return unapplyProfile((Profile) arguments.get(0));
-			case UMLPackage.MODEL___APPLY_PROFILES__ELIST :
-				return applyProfiles((EList<Profile>) arguments.get(0));
-			case UMLPackage.MODEL___ALL_APPLICABLE_STEREOTYPES :
-				return allApplicableStereotypes();
-			case UMLPackage.MODEL___CONTAINING_PROFILE :
-				return containingProfile();
-			case UMLPackage.MODEL___MAKES_VISIBLE__NAMEDELEMENT :
-				return makesVisible((NamedElement) arguments.get(0));
-			case UMLPackage.MODEL___GET_NESTED_PACKAGES :
-				return getNestedPackages();
-			case UMLPackage.MODEL___GET_OWNED_STEREOTYPES :
-				return getOwnedStereotypes();
-			case UMLPackage.MODEL___GET_OWNED_TYPES :
-				return getOwnedTypes();
-			case UMLPackage.MODEL___VISIBLE_MEMBERS :
-				return visibleMembers();
-			case UMLPackage.MODEL___IS_METAMODEL :
-				return isMetamodel();
+		case UMLPackage.MODEL___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.MODEL___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MODEL___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MODEL___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.MODEL___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.MODEL___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.MODEL___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.MODEL___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.MODEL___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.MODEL___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.MODEL___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.MODEL___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.MODEL___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MODEL___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.MODEL___GET_MODEL:
+			return getModel();
+		case UMLPackage.MODEL___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.MODEL___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.MODEL___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.MODEL___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.MODEL___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.MODEL___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.MODEL___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.MODEL___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.MODEL___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.MODEL___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.MODEL___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.MODEL___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MODEL___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.MODEL___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MODEL___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.MODEL___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.MODEL___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.MODEL___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.MODEL___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.MODEL___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.MODEL___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.MODEL___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.MODEL___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MODEL___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MODEL___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MODEL___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.MODEL___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.MODEL___GET_LABEL:
+			return getLabel();
+		case UMLPackage.MODEL___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.MODEL___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.MODEL___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.MODEL___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.MODEL___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.MODEL___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.MODEL___SEPARATOR:
+			return separator();
+		case UMLPackage.MODEL___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.MODEL___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MODEL___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MODEL___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MODEL___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.MODEL___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.MODEL___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.MODEL___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.MODEL___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.MODEL___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.MODEL___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.MODEL___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.MODEL___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.MODEL___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.MODEL___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.MODEL___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.MODEL___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MODEL___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.MODEL___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.MODEL___VALIDATE_ELEMENTS_PUBLIC_OR_PRIVATE__DIAGNOSTICCHAIN_MAP:
+			return validateElementsPublicOrPrivate((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MODEL___APPLY_PROFILE__PROFILE:
+			return applyProfile((Profile) arguments.get(0));
+		case UMLPackage.MODEL___CREATE_OWNED_CLASS__STRING_BOOLEAN:
+			return createOwnedClass((String) arguments.get(0), (Boolean) arguments.get(1));
+		case UMLPackage.MODEL___CREATE_OWNED_ENUMERATION__STRING:
+			return createOwnedEnumeration((String) arguments.get(0));
+		case UMLPackage.MODEL___CREATE_OWNED_INTERFACE__STRING:
+			return createOwnedInterface((String) arguments.get(0));
+		case UMLPackage.MODEL___CREATE_OWNED_PRIMITIVE_TYPE__STRING:
+			return createOwnedPrimitiveType((String) arguments.get(0));
+		case UMLPackage.MODEL___CREATE_OWNED_STEREOTYPE__STRING_BOOLEAN:
+			return createOwnedStereotype((String) arguments.get(0), (Boolean) arguments.get(1));
+		case UMLPackage.MODEL___GET_ALL_APPLIED_PROFILES:
+			return getAllAppliedProfiles();
+		case UMLPackage.MODEL___GET_ALL_PROFILE_APPLICATIONS:
+			return getAllProfileApplications();
+		case UMLPackage.MODEL___GET_APPLIED_PROFILE__STRING:
+			return getAppliedProfile((String) arguments.get(0));
+		case UMLPackage.MODEL___GET_APPLIED_PROFILE__STRING_BOOLEAN:
+			return getAppliedProfile((String) arguments.get(0), (Boolean) arguments.get(1));
+		case UMLPackage.MODEL___GET_APPLIED_PROFILES:
+			return getAppliedProfiles();
+		case UMLPackage.MODEL___GET_PROFILE_APPLICATION__PROFILE:
+			return getProfileApplication((Profile) arguments.get(0));
+		case UMLPackage.MODEL___GET_PROFILE_APPLICATION__PROFILE_BOOLEAN:
+			return getProfileApplication((Profile) arguments.get(0), (Boolean) arguments.get(1));
+		case UMLPackage.MODEL___IS_MODEL_LIBRARY:
+			return isModelLibrary();
+		case UMLPackage.MODEL___IS_PROFILE_APPLIED__PROFILE:
+			return isProfileApplied((Profile) arguments.get(0));
+		case UMLPackage.MODEL___UNAPPLY_PROFILE__PROFILE:
+			return unapplyProfile((Profile) arguments.get(0));
+		case UMLPackage.MODEL___APPLY_PROFILES__ELIST:
+			return applyProfiles((EList<Profile>) arguments.get(0));
+		case UMLPackage.MODEL___ALL_APPLICABLE_STEREOTYPES:
+			return allApplicableStereotypes();
+		case UMLPackage.MODEL___CONTAINING_PROFILE:
+			return containingProfile();
+		case UMLPackage.MODEL___MAKES_VISIBLE__NAMEDELEMENT:
+			return makesVisible((NamedElement) arguments.get(0));
+		case UMLPackage.MODEL___GET_NESTED_PACKAGES:
+			return getNestedPackages();
+		case UMLPackage.MODEL___GET_OWNED_STEREOTYPES:
+			return getOwnedStereotypes();
+		case UMLPackage.MODEL___GET_OWNED_TYPES:
+			return getOwnedTypes();
+		case UMLPackage.MODEL___VISIBLE_MEMBERS:
+			return visibleMembers();
+		case UMLPackage.MODEL___IS_METAMODEL:
+			return isMetamodel();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MultiplicityElementImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MultiplicityElementImpl.java
index 50521b8..03ef871 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MultiplicityElementImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/MultiplicityElementImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -137,21 +140,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.MULTIPLICITY_ELEMENT__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.MULTIPLICITY_ELEMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.MULTIPLICITY_ELEMENT__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.MULTIPLICITY_ELEMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -160,9 +155,7 @@
 	 * @generated
 	 */
 	public boolean isOrdered() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, true, true);
 	}
 
 	/**
@@ -171,9 +164,7 @@
 	 * @generated
 	 */
 	public void setIsOrdered(boolean newIsOrdered) {
-		eDynamicSet(
-			UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, newIsOrdered);
+		eDynamicSet(UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, newIsOrdered);
 	}
 
 	/**
@@ -182,9 +173,7 @@
 	 * @generated
 	 */
 	public boolean isUnique() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, true, true);
 	}
 
 	/**
@@ -193,9 +182,7 @@
 	 * @generated
 	 */
 	public void setIsUnique(boolean newIsUnique) {
-		eDynamicSet(
-			UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, newIsUnique);
+		eDynamicSet(UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, newIsUnique);
 	}
 
 	/**
@@ -240,10 +227,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getUpperValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, true, true);
 	}
 
 	/**
@@ -252,10 +236,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetUpperValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, false, true);
 	}
 
 	/**
@@ -265,8 +246,7 @@
 	 */
 	public NotificationChain basicSetUpperValue(
 			ValueSpecification newUpperValue, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newUpperValue,
-			UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newUpperValue, UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE, msgs);
 		return msgs;
 	}
 
@@ -276,11 +256,7 @@
 	 * @generated
 	 */
 	public void setUpperValue(ValueSpecification newUpperValue) {
-		eDynamicSet(
-			UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE,
-			newUpperValue);
+		eDynamicSet(UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, newUpperValue);
 	}
 
 	/**
@@ -305,10 +281,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getLowerValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, true, true);
 	}
 
 	/**
@@ -317,10 +290,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetLowerValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, false, true);
 	}
 
 	/**
@@ -330,8 +300,7 @@
 	 */
 	public NotificationChain basicSetLowerValue(
 			ValueSpecification newLowerValue, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newLowerValue,
-			UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newLowerValue, UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE, msgs);
 		return msgs;
 	}
 
@@ -341,11 +310,7 @@
 	 * @generated
 	 */
 	public void setLowerValue(ValueSpecification newLowerValue) {
-		eDynamicSet(
-			UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE,
-			newLowerValue);
+		eDynamicSet(UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, newLowerValue);
 	}
 
 	/**
@@ -371,8 +336,7 @@
 	 */
 	public boolean validateLowerGe0(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations.validateLowerGe0(this, diagnostics,
-			context);
+		return MultiplicityElementOperations.validateLowerGe0(this, diagnostics, context);
 	}
 
 	/**
@@ -382,8 +346,7 @@
 	 */
 	public boolean validateUpperGeLower(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations.validateUpperGeLower(this,
-			diagnostics, context);
+		return MultiplicityElementOperations.validateUpperGeLower(this, diagnostics, context);
 	}
 
 	/**
@@ -393,9 +356,7 @@
 	 */
 	public boolean validateValueSpecificationNoSideEffects(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return MultiplicityElementOperations
-			.validateValueSpecificationNoSideEffects(this, diagnostics,
-				context);
+		return MultiplicityElementOperations.validateValueSpecificationNoSideEffects(this, diagnostics, context);
 	}
 
 	/**
@@ -405,8 +366,7 @@
 	 */
 	public boolean validateValueSpecificationConstant(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return MultiplicityElementOperations
-			.validateValueSpecificationConstant(this, diagnostics, context);
+		return MultiplicityElementOperations.validateValueSpecificationConstant(this, diagnostics, context);
 	}
 
 	/**
@@ -416,8 +376,7 @@
 	 */
 	public boolean validateLowerIsInteger(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations.validateLowerIsInteger(this,
-			diagnostics, context);
+		return MultiplicityElementOperations.validateLowerIsInteger(this, diagnostics, context);
 	}
 
 	/**
@@ -427,8 +386,7 @@
 	 */
 	public boolean validateUpperIsUnlimitedNatural(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations
-			.validateUpperIsUnlimitedNatural(this, diagnostics, context);
+		return MultiplicityElementOperations.validateUpperIsUnlimitedNatural(this, diagnostics, context);
 	}
 
 	/**
@@ -494,16 +452,14 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.MULTIPLICITY_ELEMENT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE :
-				return basicSetLowerValue(null, msgs);
-			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE :
-				return basicSetUpperValue(null, msgs);
+		case UMLPackage.MULTIPLICITY_ELEMENT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE:
+			return basicSetLowerValue(null, msgs);
+		case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE:
+			return basicSetUpperValue(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -516,32 +472,32 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.MULTIPLICITY_ELEMENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.MULTIPLICITY_ELEMENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED :
-				return isOrdered();
-			case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE :
-				return isUnique();
-			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER :
-				return getLower();
-			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE :
-				if (resolve)
-					return getLowerValue();
-				return basicGetLowerValue();
-			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER :
-				return getUpper();
-			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE :
-				if (resolve)
-					return getUpperValue();
-				return basicGetUpperValue();
+		case UMLPackage.MULTIPLICITY_ELEMENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.MULTIPLICITY_ELEMENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED:
+			return isOrdered();
+		case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE:
+			return isUnique();
+		case UMLPackage.MULTIPLICITY_ELEMENT__LOWER:
+			return getLower();
+		case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE:
+			if (resolve)
+				return getLowerValue();
+			return basicGetLowerValue();
+		case UMLPackage.MULTIPLICITY_ELEMENT__UPPER:
+			return getUpper();
+		case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE:
+			if (resolve)
+				return getUpperValue();
+			return basicGetUpperValue();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -555,34 +511,32 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.MULTIPLICITY_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED :
-				setIsOrdered((Boolean) newValue);
-				return;
-			case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE :
-				setIsUnique((Boolean) newValue);
-				return;
-			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER :
-				setLower((Integer) newValue);
-				return;
-			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE :
-				setLowerValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER :
-				setUpper((Integer) newValue);
-				return;
-			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE :
-				setUpperValue((ValueSpecification) newValue);
-				return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED:
+			setIsOrdered((Boolean) newValue);
+			return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE:
+			setIsUnique((Boolean) newValue);
+			return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__LOWER:
+			setLower((Integer) newValue);
+			return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE:
+			setLowerValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__UPPER:
+			setUpper((Integer) newValue);
+			return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE:
+			setUpperValue((ValueSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -595,30 +549,30 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.MULTIPLICITY_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED :
-				setIsOrdered(IS_ORDERED_EDEFAULT);
-				return;
-			case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE :
-				setIsUnique(IS_UNIQUE_EDEFAULT);
-				return;
-			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER :
-				setLower(LOWER_EDEFAULT);
-				return;
-			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE :
-				setLowerValue((ValueSpecification) null);
-				return;
-			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER :
-				setUpper(UPPER_EDEFAULT);
-				return;
-			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE :
-				setUpperValue((ValueSpecification) null);
-				return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED:
+			setIsOrdered(IS_ORDERED_EDEFAULT);
+			return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE:
+			setIsUnique(IS_UNIQUE_EDEFAULT);
+			return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__LOWER:
+			setLower(LOWER_EDEFAULT);
+			return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE:
+			setLowerValue((ValueSpecification) null);
+			return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__UPPER:
+			setUpper(UPPER_EDEFAULT);
+			return;
+		case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE:
+			setUpperValue((ValueSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -631,26 +585,26 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.MULTIPLICITY_ELEMENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.MULTIPLICITY_ELEMENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED :
-				return isOrdered() != IS_ORDERED_EDEFAULT;
-			case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE :
-				return isUnique() != IS_UNIQUE_EDEFAULT;
-			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER :
-				return getLower() != LOWER_EDEFAULT;
-			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE :
-				return basicGetLowerValue() != null;
-			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER :
-				return getUpper() != UPPER_EDEFAULT;
-			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE :
-				return basicGetUpperValue() != null;
+		case UMLPackage.MULTIPLICITY_ELEMENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.MULTIPLICITY_ELEMENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.MULTIPLICITY_ELEMENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED:
+			return isOrdered() != IS_ORDERED_EDEFAULT;
+		case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE:
+			return isUnique() != IS_UNIQUE_EDEFAULT;
+		case UMLPackage.MULTIPLICITY_ELEMENT__LOWER:
+			return getLower() != LOWER_EDEFAULT;
+		case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE:
+			return basicGetLowerValue() != null;
+		case UMLPackage.MULTIPLICITY_ELEMENT__UPPER:
+			return getUpper() != UPPER_EDEFAULT;
+		case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE:
+			return basicGetUpperValue() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -665,136 +619,116 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MULTIPLICITY_ELEMENT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_MODEL :
-				return getModel();
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MULTIPLICITY_ELEMENT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.MULTIPLICITY_ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.MULTIPLICITY_ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.MULTIPLICITY_ELEMENT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-				return validateUpperGeLower((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-				return validateLowerGe0((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationNoSideEffects(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationConstant(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-				return validateLowerIsInteger(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-				return validateUpperIsUnlimitedNatural(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.MULTIPLICITY_ELEMENT___SET_LOWER__INT :
-				setLower((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.MULTIPLICITY_ELEMENT___SET_UPPER__INT :
-				setUpper((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.MULTIPLICITY_ELEMENT___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-				return compatibleWith((MultiplicityElement) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-				return includesMultiplicity(
-					(MultiplicityElement) arguments.get(0));
-			case UMLPackage.MULTIPLICITY_ELEMENT___IS__INT_INT :
-				return is((Integer) arguments.get(0),
-					(Integer) arguments.get(1));
-			case UMLPackage.MULTIPLICITY_ELEMENT___IS_MULTIVALUED :
-				return isMultivalued();
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_LOWER :
-				return getLower();
-			case UMLPackage.MULTIPLICITY_ELEMENT___LOWER_BOUND :
-				return lowerBound();
-			case UMLPackage.MULTIPLICITY_ELEMENT___GET_UPPER :
-				return getUpper();
-			case UMLPackage.MULTIPLICITY_ELEMENT___UPPER_BOUND :
-				return upperBound();
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MULTIPLICITY_ELEMENT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_MODEL:
+			return getModel();
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MULTIPLICITY_ELEMENT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.MULTIPLICITY_ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.MULTIPLICITY_ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.MULTIPLICITY_ELEMENT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+			return validateUpperGeLower((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+			return validateLowerGe0((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationConstant((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+			return validateLowerIsInteger((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+			return validateUpperIsUnlimitedNatural((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.MULTIPLICITY_ELEMENT___SET_LOWER__INT:
+			setLower((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.MULTIPLICITY_ELEMENT___SET_UPPER__INT:
+			setUpper((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.MULTIPLICITY_ELEMENT___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+			return compatibleWith((MultiplicityElement) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+			return includesMultiplicity((MultiplicityElement) arguments.get(0));
+		case UMLPackage.MULTIPLICITY_ELEMENT___IS__INT_INT:
+			return is((Integer) arguments.get(0), (Integer) arguments.get(1));
+		case UMLPackage.MULTIPLICITY_ELEMENT___IS_MULTIVALUED:
+			return isMultivalued();
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_LOWER:
+			return getLower();
+		case UMLPackage.MULTIPLICITY_ELEMENT___LOWER_BOUND:
+			return lowerBound();
+		case UMLPackage.MULTIPLICITY_ELEMENT___GET_UPPER:
+			return getUpper();
+		case UMLPackage.MULTIPLICITY_ELEMENT___UPPER_BOUND:
+			return upperBound();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -807,10 +741,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.MULTIPLICITY_ELEMENT__OWNED_COMMENT,
-		UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE,
-		UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.MULTIPLICITY_ELEMENT__OWNED_COMMENT, UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE, UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -820,8 +751,8 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE)
-			|| eIsSet(UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE);
+				|| eIsSet(UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE)
+				|| eIsSet(UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE);
 	}
 
 } //MultiplicityElementImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/NamedElementImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/NamedElementImpl.java
index 1991a27..bc2b09f 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/NamedElementImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/NamedElementImpl.java
@@ -1,15 +1,15 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
  *   Sergey Boyko (Borland) - 282440
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -19,6 +19,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -32,6 +33,8 @@
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -116,7 +119,7 @@
 	 * @ordered
 	 */
 	protected static final VisibilityKind[] VISIBILITY_EFLAG_VALUES = VisibilityKind
-		.values();
+			.values();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -148,20 +151,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.NAMED_ELEMENT__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.NAMED_ELEMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.NAMED_ELEMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.NAMED_ELEMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -170,9 +166,7 @@
 	 * @generated
 	 */
 	public String getName() {
-		return (String) eDynamicGet(
-			UMLPackage.NAMED_ELEMENT__NAME - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__NAME, true, true);
+		return (String) eDynamicGet(UMLPackage.NAMED_ELEMENT__NAME - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__NAME, true, true);
 	}
 
 	/**
@@ -181,8 +175,7 @@
 	 * @generated
 	 */
 	public void setName(String newName) {
-		eDynamicSet(UMLPackage.NAMED_ELEMENT__NAME - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__NAME, newName);
+		eDynamicSet(UMLPackage.NAMED_ELEMENT__NAME - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__NAME, newName);
 	}
 
 	/**
@@ -191,8 +184,7 @@
 	 * @generated
 	 */
 	public void unsetName() {
-		eDynamicUnset(UMLPackage.NAMED_ELEMENT__NAME - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__NAME);
+		eDynamicUnset(UMLPackage.NAMED_ELEMENT__NAME - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__NAME);
 	}
 
 	/**
@@ -201,9 +193,7 @@
 	 * @generated
 	 */
 	public boolean isSetName() {
-		return eDynamicIsSet(
-			UMLPackage.NAMED_ELEMENT__NAME - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__NAME);
+		return eDynamicIsSet(UMLPackage.NAMED_ELEMENT__NAME - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__NAME);
 	}
 
 	/**
@@ -212,9 +202,7 @@
 	 * @generated
 	 */
 	public VisibilityKind getVisibility() {
-		return (VisibilityKind) eDynamicGet(
-			UMLPackage.NAMED_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, true, true);
+		return (VisibilityKind) eDynamicGet(UMLPackage.NAMED_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, true, true);
 	}
 
 	/**
@@ -223,9 +211,7 @@
 	 * @generated
 	 */
 	public void setVisibility(VisibilityKind newVisibility) {
-		eDynamicSet(
-			UMLPackage.NAMED_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, newVisibility);
+		eDynamicSet(UMLPackage.NAMED_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, newVisibility);
 	}
 
 	/**
@@ -234,9 +220,7 @@
 	 * @generated
 	 */
 	public void unsetVisibility() {
-		eDynamicUnset(
-			UMLPackage.NAMED_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
+		eDynamicUnset(UMLPackage.NAMED_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
 	}
 
 	/**
@@ -245,9 +229,7 @@
 	 * @generated
 	 */
 	public boolean isSetVisibility() {
-		return eDynamicIsSet(
-			UMLPackage.NAMED_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
+		return eDynamicIsSet(UMLPackage.NAMED_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
 	}
 
 	/**
@@ -268,13 +250,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Dependency> result = (EList<Dependency>) cache.get(this,
-				UMLPackage.Literals.NAMED_ELEMENT__CLIENT_DEPENDENCY);
+			EList<Dependency> result = (EList<Dependency>) cache.get(this, UMLPackage.Literals.NAMED_ELEMENT__CLIENT_DEPENDENCY);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.NAMED_ELEMENT__CLIENT_DEPENDENCY,
-					result = NamedElementOperations
-						.getClientDependencies(this));
+				cache.put(this, UMLPackage.Literals.NAMED_ELEMENT__CLIENT_DEPENDENCY, result = NamedElementOperations.getClientDependencies(this));
 			}
 			return result;
 		}
@@ -297,12 +275,10 @@
 	 */
 	public Dependency getClientDependency(String name, boolean ignoreCase,
 			EClass eClass) {
-		clientDependencyLoop : for (Dependency clientDependency : getClientDependencies()) {
+		clientDependencyLoop: for (Dependency clientDependency : getClientDependencies()) {
 			if (eClass != null && !eClass.isInstance(clientDependency))
 				continue clientDependencyLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(clientDependency.getName())
-				: name.equals(clientDependency.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(clientDependency.getName()) : name.equals(clientDependency.getName())))
 				continue clientDependencyLoop;
 			return clientDependency;
 		}
@@ -315,9 +291,7 @@
 	 * @generated
 	 */
 	public StringExpression getNameExpression() {
-		return (StringExpression) eDynamicGet(
-			UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__NAME_EXPRESSION, true, true);
+		return (StringExpression) eDynamicGet(UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__NAME_EXPRESSION, true, true);
 	}
 
 	/**
@@ -326,9 +300,7 @@
 	 * @generated
 	 */
 	public StringExpression basicGetNameExpression() {
-		return (StringExpression) eDynamicGet(
-			UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__NAME_EXPRESSION, false, true);
+		return (StringExpression) eDynamicGet(UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__NAME_EXPRESSION, false, true);
 	}
 
 	/**
@@ -338,8 +310,7 @@
 	 */
 	public NotificationChain basicSetNameExpression(
 			StringExpression newNameExpression, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newNameExpression,
-			UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newNameExpression, UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION, msgs);
 		return msgs;
 	}
 
@@ -349,10 +320,7 @@
 	 * @generated
 	 */
 	public void setNameExpression(StringExpression newNameExpression) {
-		eDynamicSet(
-			UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__NAME_EXPRESSION,
-			newNameExpression);
+		eDynamicSet(UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__NAME_EXPRESSION, newNameExpression);
 	}
 
 	/**
@@ -361,8 +329,7 @@
 	 * @generated
 	 */
 	public StringExpression createNameExpression(String name, Type type) {
-		StringExpression newNameExpression = (StringExpression) create(
-			UMLPackage.Literals.STRING_EXPRESSION);
+		StringExpression newNameExpression = (StringExpression) create(UMLPackage.Literals.STRING_EXPRESSION);
 		setNameExpression(newNameExpression);
 		if (name != null)
 			newNameExpression.setName(name);
@@ -378,8 +345,7 @@
 	 */
 	public boolean validateHasNoQualifiedName(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return NamedElementOperations.validateHasNoQualifiedName(this,
-			diagnostics, context);
+		return NamedElementOperations.validateHasNoQualifiedName(this, diagnostics, context);
 	}
 
 	/**
@@ -389,8 +355,7 @@
 	 */
 	public boolean validateHasQualifiedName(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return NamedElementOperations.validateHasQualifiedName(this,
-			diagnostics, context);
+		return NamedElementOperations.validateHasQualifiedName(this, diagnostics, context);
 	}
 
 	/**
@@ -400,8 +365,7 @@
 	 */
 	public boolean validateVisibilityNeedsOwnership(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return NamedElementOperations.validateVisibilityNeedsOwnership(this,
-			diagnostics, context);
+		return NamedElementOperations.validateVisibilityNeedsOwnership(this, diagnostics, context);
 	}
 
 	/**
@@ -450,12 +414,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Namespace> result = (EList<Namespace>) cache.get(this,
-				UMLPackage.Literals.NAMED_ELEMENT___ALL_NAMESPACES);
+			EList<Namespace> result = (EList<Namespace>) cache.get(this, UMLPackage.Literals.NAMED_ELEMENT___ALL_NAMESPACES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.NAMED_ELEMENT___ALL_NAMESPACES,
-					result = NamedElementOperations.allNamespaces(this));
+				cache.put(this, UMLPackage.Literals.NAMED_ELEMENT___ALL_NAMESPACES, result = NamedElementOperations.allNamespaces(this));
 			}
 			return result;
 		}
@@ -489,13 +450,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<org.eclipse.uml2.uml.Package> result = (EList<org.eclipse.uml2.uml.Package>) cache
-				.get(this,
-					UMLPackage.Literals.NAMED_ELEMENT___ALL_OWNING_PACKAGES);
+			EList<org.eclipse.uml2.uml.Package> result = (EList<org.eclipse.uml2.uml.Package>) cache.get(this, UMLPackage.Literals.NAMED_ELEMENT___ALL_OWNING_PACKAGES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.NAMED_ELEMENT___ALL_OWNING_PACKAGES,
-					result = NamedElementOperations.allOwningPackages(this));
+				cache.put(this, UMLPackage.Literals.NAMED_ELEMENT___ALL_OWNING_PACKAGES, result = NamedElementOperations.allOwningPackages(this));
 			}
 			return result;
 		}
@@ -511,14 +468,12 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.NAMED_ELEMENT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NAMED_ELEMENT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
+		case UMLPackage.NAMED_ELEMENT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NAMED_ELEMENT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -531,32 +486,32 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.NAMED_ELEMENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.NAMED_ELEMENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.NAMED_ELEMENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.NAMED_ELEMENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.NAMED_ELEMENT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.NAMED_ELEMENT__NAME :
-				return getName();
-			case UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.NAMED_ELEMENT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.NAMED_ELEMENT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.NAMED_ELEMENT__VISIBILITY :
-				return getVisibility();
+		case UMLPackage.NAMED_ELEMENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.NAMED_ELEMENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.NAMED_ELEMENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.NAMED_ELEMENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.NAMED_ELEMENT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.NAMED_ELEMENT__NAME:
+			return getName();
+		case UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.NAMED_ELEMENT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.NAMED_ELEMENT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.NAMED_ELEMENT__VISIBILITY:
+			return getVisibility();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -570,25 +525,23 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.NAMED_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.NAMED_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.NAMED_ELEMENT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.NAMED_ELEMENT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
+		case UMLPackage.NAMED_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.NAMED_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.NAMED_ELEMENT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.NAMED_ELEMENT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -601,21 +554,21 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.NAMED_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.NAMED_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.NAMED_ELEMENT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.NAMED_ELEMENT__VISIBILITY :
-				unsetVisibility();
-				return;
+		case UMLPackage.NAMED_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.NAMED_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.NAMED_ELEMENT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.NAMED_ELEMENT__VISIBILITY:
+			unsetVisibility();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -628,28 +581,26 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.NAMED_ELEMENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.NAMED_ELEMENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.NAMED_ELEMENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.NAMED_ELEMENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.NAMED_ELEMENT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.NAMED_ELEMENT__NAME :
-				return isSetName();
-			case UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.NAMED_ELEMENT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.NAMED_ELEMENT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.NAMED_ELEMENT__VISIBILITY :
-				return isSetVisibility();
+		case UMLPackage.NAMED_ELEMENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.NAMED_ELEMENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.NAMED_ELEMENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.NAMED_ELEMENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.NAMED_ELEMENT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.NAMED_ELEMENT__NAME:
+			return isSetName();
+		case UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.NAMED_ELEMENT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.NAMED_ELEMENT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.NAMED_ELEMENT__VISIBILITY:
+			return isSetVisibility();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -664,125 +615,110 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.NAMED_ELEMENT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NAMED_ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NAMED_ELEMENT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.NAMED_ELEMENT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.NAMED_ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.NAMED_ELEMENT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.NAMED_ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.NAMED_ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___GET_MODEL :
-				return getModel();
-			case UMLPackage.NAMED_ELEMENT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.NAMED_ELEMENT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.NAMED_ELEMENT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.NAMED_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.NAMED_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.NAMED_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.NAMED_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.NAMED_ELEMENT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.NAMED_ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.NAMED_ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.NAMED_ELEMENT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.NAMED_ELEMENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NAMED_ELEMENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NAMED_ELEMENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NAMED_ELEMENT___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___GET_LABEL :
-				return getLabel();
-			case UMLPackage.NAMED_ELEMENT___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.NAMED_ELEMENT___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.NAMED_ELEMENT___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.NAMED_ELEMENT___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.NAMED_ELEMENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.NAMED_ELEMENT___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.NAMED_ELEMENT___SEPARATOR :
-				return separator();
-			case UMLPackage.NAMED_ELEMENT___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
+		case UMLPackage.NAMED_ELEMENT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NAMED_ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NAMED_ELEMENT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.NAMED_ELEMENT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.NAMED_ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.NAMED_ELEMENT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.NAMED_ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.NAMED_ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___GET_MODEL:
+			return getModel();
+		case UMLPackage.NAMED_ELEMENT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.NAMED_ELEMENT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.NAMED_ELEMENT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.NAMED_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.NAMED_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.NAMED_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.NAMED_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.NAMED_ELEMENT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.NAMED_ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.NAMED_ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.NAMED_ELEMENT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.NAMED_ELEMENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NAMED_ELEMENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NAMED_ELEMENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NAMED_ELEMENT___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___GET_LABEL:
+			return getLabel();
+		case UMLPackage.NAMED_ELEMENT___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.NAMED_ELEMENT___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.NAMED_ELEMENT___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.NAMED_ELEMENT___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.NAMED_ELEMENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.NAMED_ELEMENT___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.NAMED_ELEMENT___SEPARATOR:
+			return separator();
+		case UMLPackage.NAMED_ELEMENT___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -804,9 +740,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -816,9 +750,7 @@
 	 */
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -854,7 +786,8 @@
 	 */
 	@Override
 	public boolean isSetOwner() {
-		return super.isSetOwner() || isSetNamespace();
+		return super.isSetOwner()
+				|| isSetNamespace();
 	}
 
 	/**
@@ -865,9 +798,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.NAMED_ELEMENT__OWNED_COMMENT,
-		UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.NAMED_ELEMENT__OWNED_COMMENT, UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -877,7 +808,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION);
+				|| eIsSet(UMLPackage.NAMED_ELEMENT__NAME_EXPRESSION);
 	}
 
 	@Override
@@ -897,7 +828,7 @@
 					} else if (otherEObject instanceof NamedElement) {
 
 						if (name
-							.equals(((NamedElement) otherEObject).getName())) {
+								.equals(((NamedElement) otherEObject).getName())) {
 
 							count++;
 						}
@@ -906,8 +837,8 @@
 
 				name = URI.encodeSegment(name, true);
 				return count > 0
-					? name + '.' + count
-					: name;
+						? name + '.' + count
+						: name;
 			}
 		}
 
@@ -928,14 +859,14 @@
 				//
 				int index = uriFragmentSegment.lastIndexOf("."); //$NON-NLS-1$
 				String name = index == -1
-					? uriFragmentSegment
-					: uriFragmentSegment.substring(0, index);
+						? uriFragmentSegment
+						: uriFragmentSegment.substring(0, index);
 				int count = 0;
 
 				if (index != -1) {
 					try {
 						count = Integer
-							.parseInt(uriFragmentSegment.substring(index + 1));
+								.parseInt(uriFragmentSegment.substring(index + 1));
 					} catch (NumberFormatException exception) {
 						// Interpret it as part of the name.
 						//
@@ -953,7 +884,7 @@
 						NamedElement namedElement = (NamedElement) eObject;
 
 						if (name.equals(namedElement.getName())
-							&& count-- == 0) {
+								&& count-- == 0) {
 							return namedElement;
 						}
 					}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/NamespaceImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/NamespaceImpl.java
index c30d16b..720e1c0 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/NamespaceImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/NamespaceImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -29,6 +29,7 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -102,20 +103,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.NAMESPACE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.NAMESPACE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.NAMESPACE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.NAMESPACE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -129,19 +123,19 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+					eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
-					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.NAMESPACE__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+						UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
+						ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
+								NamedElement.class, this,
+								UMLPackage.NAMESPACE__OWNED_MEMBER,
+								OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
 		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.NAMESPACE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+				this, UMLPackage.NAMESPACE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -154,19 +148,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> members = (EList<NamedElement>) cache
-				.get(eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER);
+			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>(
-						NamedElement.class, this, UMLPackage.NAMESPACE__MEMBER,
-						MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER, members = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.NAMESPACE__MEMBER, MEMBER_ESUBSETS));
 			}
 			return members;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.NAMESPACE__MEMBER, MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.NAMESPACE__MEMBER, MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -176,9 +164,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ElementImport> getElementImports() {
-		return (EList<ElementImport>) eDynamicGet(
-			UMLPackage.NAMESPACE__ELEMENT_IMPORT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMESPACE__ELEMENT_IMPORT, true, true);
+		return (EList<ElementImport>) eDynamicGet(UMLPackage.NAMESPACE__ELEMENT_IMPORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMESPACE__ELEMENT_IMPORT, true, true);
 	}
 
 	/**
@@ -188,8 +174,7 @@
 	 */
 	public ElementImport createElementImport(
 			PackageableElement importedElement) {
-		ElementImport newElementImport = (ElementImport) create(
-			UMLPackage.Literals.ELEMENT_IMPORT);
+		ElementImport newElementImport = (ElementImport) create(UMLPackage.Literals.ELEMENT_IMPORT);
 		getElementImports().add(newElementImport);
 		if (importedElement != null)
 			newElementImport.setImportedElement(importedElement);
@@ -212,15 +197,12 @@
 	 */
 	public ElementImport getElementImport(PackageableElement importedElement,
 			boolean createOnDemand) {
-		elementImportLoop : for (ElementImport elementImport : getElementImports()) {
-			if (importedElement != null
-				&& !importedElement.equals(elementImport.getImportedElement()))
+		elementImportLoop: for (ElementImport elementImport : getElementImports()) {
+			if (importedElement != null && !importedElement.equals(elementImport.getImportedElement()))
 				continue elementImportLoop;
 			return elementImport;
 		}
-		return createOnDemand
-			? createElementImport(importedElement)
-			: null;
+		return createOnDemand ? createElementImport(importedElement) : null;
 	}
 
 	/**
@@ -230,9 +212,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<PackageImport> getPackageImports() {
-		return (EList<PackageImport>) eDynamicGet(
-			UMLPackage.NAMESPACE__PACKAGE_IMPORT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMESPACE__PACKAGE_IMPORT, true, true);
+		return (EList<PackageImport>) eDynamicGet(UMLPackage.NAMESPACE__PACKAGE_IMPORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMESPACE__PACKAGE_IMPORT, true, true);
 	}
 
 	/**
@@ -242,8 +222,7 @@
 	 */
 	public PackageImport createPackageImport(
 			org.eclipse.uml2.uml.Package importedPackage) {
-		PackageImport newPackageImport = (PackageImport) create(
-			UMLPackage.Literals.PACKAGE_IMPORT);
+		PackageImport newPackageImport = (PackageImport) create(UMLPackage.Literals.PACKAGE_IMPORT);
 		getPackageImports().add(newPackageImport);
 		if (importedPackage != null)
 			newPackageImport.setImportedPackage(importedPackage);
@@ -268,15 +247,12 @@
 	public PackageImport getPackageImport(
 			org.eclipse.uml2.uml.Package importedPackage,
 			boolean createOnDemand) {
-		packageImportLoop : for (PackageImport packageImport : getPackageImports()) {
-			if (importedPackage != null
-				&& !importedPackage.equals(packageImport.getImportedPackage()))
+		packageImportLoop: for (PackageImport packageImport : getPackageImports()) {
+			if (importedPackage != null && !importedPackage.equals(packageImport.getImportedPackage()))
 				continue packageImportLoop;
 			return packageImport;
 		}
-		return createOnDemand
-			? createPackageImport(importedPackage)
-			: null;
+		return createOnDemand ? createPackageImport(importedPackage) : null;
 	}
 
 	/**
@@ -286,9 +262,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Constraint> getOwnedRules() {
-		return (EList<Constraint>) eDynamicGet(
-			UMLPackage.NAMESPACE__OWNED_RULE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMESPACE__OWNED_RULE, true, true);
+		return (EList<Constraint>) eDynamicGet(UMLPackage.NAMESPACE__OWNED_RULE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMESPACE__OWNED_RULE, true, true);
 	}
 
 	/**
@@ -329,18 +303,14 @@
 	 */
 	public Constraint getOwnedRule(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		ownedRuleLoop : for (Constraint ownedRule : getOwnedRules()) {
+		ownedRuleLoop: for (Constraint ownedRule : getOwnedRules()) {
 			if (eClass != null && !eClass.isInstance(ownedRule))
 				continue ownedRuleLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedRule.getName())
-				: name.equals(ownedRule.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedRule.getName()) : name.equals(ownedRule.getName())))
 				continue ownedRuleLoop;
 			return ownedRule;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedRule(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedRule(name, eClass) : null;
 	}
 
 	/**
@@ -352,11 +322,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<PackageableElement> result = (EList<PackageableElement>) cache
-				.get(this, UMLPackage.Literals.NAMESPACE__IMPORTED_MEMBER);
+			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));
+				cache.put(this, UMLPackage.Literals.NAMESPACE__IMPORTED_MEMBER, result = NamespaceOperations.getImportedMembers(this));
 			}
 			return result;
 		}
@@ -379,12 +347,10 @@
 	 */
 	public PackageableElement getImportedMember(String name, boolean ignoreCase,
 			EClass eClass) {
-		importedMemberLoop : for (PackageableElement importedMember : getImportedMembers()) {
+		importedMemberLoop: for (PackageableElement importedMember : getImportedMembers()) {
 			if (eClass != null && !eClass.isInstance(importedMember))
 				continue importedMemberLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(importedMember.getName())
-				: name.equals(importedMember.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(importedMember.getName()) : name.equals(importedMember.getName())))
 				continue importedMemberLoop;
 			return importedMember;
 		}
@@ -398,8 +364,7 @@
 	 */
 	public boolean validateMembersDistinguishable(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return NamespaceOperations.validateMembersDistinguishable(this,
-			diagnostics, context);
+		return NamespaceOperations.validateMembersDistinguishable(this, diagnostics, context);
 	}
 
 	/**
@@ -409,8 +374,7 @@
 	 */
 	public boolean validateCannotImportSelf(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return NamespaceOperations.validateCannotImportSelf(this, diagnostics,
-			context);
+		return NamespaceOperations.validateCannotImportSelf(this, diagnostics, context);
 	}
 
 	/**
@@ -420,8 +384,7 @@
 	 */
 	public boolean validateCannotImportOwnedMembers(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return NamespaceOperations.validateCannotImportOwnedMembers(this,
-			diagnostics, context);
+		return NamespaceOperations.validateCannotImportOwnedMembers(this, diagnostics, context);
 	}
 
 	/**
@@ -431,8 +394,7 @@
 	 */
 	public ElementImport createElementImport(PackageableElement element,
 			VisibilityKind visibility) {
-		return NamespaceOperations.createElementImport(this, element,
-			visibility);
+		return NamespaceOperations.createElementImport(this, element, visibility);
 	}
 
 	/**
@@ -442,8 +404,7 @@
 	 */
 	public PackageImport createPackageImport(
 			org.eclipse.uml2.uml.Package package_, VisibilityKind visibility) {
-		return NamespaceOperations.createPackageImport(this, package_,
-			visibility);
+		return NamespaceOperations.createPackageImport(this, package_, visibility);
 	}
 
 	/**
@@ -455,13 +416,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<PackageableElement> result = (EList<PackageableElement>) cache
-				.get(this,
-					UMLPackage.Literals.NAMESPACE___GET_IMPORTED_ELEMENTS);
+			EList<PackageableElement> result = (EList<PackageableElement>) cache.get(this, UMLPackage.Literals.NAMESPACE___GET_IMPORTED_ELEMENTS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.NAMESPACE___GET_IMPORTED_ELEMENTS,
-					result = NamespaceOperations.getImportedElements(this));
+				cache.put(this, UMLPackage.Literals.NAMESPACE___GET_IMPORTED_ELEMENTS, result = NamespaceOperations.getImportedElements(this));
 			}
 			return result;
 		}
@@ -477,13 +434,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<org.eclipse.uml2.uml.Package> result = (EList<org.eclipse.uml2.uml.Package>) cache
-				.get(this,
-					UMLPackage.Literals.NAMESPACE___GET_IMPORTED_PACKAGES);
+			EList<org.eclipse.uml2.uml.Package> result = (EList<org.eclipse.uml2.uml.Package>) cache.get(this, UMLPackage.Literals.NAMESPACE___GET_IMPORTED_PACKAGES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.NAMESPACE___GET_IMPORTED_PACKAGES,
-					result = NamespaceOperations.getImportedPackages(this));
+				cache.put(this, UMLPackage.Literals.NAMESPACE___GET_IMPORTED_PACKAGES, result = NamespaceOperations.getImportedPackages(this));
 			}
 			return result;
 		}
@@ -538,18 +491,14 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.NAMESPACE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.NAMESPACE__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.NAMESPACE__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.NAMESPACE__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.NAMESPACE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.NAMESPACE__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.NAMESPACE__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.NAMESPACE__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -563,23 +512,18 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.NAMESPACE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NAMESPACE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NAMESPACE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.NAMESPACE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NAMESPACE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NAMESPACE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.NAMESPACE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NAMESPACE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NAMESPACE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.NAMESPACE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NAMESPACE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NAMESPACE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -592,44 +536,44 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.NAMESPACE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.NAMESPACE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.NAMESPACE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.NAMESPACE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.NAMESPACE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.NAMESPACE__NAME :
-				return getName();
-			case UMLPackage.NAMESPACE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.NAMESPACE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.NAMESPACE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.NAMESPACE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.NAMESPACE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.NAMESPACE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.NAMESPACE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.NAMESPACE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.NAMESPACE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.NAMESPACE__MEMBER :
-				return getMembers();
+		case UMLPackage.NAMESPACE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.NAMESPACE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.NAMESPACE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.NAMESPACE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.NAMESPACE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.NAMESPACE__NAME:
+			return getName();
+		case UMLPackage.NAMESPACE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.NAMESPACE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.NAMESPACE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.NAMESPACE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.NAMESPACE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.NAMESPACE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.NAMESPACE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.NAMESPACE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.NAMESPACE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.NAMESPACE__MEMBER:
+			return getMembers();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -643,40 +587,35 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.NAMESPACE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.NAMESPACE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.NAMESPACE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.NAMESPACE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.NAMESPACE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.NAMESPACE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.NAMESPACE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.NAMESPACE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
+		case UMLPackage.NAMESPACE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.NAMESPACE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.NAMESPACE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.NAMESPACE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.NAMESPACE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.NAMESPACE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.NAMESPACE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.NAMESPACE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -689,30 +628,30 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.NAMESPACE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.NAMESPACE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.NAMESPACE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.NAMESPACE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.NAMESPACE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.NAMESPACE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.NAMESPACE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.NAMESPACE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
+		case UMLPackage.NAMESPACE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.NAMESPACE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.NAMESPACE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.NAMESPACE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.NAMESPACE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.NAMESPACE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.NAMESPACE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.NAMESPACE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -725,40 +664,38 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.NAMESPACE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.NAMESPACE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.NAMESPACE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.NAMESPACE__OWNER :
-				return isSetOwner();
-			case UMLPackage.NAMESPACE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.NAMESPACE__NAME :
-				return isSetName();
-			case UMLPackage.NAMESPACE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.NAMESPACE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.NAMESPACE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.NAMESPACE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.NAMESPACE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.NAMESPACE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.NAMESPACE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.NAMESPACE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.NAMESPACE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.NAMESPACE__MEMBER :
-				return isSetMembers();
+		case UMLPackage.NAMESPACE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.NAMESPACE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.NAMESPACE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.NAMESPACE__OWNER:
+			return isSetOwner();
+		case UMLPackage.NAMESPACE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.NAMESPACE__NAME:
+			return isSetName();
+		case UMLPackage.NAMESPACE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.NAMESPACE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.NAMESPACE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.NAMESPACE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.NAMESPACE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.NAMESPACE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.NAMESPACE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.NAMESPACE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.NAMESPACE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.NAMESPACE__MEMBER:
+			return isSetMembers();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -773,163 +710,136 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.NAMESPACE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.NAMESPACE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NAMESPACE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NAMESPACE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.NAMESPACE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.NAMESPACE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.NAMESPACE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.NAMESPACE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.NAMESPACE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.NAMESPACE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.NAMESPACE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.NAMESPACE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.NAMESPACE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.NAMESPACE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.NAMESPACE___GET_MODEL :
-				return getModel();
-			case UMLPackage.NAMESPACE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.NAMESPACE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.NAMESPACE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.NAMESPACE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.NAMESPACE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.NAMESPACE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.NAMESPACE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.NAMESPACE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.NAMESPACE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.NAMESPACE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.NAMESPACE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.NAMESPACE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.NAMESPACE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.NAMESPACE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.NAMESPACE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.NAMESPACE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.NAMESPACE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.NAMESPACE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.NAMESPACE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.NAMESPACE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.NAMESPACE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.NAMESPACE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.NAMESPACE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NAMESPACE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NAMESPACE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NAMESPACE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.NAMESPACE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.NAMESPACE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.NAMESPACE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.NAMESPACE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.NAMESPACE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.NAMESPACE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.NAMESPACE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.NAMESPACE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.NAMESPACE___SEPARATOR :
-				return separator();
-			case UMLPackage.NAMESPACE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.NAMESPACE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NAMESPACE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NAMESPACE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NAMESPACE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.NAMESPACE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.NAMESPACE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.NAMESPACE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.NAMESPACE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.NAMESPACE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.NAMESPACE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.NAMESPACE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.NAMESPACE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.NAMESPACE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
+		case UMLPackage.NAMESPACE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.NAMESPACE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NAMESPACE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NAMESPACE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.NAMESPACE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.NAMESPACE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.NAMESPACE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.NAMESPACE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.NAMESPACE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.NAMESPACE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.NAMESPACE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.NAMESPACE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.NAMESPACE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.NAMESPACE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.NAMESPACE___GET_MODEL:
+			return getModel();
+		case UMLPackage.NAMESPACE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.NAMESPACE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.NAMESPACE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.NAMESPACE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.NAMESPACE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.NAMESPACE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.NAMESPACE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.NAMESPACE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.NAMESPACE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.NAMESPACE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.NAMESPACE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.NAMESPACE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.NAMESPACE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.NAMESPACE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.NAMESPACE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.NAMESPACE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.NAMESPACE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.NAMESPACE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.NAMESPACE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.NAMESPACE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.NAMESPACE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.NAMESPACE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.NAMESPACE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NAMESPACE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NAMESPACE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NAMESPACE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.NAMESPACE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.NAMESPACE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.NAMESPACE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.NAMESPACE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.NAMESPACE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.NAMESPACE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.NAMESPACE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.NAMESPACE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.NAMESPACE___SEPARATOR:
+			return separator();
+		case UMLPackage.NAMESPACE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.NAMESPACE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NAMESPACE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NAMESPACE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NAMESPACE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.NAMESPACE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.NAMESPACE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.NAMESPACE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.NAMESPACE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.NAMESPACE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.NAMESPACE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.NAMESPACE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.NAMESPACE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.NAMESPACE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -942,9 +852,9 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.NAMESPACE__ELEMENT_IMPORT)
-			|| eIsSet(UMLPackage.NAMESPACE__PACKAGE_IMPORT)
-			|| isSetOwnedMembers();
+				|| eIsSet(UMLPackage.NAMESPACE__ELEMENT_IMPORT)
+				|| eIsSet(UMLPackage.NAMESPACE__PACKAGE_IMPORT)
+				|| isSetOwnedMembers();
 	}
 
 	/**
@@ -955,8 +865,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.NAMESPACE__OWNED_RULE};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.NAMESPACE__OWNED_RULE };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedElements() <em>Owned Element</em>}' reference list.
@@ -966,12 +875,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.NAMESPACE__OWNED_COMMENT,
-		UMLPackage.NAMESPACE__NAME_EXPRESSION,
-		UMLPackage.NAMESPACE__ELEMENT_IMPORT,
-		UMLPackage.NAMESPACE__PACKAGE_IMPORT,
-		UMLPackage.NAMESPACE__OWNED_MEMBER};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.NAMESPACE__OWNED_COMMENT, UMLPackage.NAMESPACE__NAME_EXPRESSION, UMLPackage.NAMESPACE__ELEMENT_IMPORT, UMLPackage.NAMESPACE__PACKAGE_IMPORT, UMLPackage.NAMESPACE__OWNED_MEMBER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -989,12 +893,10 @@
 	 */
 	public NamedElement getOwnedMember(String name, boolean ignoreCase,
 			EClass eClass) {
-		ownedMemberLoop : for (NamedElement ownedMember : getOwnedMembers()) {
+		ownedMemberLoop: for (NamedElement ownedMember : getOwnedMembers()) {
 			if (eClass != null && !eClass.isInstance(ownedMember))
 				continue ownedMemberLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedMember.getName())
-				: name.equals(ownedMember.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedMember.getName()) : name.equals(ownedMember.getName())))
 				continue ownedMemberLoop;
 			return ownedMember;
 		}
@@ -1009,9 +911,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] MEMBER_ESUBSETS = new int[]{
-		UMLPackage.NAMESPACE__OWNED_MEMBER,
-		UMLPackage.NAMESPACE__IMPORTED_MEMBER};
+	protected static final int[] MEMBER_ESUBSETS = new int[] { UMLPackage.NAMESPACE__OWNED_MEMBER, UMLPackage.NAMESPACE__IMPORTED_MEMBER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1029,12 +929,10 @@
 	 */
 	public NamedElement getMember(String name, boolean ignoreCase,
 			EClass eClass) {
-		memberLoop : for (NamedElement member : getMembers()) {
+		memberLoop: for (NamedElement member : getMembers()) {
 			if (eClass != null && !eClass.isInstance(member))
 				continue memberLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(member.getName())
-				: name.equals(member.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(member.getName()) : name.equals(member.getName())))
 				continue memberLoop;
 			return member;
 		}
@@ -1057,7 +955,7 @@
 	 */
 	public boolean isSetMembers() {
 		return isSetOwnedMembers()
-			|| eIsSet(UMLPackage.NAMESPACE__IMPORTED_MEMBER);
+				|| eIsSet(UMLPackage.NAMESPACE__IMPORTED_MEMBER);
 	}
 
 } //NamespaceImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/NodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/NodeImpl.java
index 53145d4..7ffe044 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/NodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/NodeImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 205188
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -30,6 +30,8 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -125,19 +127,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.NODE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -147,9 +143,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Deployment> getDeployments() {
-		return (EList<Deployment>) eDynamicGet(
-			UMLPackage.NODE__DEPLOYMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYMENT, true, true);
+		return (EList<Deployment>) eDynamicGet(UMLPackage.NODE__DEPLOYMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYMENT, true, true);
 	}
 
 	/**
@@ -161,14 +155,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<PackageableElement> result = (EList<PackageableElement>) cache
-				.get(this,
-					UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT);
+			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,
-					result = DeploymentTargetOperations
-						.getDeployedElements(this));
+				cache.put(this, UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT, result = DeploymentTargetOperations.getDeployedElements(this));
 			}
 			return result;
 		}
@@ -191,12 +180,10 @@
 	 */
 	public PackageableElement getDeployedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		deployedElementLoop : for (PackageableElement deployedElement : getDeployedElements()) {
+		deployedElementLoop: for (PackageableElement deployedElement : getDeployedElements()) {
 			if (eClass != null && !eClass.isInstance(deployedElement))
 				continue deployedElementLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(deployedElement.getName())
-				: name.equals(deployedElement.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(deployedElement.getName()) : name.equals(deployedElement.getName())))
 				continue deployedElementLoop;
 			return deployedElement;
 		}
@@ -214,19 +201,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this, UMLPackage.NODE__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.NODE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.NODE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.NODE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -236,9 +217,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Node> getNestedNodes() {
-		return (EList<Node>) eDynamicGet(
-			UMLPackage.NODE__NESTED_NODE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NODE__NESTED_NODE, true, true);
+		return (EList<Node>) eDynamicGet(UMLPackage.NODE__NESTED_NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NODE__NESTED_NODE, true, true);
 	}
 
 	/**
@@ -279,18 +258,14 @@
 	 */
 	public Node getNestedNode(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		nestedNodeLoop : for (Node nestedNode : getNestedNodes()) {
+		nestedNodeLoop: for (Node nestedNode : getNestedNodes()) {
 			if (eClass != null && !eClass.isInstance(nestedNode))
 				continue nestedNodeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(nestedNode.getName())
-				: name.equals(nestedNode.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(nestedNode.getName()) : name.equals(nestedNode.getName())))
 				continue nestedNodeLoop;
 			return nestedNode;
 		}
-		return createOnDemand && eClass != null
-			? createNestedNode(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createNestedNode(name, eClass) : null;
 	}
 
 	/**
@@ -300,8 +275,7 @@
 	 */
 	public boolean validateInternalStructure(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return NodeOperations.validateInternalStructure(this, diagnostics,
-			context);
+		return NodeOperations.validateInternalStructure(this, diagnostics, context);
 	}
 
 	/**
@@ -314,9 +288,7 @@
 			int end1Upper, Node end1Node, boolean end2IsNavigable,
 			AggregationKind end2Aggregation, String end2Name, int end2Lower,
 			int end2Upper) {
-		return NodeOperations.createCommunicationPath(this, end1IsNavigable,
-			end1Aggregation, end1Name, end1Lower, end1Upper, end1Node,
-			end2IsNavigable, end2Aggregation, end2Name, end2Lower, end2Upper);
+		return NodeOperations.createCommunicationPath(this, end1IsNavigable, end1Aggregation, end1Name, end1Lower, end1Upper, end1Node, end2IsNavigable, end2Aggregation, end2Name, end2Lower, end2Upper);
 	}
 
 	/**
@@ -328,12 +300,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<CommunicationPath> result = (EList<CommunicationPath>) cache
-				.get(this, UMLPackage.Literals.NODE___GET_COMMUNICATION_PATHS);
+			EList<CommunicationPath> result = (EList<CommunicationPath>) cache.get(this, UMLPackage.Literals.NODE___GET_COMMUNICATION_PATHS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.NODE___GET_COMMUNICATION_PATHS,
-					result = NodeOperations.getCommunicationPaths(this));
+				cache.put(this, UMLPackage.Literals.NODE___GET_COMMUNICATION_PATHS, result = NodeOperations.getCommunicationPaths(this));
 			}
 			return result;
 		}
@@ -350,66 +319,44 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.NODE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.NODE__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.NODE__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.NODE__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.NODE__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.NODE__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.NODE__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this,
-							EOPPOSITE_FEATURE_BASE
-								- UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.NODE__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.NODE__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.NODE__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.NODE__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.NODE__INTERFACE_REALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.NODE__OWNED_OPERATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.NODE__DEPLOYMENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getDeployments())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.NODE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.NODE__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.NODE__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.NODE__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.NODE__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.NODE__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.NODE__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.NODE__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.NODE__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.NODE__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.NODE__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.NODE__INTERFACE_REALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.NODE__OWNED_OPERATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.NODE__DEPLOYMENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getDeployments()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -423,77 +370,56 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.NODE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.NODE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.NODE__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.NODE__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__OWNED_CONNECTOR :
-				return ((InternalEList<?>) getOwnedConnectors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__INTERFACE_REALIZATION :
-				return ((InternalEList<?>) getInterfaceRealizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__OWNED_BEHAVIOR :
-				return ((InternalEList<?>) getOwnedBehaviors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__OWNED_OPERATION :
-				return ((InternalEList<?>) getOwnedOperations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__NESTED_CLASSIFIER :
-				return ((InternalEList<?>) getNestedClassifiers())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__OWNED_RECEPTION :
-				return ((InternalEList<?>) getOwnedReceptions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__DEPLOYMENT :
-				return ((InternalEList<?>) getDeployments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.NODE__NESTED_NODE :
-				return ((InternalEList<?>) getNestedNodes())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.NODE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.NODE__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__OWNED_CONNECTOR:
+			return ((InternalEList<?>) getOwnedConnectors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__INTERFACE_REALIZATION:
+			return ((InternalEList<?>) getInterfaceRealizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__OWNED_BEHAVIOR:
+			return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__OWNED_OPERATION:
+			return ((InternalEList<?>) getOwnedOperations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__NESTED_CLASSIFIER:
+			return ((InternalEList<?>) getNestedClassifiers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__OWNED_RECEPTION:
+			return ((InternalEList<?>) getOwnedReceptions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__DEPLOYMENT:
+			return ((InternalEList<?>) getDeployments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.NODE__NESTED_NODE:
+			return ((InternalEList<?>) getNestedNodes()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -506,134 +432,134 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.NODE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.NODE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.NODE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.NODE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.NODE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.NODE__NAME :
-				return getName();
-			case UMLPackage.NODE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.NODE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.NODE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.NODE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.NODE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.NODE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.NODE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.NODE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.NODE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.NODE__MEMBER :
-				return getMembers();
-			case UMLPackage.NODE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.NODE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.NODE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.NODE__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.NODE__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.NODE__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.NODE__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.NODE__FEATURE :
-				return getFeatures();
-			case UMLPackage.NODE__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.NODE__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.NODE__GENERAL :
-				return getGenerals();
-			case UMLPackage.NODE__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.NODE__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.NODE__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.NODE__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.NODE__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.NODE__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.NODE__USE_CASE :
-				return getUseCases();
-			case UMLPackage.NODE__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.NODE__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.NODE__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.NODE__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.NODE__OWNED_CONNECTOR :
-				return getOwnedConnectors();
-			case UMLPackage.NODE__PART :
-				return getParts();
-			case UMLPackage.NODE__ROLE :
-				return getRoles();
-			case UMLPackage.NODE__OWNED_PORT :
-				return getOwnedPorts();
-			case UMLPackage.NODE__CLASSIFIER_BEHAVIOR :
-				if (resolve)
-					return getClassifierBehavior();
-				return basicGetClassifierBehavior();
-			case UMLPackage.NODE__INTERFACE_REALIZATION :
-				return getInterfaceRealizations();
-			case UMLPackage.NODE__OWNED_BEHAVIOR :
-				return getOwnedBehaviors();
-			case UMLPackage.NODE__OWNED_OPERATION :
-				return getOwnedOperations();
-			case UMLPackage.NODE__EXTENSION :
-				return getExtensions();
-			case UMLPackage.NODE__IS_ACTIVE :
-				return isActive();
-			case UMLPackage.NODE__NESTED_CLASSIFIER :
-				return getNestedClassifiers();
-			case UMLPackage.NODE__OWNED_RECEPTION :
-				return getOwnedReceptions();
-			case UMLPackage.NODE__SUPER_CLASS :
-				return getSuperClasses();
-			case UMLPackage.NODE__DEPLOYED_ELEMENT :
-				return getDeployedElements();
-			case UMLPackage.NODE__DEPLOYMENT :
-				return getDeployments();
-			case UMLPackage.NODE__NESTED_NODE :
-				return getNestedNodes();
+		case UMLPackage.NODE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.NODE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.NODE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.NODE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.NODE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.NODE__NAME:
+			return getName();
+		case UMLPackage.NODE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.NODE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.NODE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.NODE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.NODE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.NODE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.NODE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.NODE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.NODE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.NODE__MEMBER:
+			return getMembers();
+		case UMLPackage.NODE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.NODE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.NODE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.NODE__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.NODE__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.NODE__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.NODE__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.NODE__FEATURE:
+			return getFeatures();
+		case UMLPackage.NODE__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.NODE__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.NODE__GENERAL:
+			return getGenerals();
+		case UMLPackage.NODE__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.NODE__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.NODE__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.NODE__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.NODE__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.NODE__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.NODE__USE_CASE:
+			return getUseCases();
+		case UMLPackage.NODE__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.NODE__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.NODE__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.NODE__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.NODE__OWNED_CONNECTOR:
+			return getOwnedConnectors();
+		case UMLPackage.NODE__PART:
+			return getParts();
+		case UMLPackage.NODE__ROLE:
+			return getRoles();
+		case UMLPackage.NODE__OWNED_PORT:
+			return getOwnedPorts();
+		case UMLPackage.NODE__CLASSIFIER_BEHAVIOR:
+			if (resolve)
+				return getClassifierBehavior();
+			return basicGetClassifierBehavior();
+		case UMLPackage.NODE__INTERFACE_REALIZATION:
+			return getInterfaceRealizations();
+		case UMLPackage.NODE__OWNED_BEHAVIOR:
+			return getOwnedBehaviors();
+		case UMLPackage.NODE__OWNED_OPERATION:
+			return getOwnedOperations();
+		case UMLPackage.NODE__EXTENSION:
+			return getExtensions();
+		case UMLPackage.NODE__IS_ACTIVE:
+			return isActive();
+		case UMLPackage.NODE__NESTED_CLASSIFIER:
+			return getNestedClassifiers();
+		case UMLPackage.NODE__OWNED_RECEPTION:
+			return getOwnedReceptions();
+		case UMLPackage.NODE__SUPER_CLASS:
+			return getSuperClasses();
+		case UMLPackage.NODE__DEPLOYED_ELEMENT:
+			return getDeployedElements();
+		case UMLPackage.NODE__DEPLOYMENT:
+			return getDeployments();
+		case UMLPackage.NODE__NESTED_NODE:
+			return getNestedNodes();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -647,163 +573,141 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.NODE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.NODE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.NODE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.NODE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.NODE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.NODE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.NODE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.NODE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.NODE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.NODE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.NODE__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.NODE__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.NODE__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.NODE__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.NODE__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.NODE__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.NODE__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.NODE__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.NODE__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.NODE__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.NODE__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.NODE__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.NODE__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				getOwnedConnectors()
-					.addAll((Collection<? extends Connector>) newValue);
-				return;
-			case UMLPackage.NODE__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) newValue);
-				return;
-			case UMLPackage.NODE__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll(
-					(Collection<? extends InterfaceRealization>) newValue);
-				return;
-			case UMLPackage.NODE__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				getOwnedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.NODE__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
-			case UMLPackage.NODE__IS_ACTIVE :
-				setIsActive((Boolean) newValue);
-				return;
-			case UMLPackage.NODE__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				getNestedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.NODE__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				getOwnedReceptions()
-					.addAll((Collection<? extends Reception>) newValue);
-				return;
-			case UMLPackage.NODE__SUPER_CLASS :
-				getSuperClasses().clear();
-				getSuperClasses().addAll(
-					(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
-				return;
-			case UMLPackage.NODE__DEPLOYMENT :
-				getDeployments().clear();
-				getDeployments()
-					.addAll((Collection<? extends Deployment>) newValue);
-				return;
-			case UMLPackage.NODE__NESTED_NODE :
-				getNestedNodes().clear();
-				getNestedNodes().addAll((Collection<? extends Node>) newValue);
-				return;
+		case UMLPackage.NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.NODE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.NODE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.NODE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.NODE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.NODE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.NODE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.NODE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.NODE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.NODE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.NODE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.NODE__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.NODE__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.NODE__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.NODE__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.NODE__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.NODE__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.NODE__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.NODE__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.NODE__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.NODE__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.NODE__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.NODE__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.NODE__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			getOwnedConnectors().addAll((Collection<? extends Connector>) newValue);
+			return;
+		case UMLPackage.NODE__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) newValue);
+			return;
+		case UMLPackage.NODE__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			getInterfaceRealizations().addAll((Collection<? extends InterfaceRealization>) newValue);
+			return;
+		case UMLPackage.NODE__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			getOwnedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.NODE__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
+		case UMLPackage.NODE__IS_ACTIVE:
+			setIsActive((Boolean) newValue);
+			return;
+		case UMLPackage.NODE__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			getNestedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.NODE__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			getOwnedReceptions().addAll((Collection<? extends Reception>) newValue);
+			return;
+		case UMLPackage.NODE__SUPER_CLASS:
+			getSuperClasses().clear();
+			getSuperClasses().addAll((Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
+			return;
+		case UMLPackage.NODE__DEPLOYMENT:
+			getDeployments().clear();
+			getDeployments().addAll((Collection<? extends Deployment>) newValue);
+			return;
+		case UMLPackage.NODE__NESTED_NODE:
+			getNestedNodes().clear();
+			getNestedNodes().addAll((Collection<? extends Node>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -816,117 +720,117 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.NODE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.NODE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.NODE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.NODE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.NODE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.NODE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.NODE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.NODE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.NODE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.NODE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.NODE__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.NODE__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.NODE__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.NODE__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.NODE__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.NODE__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.NODE__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.NODE__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.NODE__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.NODE__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.NODE__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.NODE__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.NODE__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				return;
-			case UMLPackage.NODE__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) null);
-				return;
-			case UMLPackage.NODE__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				return;
-			case UMLPackage.NODE__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				return;
-			case UMLPackage.NODE__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
-			case UMLPackage.NODE__IS_ACTIVE :
-				setIsActive(IS_ACTIVE_EDEFAULT);
-				return;
-			case UMLPackage.NODE__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				return;
-			case UMLPackage.NODE__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				return;
-			case UMLPackage.NODE__SUPER_CLASS :
-				getSuperClasses().clear();
-				return;
-			case UMLPackage.NODE__DEPLOYMENT :
-				getDeployments().clear();
-				return;
-			case UMLPackage.NODE__NESTED_NODE :
-				getNestedNodes().clear();
-				return;
+		case UMLPackage.NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.NODE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.NODE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.NODE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.NODE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.NODE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.NODE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.NODE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.NODE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.NODE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.NODE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.NODE__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.NODE__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.NODE__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.NODE__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.NODE__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.NODE__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.NODE__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.NODE__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.NODE__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.NODE__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.NODE__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.NODE__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.NODE__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			return;
+		case UMLPackage.NODE__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) null);
+			return;
+		case UMLPackage.NODE__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			return;
+		case UMLPackage.NODE__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			return;
+		case UMLPackage.NODE__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
+		case UMLPackage.NODE__IS_ACTIVE:
+			setIsActive(IS_ACTIVE_EDEFAULT);
+			return;
+		case UMLPackage.NODE__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			return;
+		case UMLPackage.NODE__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			return;
+		case UMLPackage.NODE__SUPER_CLASS:
+			getSuperClasses().clear();
+			return;
+		case UMLPackage.NODE__DEPLOYMENT:
+			getDeployments().clear();
+			return;
+		case UMLPackage.NODE__NESTED_NODE:
+			getNestedNodes().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -939,118 +843,116 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.NODE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.NODE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.NODE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.NODE__OWNER :
-				return isSetOwner();
-			case UMLPackage.NODE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.NODE__NAME :
-				return isSetName();
-			case UMLPackage.NODE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.NODE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.NODE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.NODE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.NODE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.NODE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.NODE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.NODE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.NODE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.NODE__MEMBER :
-				return isSetMembers();
-			case UMLPackage.NODE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.NODE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.NODE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.NODE__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.NODE__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.NODE__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.NODE__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.NODE__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.NODE__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.NODE__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.NODE__GENERAL :
-				return isSetGenerals();
-			case UMLPackage.NODE__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.NODE__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.NODE__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.NODE__IS_ABSTRACT :
-				return isSetIsAbstract();
-			case UMLPackage.NODE__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.NODE__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.NODE__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.NODE__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.NODE__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.NODE__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.NODE__OWNED_ATTRIBUTE :
-				return isSetOwnedAttributes();
-			case UMLPackage.NODE__OWNED_CONNECTOR :
-				return !getOwnedConnectors().isEmpty();
-			case UMLPackage.NODE__PART :
-				return !getParts().isEmpty();
-			case UMLPackage.NODE__ROLE :
-				return isSetRoles();
-			case UMLPackage.NODE__OWNED_PORT :
-				return !getOwnedPorts().isEmpty();
-			case UMLPackage.NODE__CLASSIFIER_BEHAVIOR :
-				return basicGetClassifierBehavior() != null;
-			case UMLPackage.NODE__INTERFACE_REALIZATION :
-				return !getInterfaceRealizations().isEmpty();
-			case UMLPackage.NODE__OWNED_BEHAVIOR :
-				return !getOwnedBehaviors().isEmpty();
-			case UMLPackage.NODE__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
-			case UMLPackage.NODE__EXTENSION :
-				return !getExtensions().isEmpty();
-			case UMLPackage.NODE__IS_ACTIVE :
-				return isActive() != IS_ACTIVE_EDEFAULT;
-			case UMLPackage.NODE__NESTED_CLASSIFIER :
-				return !getNestedClassifiers().isEmpty();
-			case UMLPackage.NODE__OWNED_RECEPTION :
-				return !getOwnedReceptions().isEmpty();
-			case UMLPackage.NODE__SUPER_CLASS :
-				return isSetSuperClasses();
-			case UMLPackage.NODE__DEPLOYED_ELEMENT :
-				return !getDeployedElements().isEmpty();
-			case UMLPackage.NODE__DEPLOYMENT :
-				return !getDeployments().isEmpty();
-			case UMLPackage.NODE__NESTED_NODE :
-				return !getNestedNodes().isEmpty();
+		case UMLPackage.NODE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.NODE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.NODE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.NODE__OWNER:
+			return isSetOwner();
+		case UMLPackage.NODE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.NODE__NAME:
+			return isSetName();
+		case UMLPackage.NODE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.NODE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.NODE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.NODE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.NODE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.NODE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.NODE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.NODE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.NODE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.NODE__MEMBER:
+			return isSetMembers();
+		case UMLPackage.NODE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.NODE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.NODE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.NODE__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.NODE__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.NODE__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.NODE__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.NODE__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.NODE__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.NODE__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.NODE__GENERAL:
+			return isSetGenerals();
+		case UMLPackage.NODE__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.NODE__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.NODE__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.NODE__IS_ABSTRACT:
+			return isSetIsAbstract();
+		case UMLPackage.NODE__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.NODE__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.NODE__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.NODE__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.NODE__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.NODE__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.NODE__OWNED_ATTRIBUTE:
+			return isSetOwnedAttributes();
+		case UMLPackage.NODE__OWNED_CONNECTOR:
+			return !getOwnedConnectors().isEmpty();
+		case UMLPackage.NODE__PART:
+			return !getParts().isEmpty();
+		case UMLPackage.NODE__ROLE:
+			return isSetRoles();
+		case UMLPackage.NODE__OWNED_PORT:
+			return !getOwnedPorts().isEmpty();
+		case UMLPackage.NODE__CLASSIFIER_BEHAVIOR:
+			return basicGetClassifierBehavior() != null;
+		case UMLPackage.NODE__INTERFACE_REALIZATION:
+			return !getInterfaceRealizations().isEmpty();
+		case UMLPackage.NODE__OWNED_BEHAVIOR:
+			return !getOwnedBehaviors().isEmpty();
+		case UMLPackage.NODE__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
+		case UMLPackage.NODE__EXTENSION:
+			return !getExtensions().isEmpty();
+		case UMLPackage.NODE__IS_ACTIVE:
+			return isActive() != IS_ACTIVE_EDEFAULT;
+		case UMLPackage.NODE__NESTED_CLASSIFIER:
+			return !getNestedClassifiers().isEmpty();
+		case UMLPackage.NODE__OWNED_RECEPTION:
+			return !getOwnedReceptions().isEmpty();
+		case UMLPackage.NODE__SUPER_CLASS:
+			return isSetSuperClasses();
+		case UMLPackage.NODE__DEPLOYED_ELEMENT:
+			return !getDeployedElements().isEmpty();
+		case UMLPackage.NODE__DEPLOYMENT:
+			return !getDeployments().isEmpty();
+		case UMLPackage.NODE__NESTED_NODE:
+			return !getNestedNodes().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1065,12 +967,12 @@
 			Class<?> baseClass) {
 		if (baseClass == DeploymentTarget.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.NODE__DEPLOYED_ELEMENT :
-					return UMLPackage.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT;
-				case UMLPackage.NODE__DEPLOYMENT :
-					return UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT;
-				default :
-					return -1;
+			case UMLPackage.NODE__DEPLOYED_ELEMENT:
+				return UMLPackage.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT;
+			case UMLPackage.NODE__DEPLOYMENT:
+				return UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -1086,12 +988,12 @@
 			Class<?> baseClass) {
 		if (baseClass == DeploymentTarget.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT :
-					return UMLPackage.NODE__DEPLOYED_ELEMENT;
-				case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT :
-					return UMLPackage.NODE__DEPLOYMENT;
-				default :
-					return -1;
+			case UMLPackage.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT:
+				return UMLPackage.NODE__DEPLOYED_ELEMENT;
+			case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT:
+				return UMLPackage.NODE__DEPLOYMENT;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1107,319 +1009,250 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.NODE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.NODE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.NODE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.NODE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.NODE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.NODE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.NODE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.NODE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.NODE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.NODE___GET_MODEL :
-				return getModel();
-			case UMLPackage.NODE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.NODE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.NODE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.NODE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.NODE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.NODE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.NODE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.NODE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.NODE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.NODE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.NODE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.NODE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.NODE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.NODE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.NODE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.NODE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.NODE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.NODE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.NODE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.NODE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.NODE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.NODE___SEPARATOR :
-				return separator();
-			case UMLPackage.NODE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.NODE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.NODE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.NODE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.NODE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.NODE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.NODE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.NODE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.NODE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.NODE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.NODE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.NODE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.NODE___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.NODE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.NODE___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.NODE___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.NODE___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.NODE___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.NODE___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.NODE___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.NODE___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.NODE___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.NODE___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.NODE___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.NODE___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.NODE___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.NODE___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.NODE___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.NODE___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.NODE___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.NODE___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.NODE___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.NODE___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.NODE___PARENTS :
-				return parents();
-			case UMLPackage.NODE___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.NODE___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.NODE___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.NODE___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.NODE___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.NODE___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.NODE___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.NODE___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.NODE___GET_PARTS :
-				return getParts();
-			case UMLPackage.NODE___ALL_ROLES :
-				return allRoles();
-			case UMLPackage.NODE___GET_OWNED_PORTS :
-				return getOwnedPorts();
-			case UMLPackage.NODE___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateClassBehavior((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___GET_ALL_IMPLEMENTED_INTERFACES :
-				return getAllImplementedInterfaces();
-			case UMLPackage.NODE___GET_IMPLEMENTED_INTERFACES :
-				return getImplementedInterfaces();
-			case UMLPackage.NODE___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP :
-				return validatePassiveClass((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
-			case UMLPackage.NODE___IS_METACLASS :
-				return isMetaclass();
-			case UMLPackage.NODE___GET_EXTENSIONS :
-				return getExtensions();
-			case UMLPackage.NODE___GET_SUPER_CLASSES :
-				return getSuperClasses();
-			case UMLPackage.NODE___GET_DEPLOYED_ELEMENTS :
-				return getDeployedElements();
-			case UMLPackage.NODE___VALIDATE_INTERNAL_STRUCTURE__DIAGNOSTICCHAIN_MAP :
-				return validateInternalStructure(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.NODE___CREATE_COMMUNICATION_PATH__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_NODE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createCommunicationPath((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Node) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.NODE___GET_COMMUNICATION_PATHS :
-				return getCommunicationPaths();
+		case UMLPackage.NODE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.NODE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.NODE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.NODE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.NODE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.NODE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.NODE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.NODE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.NODE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.NODE___GET_MODEL:
+			return getModel();
+		case UMLPackage.NODE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.NODE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.NODE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.NODE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.NODE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.NODE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.NODE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.NODE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.NODE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.NODE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.NODE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.NODE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.NODE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.NODE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.NODE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.NODE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.NODE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.NODE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.NODE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.NODE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.NODE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.NODE___SEPARATOR:
+			return separator();
+		case UMLPackage.NODE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.NODE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.NODE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.NODE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.NODE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.NODE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.NODE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.NODE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.NODE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.NODE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.NODE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.NODE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.NODE___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.NODE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.NODE___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.NODE___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.NODE___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.NODE___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.NODE___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.NODE___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.NODE___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.NODE___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.NODE___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.NODE___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.NODE___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.NODE___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.NODE___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.NODE___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.NODE___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.NODE___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.NODE___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.NODE___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.NODE___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.NODE___PARENTS:
+			return parents();
+		case UMLPackage.NODE___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.NODE___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.NODE___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.NODE___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.NODE___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.NODE___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.NODE___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.NODE___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.NODE___GET_PARTS:
+			return getParts();
+		case UMLPackage.NODE___ALL_ROLES:
+			return allRoles();
+		case UMLPackage.NODE___GET_OWNED_PORTS:
+			return getOwnedPorts();
+		case UMLPackage.NODE___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateClassBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___GET_ALL_IMPLEMENTED_INTERFACES:
+			return getAllImplementedInterfaces();
+		case UMLPackage.NODE___GET_IMPLEMENTED_INTERFACES:
+			return getImplementedInterfaces();
+		case UMLPackage.NODE___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP:
+			return validatePassiveClass((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.NODE___IS_METACLASS:
+			return isMetaclass();
+		case UMLPackage.NODE___GET_EXTENSIONS:
+			return getExtensions();
+		case UMLPackage.NODE___GET_SUPER_CLASSES:
+			return getSuperClasses();
+		case UMLPackage.NODE___GET_DEPLOYED_ELEMENTS:
+			return getDeployedElements();
+		case UMLPackage.NODE___VALIDATE_INTERNAL_STRUCTURE__DIAGNOSTICCHAIN_MAP:
+			return validateInternalStructure((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.NODE___CREATE_COMMUNICATION_PATH__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_NODE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createCommunicationPath((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Node) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.NODE___GET_COMMUNICATION_PATHS:
+			return getCommunicationPaths();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1432,14 +1265,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.NODE__OWNED_COMMENT, UMLPackage.NODE__NAME_EXPRESSION,
-		UMLPackage.NODE__ELEMENT_IMPORT, UMLPackage.NODE__PACKAGE_IMPORT,
-		UMLPackage.NODE__OWNED_MEMBER, UMLPackage.NODE__TEMPLATE_BINDING,
-		UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE,
-		UMLPackage.NODE__COLLABORATION_USE, UMLPackage.NODE__GENERALIZATION,
-		UMLPackage.NODE__SUBSTITUTION, UMLPackage.NODE__INTERFACE_REALIZATION,
-		UMLPackage.NODE__DEPLOYMENT};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.NODE__OWNED_COMMENT, UMLPackage.NODE__NAME_EXPRESSION, UMLPackage.NODE__ELEMENT_IMPORT, UMLPackage.NODE__PACKAGE_IMPORT, UMLPackage.NODE__OWNED_MEMBER,
+			UMLPackage.NODE__TEMPLATE_BINDING, UMLPackage.NODE__OWNED_TEMPLATE_SIGNATURE, UMLPackage.NODE__COLLABORATION_USE, UMLPackage.NODE__GENERALIZATION, UMLPackage.NODE__SUBSTITUTION, UMLPackage.NODE__INTERFACE_REALIZATION, UMLPackage.NODE__DEPLOYMENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1447,8 +1274,7 @@
 	 * @generated
 	 */
 	public Deployment createDeployment(String name) {
-		Deployment newDeployment = (Deployment) create(
-			UMLPackage.Literals.DEPLOYMENT);
+		Deployment newDeployment = (Deployment) create(UMLPackage.Literals.DEPLOYMENT);
 		getDeployments().add(newDeployment);
 		if (name != null)
 			newDeployment.setName(name);
@@ -1471,16 +1297,12 @@
 	 */
 	public Deployment getDeployment(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		deploymentLoop : for (Deployment deployment : getDeployments()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(deployment.getName())
-				: name.equals(deployment.getName())))
+		deploymentLoop: for (Deployment deployment : getDeployments()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(deployment.getName()) : name.equals(deployment.getName())))
 				continue deploymentLoop;
 			return deployment;
 		}
-		return createOnDemand
-			? createDeployment(name)
-			: null;
+		return createOnDemand ? createDeployment(name) : null;
 	}
 
 	/**
@@ -1491,7 +1313,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.NODE__DEPLOYMENT);
+				|| eIsSet(UMLPackage.NODE__DEPLOYMENT);
 	}
 
 	/**
@@ -1502,12 +1324,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.NODE__OWNED_RULE, UMLPackage.NODE__OWNED_USE_CASE,
-		UMLPackage.NODE__OWNED_ATTRIBUTE, UMLPackage.NODE__OWNED_CONNECTOR,
-		UMLPackage.NODE__OWNED_BEHAVIOR, UMLPackage.NODE__OWNED_OPERATION,
-		UMLPackage.NODE__NESTED_CLASSIFIER, UMLPackage.NODE__OWNED_RECEPTION,
-		UMLPackage.NODE__NESTED_NODE};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.NODE__OWNED_RULE, UMLPackage.NODE__OWNED_USE_CASE, UMLPackage.NODE__OWNED_ATTRIBUTE, UMLPackage.NODE__OWNED_CONNECTOR, UMLPackage.NODE__OWNED_BEHAVIOR,
+			UMLPackage.NODE__OWNED_OPERATION, UMLPackage.NODE__NESTED_CLASSIFIER, UMLPackage.NODE__OWNED_RECEPTION, UMLPackage.NODE__NESTED_NODE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1517,7 +1335,7 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.NODE__NESTED_NODE);
+				|| eIsSet(UMLPackage.NODE__NESTED_NODE);
 	}
 
 } //NodeImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ObjectFlowImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ObjectFlowImpl.java
index f98e435..3fee46e 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ObjectFlowImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ObjectFlowImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,11 +18,17 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+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;
@@ -108,9 +114,7 @@
 	 * @generated
 	 */
 	public boolean isMulticast() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.OBJECT_FLOW__IS_MULTICAST - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_FLOW__IS_MULTICAST, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.OBJECT_FLOW__IS_MULTICAST - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_FLOW__IS_MULTICAST, true, true);
 	}
 
 	/**
@@ -119,9 +123,7 @@
 	 * @generated
 	 */
 	public void setIsMulticast(boolean newIsMulticast) {
-		eDynamicSet(
-			UMLPackage.OBJECT_FLOW__IS_MULTICAST - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_FLOW__IS_MULTICAST, newIsMulticast);
+		eDynamicSet(UMLPackage.OBJECT_FLOW__IS_MULTICAST - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_FLOW__IS_MULTICAST, newIsMulticast);
 	}
 
 	/**
@@ -130,9 +132,7 @@
 	 * @generated
 	 */
 	public boolean isMultireceive() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.OBJECT_FLOW__IS_MULTIRECEIVE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_FLOW__IS_MULTIRECEIVE, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.OBJECT_FLOW__IS_MULTIRECEIVE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_FLOW__IS_MULTIRECEIVE, true, true);
 	}
 
 	/**
@@ -141,10 +141,7 @@
 	 * @generated
 	 */
 	public void setIsMultireceive(boolean newIsMultireceive) {
-		eDynamicSet(
-			UMLPackage.OBJECT_FLOW__IS_MULTIRECEIVE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_FLOW__IS_MULTIRECEIVE,
-			newIsMultireceive);
+		eDynamicSet(UMLPackage.OBJECT_FLOW__IS_MULTIRECEIVE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_FLOW__IS_MULTIRECEIVE, newIsMultireceive);
 	}
 
 	/**
@@ -153,9 +150,7 @@
 	 * @generated
 	 */
 	public Behavior getTransformation() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.OBJECT_FLOW__TRANSFORMATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_FLOW__TRANSFORMATION, true, true);
+		return (Behavior) eDynamicGet(UMLPackage.OBJECT_FLOW__TRANSFORMATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_FLOW__TRANSFORMATION, true, true);
 	}
 
 	/**
@@ -164,9 +159,7 @@
 	 * @generated
 	 */
 	public Behavior basicGetTransformation() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.OBJECT_FLOW__TRANSFORMATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_FLOW__TRANSFORMATION, false, true);
+		return (Behavior) eDynamicGet(UMLPackage.OBJECT_FLOW__TRANSFORMATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_FLOW__TRANSFORMATION, false, true);
 	}
 
 	/**
@@ -175,9 +168,7 @@
 	 * @generated
 	 */
 	public void setTransformation(Behavior newTransformation) {
-		eDynamicSet(
-			UMLPackage.OBJECT_FLOW__TRANSFORMATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_FLOW__TRANSFORMATION, newTransformation);
+		eDynamicSet(UMLPackage.OBJECT_FLOW__TRANSFORMATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_FLOW__TRANSFORMATION, newTransformation);
 	}
 
 	/**
@@ -186,9 +177,7 @@
 	 * @generated
 	 */
 	public Behavior getSelection() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.OBJECT_FLOW__SELECTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_FLOW__SELECTION, true, true);
+		return (Behavior) eDynamicGet(UMLPackage.OBJECT_FLOW__SELECTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_FLOW__SELECTION, true, true);
 	}
 
 	/**
@@ -197,9 +186,7 @@
 	 * @generated
 	 */
 	public Behavior basicGetSelection() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.OBJECT_FLOW__SELECTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_FLOW__SELECTION, false, true);
+		return (Behavior) eDynamicGet(UMLPackage.OBJECT_FLOW__SELECTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_FLOW__SELECTION, false, true);
 	}
 
 	/**
@@ -208,8 +195,7 @@
 	 * @generated
 	 */
 	public void setSelection(Behavior newSelection) {
-		eDynamicSet(UMLPackage.OBJECT_FLOW__SELECTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_FLOW__SELECTION, newSelection);
+		eDynamicSet(UMLPackage.OBJECT_FLOW__SELECTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_FLOW__SELECTION, newSelection);
 	}
 
 	/**
@@ -219,8 +205,7 @@
 	 */
 	public boolean validateCompatibleTypes(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ObjectFlowOperations.validateCompatibleTypes(this, diagnostics,
-			context);
+		return ObjectFlowOperations.validateCompatibleTypes(this, diagnostics, context);
 	}
 
 	/**
@@ -230,8 +215,7 @@
 	 */
 	public boolean validateSameUpperBounds(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ObjectFlowOperations.validateSameUpperBounds(this, diagnostics,
-			context);
+		return ObjectFlowOperations.validateSameUpperBounds(this, diagnostics, context);
 	}
 
 	/**
@@ -251,8 +235,7 @@
 	 */
 	public boolean validateInputAndOutputParameter(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ObjectFlowOperations.validateInputAndOutputParameter(this,
-			diagnostics, context);
+		return ObjectFlowOperations.validateInputAndOutputParameter(this, diagnostics, context);
 	}
 
 	/**
@@ -262,8 +245,7 @@
 	 */
 	public boolean validateNoExecutableNodes(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ObjectFlowOperations.validateNoExecutableNodes(this, diagnostics,
-			context);
+		return ObjectFlowOperations.validateNoExecutableNodes(this, diagnostics, context);
 	}
 
 	/**
@@ -273,8 +255,7 @@
 	 */
 	public boolean validateTransformationBehavior(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ObjectFlowOperations.validateTransformationBehavior(this,
-			diagnostics, context);
+		return ObjectFlowOperations.validateTransformationBehavior(this, diagnostics, context);
 	}
 
 	/**
@@ -284,8 +265,7 @@
 	 */
 	public boolean validateSelectionBehavior(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ObjectFlowOperations.validateSelectionBehavior(this, diagnostics,
-			context);
+		return ObjectFlowOperations.validateSelectionBehavior(this, diagnostics, context);
 	}
 
 	/**
@@ -295,8 +275,7 @@
 	 */
 	public boolean validateIsMulticastOrIsMultireceive(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return ObjectFlowOperations.validateIsMulticastOrIsMultireceive(this,
-			diagnostics, context);
+		return ObjectFlowOperations.validateIsMulticastOrIsMultireceive(this, diagnostics, context);
 	}
 
 	/**
@@ -307,84 +286,84 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.OBJECT_FLOW__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.OBJECT_FLOW__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.OBJECT_FLOW__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.OBJECT_FLOW__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.OBJECT_FLOW__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.OBJECT_FLOW__NAME :
-				return getName();
-			case UMLPackage.OBJECT_FLOW__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.OBJECT_FLOW__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.OBJECT_FLOW__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.OBJECT_FLOW__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.OBJECT_FLOW__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.OBJECT_FLOW__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.OBJECT_FLOW__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.OBJECT_FLOW__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.OBJECT_FLOW__GUARD :
-				if (resolve)
-					return getGuard();
-				return basicGetGuard();
-			case UMLPackage.OBJECT_FLOW__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.OBJECT_FLOW__INTERRUPTS :
-				if (resolve)
-					return getInterrupts();
-				return basicGetInterrupts();
-			case UMLPackage.OBJECT_FLOW__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.OBJECT_FLOW__TARGET :
-				if (resolve)
-					return getTarget();
-				return basicGetTarget();
-			case UMLPackage.OBJECT_FLOW__SOURCE :
-				if (resolve)
-					return getSource();
-				return basicGetSource();
-			case UMLPackage.OBJECT_FLOW__REDEFINED_EDGE :
-				return getRedefinedEdges();
-			case UMLPackage.OBJECT_FLOW__WEIGHT :
-				if (resolve)
-					return getWeight();
-				return basicGetWeight();
-			case UMLPackage.OBJECT_FLOW__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.OBJECT_FLOW__IS_MULTICAST :
-				return isMulticast();
-			case UMLPackage.OBJECT_FLOW__IS_MULTIRECEIVE :
-				return isMultireceive();
-			case UMLPackage.OBJECT_FLOW__SELECTION :
-				if (resolve)
-					return getSelection();
-				return basicGetSelection();
-			case UMLPackage.OBJECT_FLOW__TRANSFORMATION :
-				if (resolve)
-					return getTransformation();
-				return basicGetTransformation();
+		case UMLPackage.OBJECT_FLOW__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.OBJECT_FLOW__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.OBJECT_FLOW__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.OBJECT_FLOW__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.OBJECT_FLOW__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.OBJECT_FLOW__NAME:
+			return getName();
+		case UMLPackage.OBJECT_FLOW__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.OBJECT_FLOW__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.OBJECT_FLOW__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.OBJECT_FLOW__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.OBJECT_FLOW__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.OBJECT_FLOW__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.OBJECT_FLOW__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.OBJECT_FLOW__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.OBJECT_FLOW__GUARD:
+			if (resolve)
+				return getGuard();
+			return basicGetGuard();
+		case UMLPackage.OBJECT_FLOW__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.OBJECT_FLOW__INTERRUPTS:
+			if (resolve)
+				return getInterrupts();
+			return basicGetInterrupts();
+		case UMLPackage.OBJECT_FLOW__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.OBJECT_FLOW__TARGET:
+			if (resolve)
+				return getTarget();
+			return basicGetTarget();
+		case UMLPackage.OBJECT_FLOW__SOURCE:
+			if (resolve)
+				return getSource();
+			return basicGetSource();
+		case UMLPackage.OBJECT_FLOW__REDEFINED_EDGE:
+			return getRedefinedEdges();
+		case UMLPackage.OBJECT_FLOW__WEIGHT:
+			if (resolve)
+				return getWeight();
+			return basicGetWeight();
+		case UMLPackage.OBJECT_FLOW__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.OBJECT_FLOW__IS_MULTICAST:
+			return isMulticast();
+		case UMLPackage.OBJECT_FLOW__IS_MULTIRECEIVE:
+			return isMultireceive();
+		case UMLPackage.OBJECT_FLOW__SELECTION:
+			if (resolve)
+				return getSelection();
+			return basicGetSelection();
+		case UMLPackage.OBJECT_FLOW__TRANSFORMATION:
+			if (resolve)
+				return getTransformation();
+			return basicGetTransformation();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -398,71 +377,67 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.OBJECT_FLOW__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__GUARD :
-				setGuard((ValueSpecification) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__INTERRUPTS :
-				setInterrupts((InterruptibleActivityRegion) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__TARGET :
-				setTarget((ActivityNode) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__SOURCE :
-				setSource((ActivityNode) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__REDEFINED_EDGE :
-				getRedefinedEdges().clear();
-				getRedefinedEdges()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__WEIGHT :
-				setWeight((ValueSpecification) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__IS_MULTICAST :
-				setIsMulticast((Boolean) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__IS_MULTIRECEIVE :
-				setIsMultireceive((Boolean) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__SELECTION :
-				setSelection((Behavior) newValue);
-				return;
-			case UMLPackage.OBJECT_FLOW__TRANSFORMATION :
-				setTransformation((Behavior) newValue);
-				return;
+		case UMLPackage.OBJECT_FLOW__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__GUARD:
+			setGuard((ValueSpecification) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__INTERRUPTS:
+			setInterrupts((InterruptibleActivityRegion) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__TARGET:
+			setTarget((ActivityNode) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__SOURCE:
+			setSource((ActivityNode) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__REDEFINED_EDGE:
+			getRedefinedEdges().clear();
+			getRedefinedEdges().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__WEIGHT:
+			setWeight((ValueSpecification) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__IS_MULTICAST:
+			setIsMulticast((Boolean) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__IS_MULTIRECEIVE:
+			setIsMultireceive((Boolean) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__SELECTION:
+			setSelection((Behavior) newValue);
+			return;
+		case UMLPackage.OBJECT_FLOW__TRANSFORMATION:
+			setTransformation((Behavior) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -475,63 +450,63 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OBJECT_FLOW__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.OBJECT_FLOW__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.OBJECT_FLOW__NAME :
-				unsetName();
-				return;
-			case UMLPackage.OBJECT_FLOW__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.OBJECT_FLOW__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.OBJECT_FLOW__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.OBJECT_FLOW__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.OBJECT_FLOW__GUARD :
-				setGuard((ValueSpecification) null);
-				return;
-			case UMLPackage.OBJECT_FLOW__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.OBJECT_FLOW__INTERRUPTS :
-				setInterrupts((InterruptibleActivityRegion) null);
-				return;
-			case UMLPackage.OBJECT_FLOW__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.OBJECT_FLOW__TARGET :
-				setTarget((ActivityNode) null);
-				return;
-			case UMLPackage.OBJECT_FLOW__SOURCE :
-				setSource((ActivityNode) null);
-				return;
-			case UMLPackage.OBJECT_FLOW__REDEFINED_EDGE :
-				getRedefinedEdges().clear();
-				return;
-			case UMLPackage.OBJECT_FLOW__WEIGHT :
-				setWeight((ValueSpecification) null);
-				return;
-			case UMLPackage.OBJECT_FLOW__IS_MULTICAST :
-				setIsMulticast(IS_MULTICAST_EDEFAULT);
-				return;
-			case UMLPackage.OBJECT_FLOW__IS_MULTIRECEIVE :
-				setIsMultireceive(IS_MULTIRECEIVE_EDEFAULT);
-				return;
-			case UMLPackage.OBJECT_FLOW__SELECTION :
-				setSelection((Behavior) null);
-				return;
-			case UMLPackage.OBJECT_FLOW__TRANSFORMATION :
-				setTransformation((Behavior) null);
-				return;
+		case UMLPackage.OBJECT_FLOW__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.OBJECT_FLOW__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.OBJECT_FLOW__NAME:
+			unsetName();
+			return;
+		case UMLPackage.OBJECT_FLOW__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.OBJECT_FLOW__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.OBJECT_FLOW__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.OBJECT_FLOW__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.OBJECT_FLOW__GUARD:
+			setGuard((ValueSpecification) null);
+			return;
+		case UMLPackage.OBJECT_FLOW__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.OBJECT_FLOW__INTERRUPTS:
+			setInterrupts((InterruptibleActivityRegion) null);
+			return;
+		case UMLPackage.OBJECT_FLOW__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.OBJECT_FLOW__TARGET:
+			setTarget((ActivityNode) null);
+			return;
+		case UMLPackage.OBJECT_FLOW__SOURCE:
+			setSource((ActivityNode) null);
+			return;
+		case UMLPackage.OBJECT_FLOW__REDEFINED_EDGE:
+			getRedefinedEdges().clear();
+			return;
+		case UMLPackage.OBJECT_FLOW__WEIGHT:
+			setWeight((ValueSpecification) null);
+			return;
+		case UMLPackage.OBJECT_FLOW__IS_MULTICAST:
+			setIsMulticast(IS_MULTICAST_EDEFAULT);
+			return;
+		case UMLPackage.OBJECT_FLOW__IS_MULTIRECEIVE:
+			setIsMultireceive(IS_MULTIRECEIVE_EDEFAULT);
+			return;
+		case UMLPackage.OBJECT_FLOW__SELECTION:
+			setSelection((Behavior) null);
+			return;
+		case UMLPackage.OBJECT_FLOW__TRANSFORMATION:
+			setTransformation((Behavior) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -544,62 +519,60 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OBJECT_FLOW__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.OBJECT_FLOW__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.OBJECT_FLOW__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.OBJECT_FLOW__OWNER :
-				return isSetOwner();
-			case UMLPackage.OBJECT_FLOW__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.OBJECT_FLOW__NAME :
-				return isSetName();
-			case UMLPackage.OBJECT_FLOW__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.OBJECT_FLOW__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.OBJECT_FLOW__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.OBJECT_FLOW__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.OBJECT_FLOW__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.OBJECT_FLOW__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.OBJECT_FLOW__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.OBJECT_FLOW__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.OBJECT_FLOW__GUARD :
-				return basicGetGuard() != null;
-			case UMLPackage.OBJECT_FLOW__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.OBJECT_FLOW__INTERRUPTS :
-				return basicGetInterrupts() != null;
-			case UMLPackage.OBJECT_FLOW__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.OBJECT_FLOW__TARGET :
-				return basicGetTarget() != null;
-			case UMLPackage.OBJECT_FLOW__SOURCE :
-				return basicGetSource() != null;
-			case UMLPackage.OBJECT_FLOW__REDEFINED_EDGE :
-				return !getRedefinedEdges().isEmpty();
-			case UMLPackage.OBJECT_FLOW__WEIGHT :
-				return basicGetWeight() != null;
-			case UMLPackage.OBJECT_FLOW__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.OBJECT_FLOW__IS_MULTICAST :
-				return isMulticast() != IS_MULTICAST_EDEFAULT;
-			case UMLPackage.OBJECT_FLOW__IS_MULTIRECEIVE :
-				return isMultireceive() != IS_MULTIRECEIVE_EDEFAULT;
-			case UMLPackage.OBJECT_FLOW__SELECTION :
-				return basicGetSelection() != null;
-			case UMLPackage.OBJECT_FLOW__TRANSFORMATION :
-				return basicGetTransformation() != null;
+		case UMLPackage.OBJECT_FLOW__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.OBJECT_FLOW__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.OBJECT_FLOW__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.OBJECT_FLOW__OWNER:
+			return isSetOwner();
+		case UMLPackage.OBJECT_FLOW__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.OBJECT_FLOW__NAME:
+			return isSetName();
+		case UMLPackage.OBJECT_FLOW__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.OBJECT_FLOW__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.OBJECT_FLOW__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.OBJECT_FLOW__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.OBJECT_FLOW__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.OBJECT_FLOW__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.OBJECT_FLOW__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.OBJECT_FLOW__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.OBJECT_FLOW__GUARD:
+			return basicGetGuard() != null;
+		case UMLPackage.OBJECT_FLOW__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.OBJECT_FLOW__INTERRUPTS:
+			return basicGetInterrupts() != null;
+		case UMLPackage.OBJECT_FLOW__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.OBJECT_FLOW__TARGET:
+			return basicGetTarget() != null;
+		case UMLPackage.OBJECT_FLOW__SOURCE:
+			return basicGetSource() != null;
+		case UMLPackage.OBJECT_FLOW__REDEFINED_EDGE:
+			return !getRedefinedEdges().isEmpty();
+		case UMLPackage.OBJECT_FLOW__WEIGHT:
+			return basicGetWeight() != null;
+		case UMLPackage.OBJECT_FLOW__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.OBJECT_FLOW__IS_MULTICAST:
+			return isMulticast() != IS_MULTICAST_EDEFAULT;
+		case UMLPackage.OBJECT_FLOW__IS_MULTIRECEIVE:
+			return isMultireceive() != IS_MULTIRECEIVE_EDEFAULT;
+		case UMLPackage.OBJECT_FLOW__SELECTION:
+			return basicGetSelection() != null;
+		case UMLPackage.OBJECT_FLOW__TRANSFORMATION:
+			return basicGetTransformation() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -614,177 +587,138 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.OBJECT_FLOW___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.OBJECT_FLOW___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.OBJECT_FLOW___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.OBJECT_FLOW___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.OBJECT_FLOW___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___GET_MODEL :
-				return getModel();
-			case UMLPackage.OBJECT_FLOW___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.OBJECT_FLOW___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.OBJECT_FLOW___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.OBJECT_FLOW___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.OBJECT_FLOW___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.OBJECT_FLOW___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.OBJECT_FLOW___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.OBJECT_FLOW___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.OBJECT_FLOW___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.OBJECT_FLOW___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___GET_LABEL :
-				return getLabel();
-			case UMLPackage.OBJECT_FLOW___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.OBJECT_FLOW___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.OBJECT_FLOW___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.OBJECT_FLOW___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.OBJECT_FLOW___SEPARATOR :
-				return separator();
-			case UMLPackage.OBJECT_FLOW___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.OBJECT_FLOW___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.OBJECT_FLOW___VALIDATE_SOURCE_AND_TARGET__DIAGNOSTICCHAIN_MAP :
-				return validateSourceAndTarget(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___VALIDATE_INPUT_AND_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP :
-				return validateInputAndOutputParameter(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___VALIDATE_NO_EXECUTABLE_NODES__DIAGNOSTICCHAIN_MAP :
-				return validateNoExecutableNodes(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___VALIDATE_TRANSFORMATION_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateTransformationBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateSelectionBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___VALIDATE_COMPATIBLE_TYPES__DIAGNOSTICCHAIN_MAP :
-				return validateCompatibleTypes(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___VALIDATE_SAME_UPPER_BOUNDS__DIAGNOSTICCHAIN_MAP :
-				return validateSameUpperBounds(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___VALIDATE_TARGET__DIAGNOSTICCHAIN_MAP :
-				return validateTarget((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_FLOW___VALIDATE_IS_MULTICAST_OR_IS_MULTIRECEIVE__DIAGNOSTICCHAIN_MAP :
-				return validateIsMulticastOrIsMultireceive(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.OBJECT_FLOW___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.OBJECT_FLOW___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.OBJECT_FLOW___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.OBJECT_FLOW___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___GET_MODEL:
+			return getModel();
+		case UMLPackage.OBJECT_FLOW___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.OBJECT_FLOW___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.OBJECT_FLOW___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.OBJECT_FLOW___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.OBJECT_FLOW___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.OBJECT_FLOW___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.OBJECT_FLOW___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.OBJECT_FLOW___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.OBJECT_FLOW___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.OBJECT_FLOW___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___GET_LABEL:
+			return getLabel();
+		case UMLPackage.OBJECT_FLOW___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.OBJECT_FLOW___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.OBJECT_FLOW___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.OBJECT_FLOW___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.OBJECT_FLOW___SEPARATOR:
+			return separator();
+		case UMLPackage.OBJECT_FLOW___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.OBJECT_FLOW___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.OBJECT_FLOW___VALIDATE_SOURCE_AND_TARGET__DIAGNOSTICCHAIN_MAP:
+			return validateSourceAndTarget((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___VALIDATE_INPUT_AND_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP:
+			return validateInputAndOutputParameter((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___VALIDATE_NO_EXECUTABLE_NODES__DIAGNOSTICCHAIN_MAP:
+			return validateNoExecutableNodes((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___VALIDATE_TRANSFORMATION_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateTransformationBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateSelectionBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___VALIDATE_COMPATIBLE_TYPES__DIAGNOSTICCHAIN_MAP:
+			return validateCompatibleTypes((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___VALIDATE_SAME_UPPER_BOUNDS__DIAGNOSTICCHAIN_MAP:
+			return validateSameUpperBounds((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___VALIDATE_TARGET__DIAGNOSTICCHAIN_MAP:
+			return validateTarget((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_FLOW___VALIDATE_IS_MULTICAST_OR_IS_MULTIRECEIVE__DIAGNOSTICCHAIN_MAP:
+			return validateIsMulticastOrIsMultireceive((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ObjectNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ObjectNodeImpl.java
index 78919df..e794bc0 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ObjectNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ObjectNodeImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,8 +29,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -128,9 +132,7 @@
 	 * @generated
 	 */
 	public Type getType() {
-		return (Type) eDynamicGet(
-			UMLPackage.OBJECT_NODE__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TYPED_ELEMENT__TYPE, true, true);
+		return (Type) eDynamicGet(UMLPackage.OBJECT_NODE__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TYPED_ELEMENT__TYPE, true, true);
 	}
 
 	/**
@@ -139,9 +141,7 @@
 	 * @generated
 	 */
 	public Type basicGetType() {
-		return (Type) eDynamicGet(
-			UMLPackage.OBJECT_NODE__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TYPED_ELEMENT__TYPE, false, true);
+		return (Type) eDynamicGet(UMLPackage.OBJECT_NODE__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TYPED_ELEMENT__TYPE, false, true);
 	}
 
 	/**
@@ -150,8 +150,7 @@
 	 * @generated
 	 */
 	public void setType(Type newType) {
-		eDynamicSet(UMLPackage.OBJECT_NODE__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TYPED_ELEMENT__TYPE, newType);
+		eDynamicSet(UMLPackage.OBJECT_NODE__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TYPED_ELEMENT__TYPE, newType);
 	}
 
 	/**
@@ -165,20 +164,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.OBJECT_NODE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.OBJECT_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.OBJECT_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.OBJECT_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -187,9 +179,7 @@
 	 * @generated
 	 */
 	public ObjectNodeOrderingKind getOrdering() {
-		return (ObjectNodeOrderingKind) eDynamicGet(
-			UMLPackage.OBJECT_NODE__ORDERING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_NODE__ORDERING, true, true);
+		return (ObjectNodeOrderingKind) eDynamicGet(UMLPackage.OBJECT_NODE__ORDERING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_NODE__ORDERING, true, true);
 	}
 
 	/**
@@ -198,8 +188,7 @@
 	 * @generated
 	 */
 	public void setOrdering(ObjectNodeOrderingKind newOrdering) {
-		eDynamicSet(UMLPackage.OBJECT_NODE__ORDERING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_NODE__ORDERING, newOrdering);
+		eDynamicSet(UMLPackage.OBJECT_NODE__ORDERING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_NODE__ORDERING, newOrdering);
 	}
 
 	/**
@@ -208,9 +197,7 @@
 	 * @generated
 	 */
 	public boolean isControlType() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.OBJECT_NODE__IS_CONTROL_TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_NODE__IS_CONTROL_TYPE, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.OBJECT_NODE__IS_CONTROL_TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_NODE__IS_CONTROL_TYPE, true, true);
 	}
 
 	/**
@@ -219,9 +206,7 @@
 	 * @generated
 	 */
 	public void setIsControlType(boolean newIsControlType) {
-		eDynamicSet(
-			UMLPackage.OBJECT_NODE__IS_CONTROL_TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_NODE__IS_CONTROL_TYPE, newIsControlType);
+		eDynamicSet(UMLPackage.OBJECT_NODE__IS_CONTROL_TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_NODE__IS_CONTROL_TYPE, newIsControlType);
 	}
 
 	/**
@@ -230,9 +215,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getUpperBound() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.OBJECT_NODE__UPPER_BOUND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_NODE__UPPER_BOUND, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.OBJECT_NODE__UPPER_BOUND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_NODE__UPPER_BOUND, true, true);
 	}
 
 	/**
@@ -241,9 +224,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetUpperBound() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.OBJECT_NODE__UPPER_BOUND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_NODE__UPPER_BOUND, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.OBJECT_NODE__UPPER_BOUND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_NODE__UPPER_BOUND, false, true);
 	}
 
 	/**
@@ -253,8 +234,7 @@
 	 */
 	public NotificationChain basicSetUpperBound(
 			ValueSpecification newUpperBound, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newUpperBound,
-			UMLPackage.OBJECT_NODE__UPPER_BOUND, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newUpperBound, UMLPackage.OBJECT_NODE__UPPER_BOUND, msgs);
 		return msgs;
 	}
 
@@ -264,8 +244,7 @@
 	 * @generated
 	 */
 	public void setUpperBound(ValueSpecification newUpperBound) {
-		eDynamicSet(UMLPackage.OBJECT_NODE__UPPER_BOUND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_NODE__UPPER_BOUND, newUpperBound);
+		eDynamicSet(UMLPackage.OBJECT_NODE__UPPER_BOUND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_NODE__UPPER_BOUND, newUpperBound);
 	}
 
 	/**
@@ -291,9 +270,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<State> getInStates() {
-		return (EList<State>) eDynamicGet(
-			UMLPackage.OBJECT_NODE__IN_STATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_NODE__IN_STATE, true, true);
+		return (EList<State>) eDynamicGet(UMLPackage.OBJECT_NODE__IN_STATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_NODE__IN_STATE, true, true);
 	}
 
 	/**
@@ -311,12 +288,10 @@
 	 * @generated
 	 */
 	public State getInState(String name, boolean ignoreCase, EClass eClass) {
-		inStateLoop : for (State inState : getInStates()) {
+		inStateLoop: for (State inState : getInStates()) {
 			if (eClass != null && !eClass.isInstance(inState))
 				continue inStateLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(inState.getName())
-				: name.equals(inState.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(inState.getName()) : name.equals(inState.getName())))
 				continue inStateLoop;
 			return inState;
 		}
@@ -329,9 +304,7 @@
 	 * @generated
 	 */
 	public Behavior getSelection() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.OBJECT_NODE__SELECTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_NODE__SELECTION, true, true);
+		return (Behavior) eDynamicGet(UMLPackage.OBJECT_NODE__SELECTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_NODE__SELECTION, true, true);
 	}
 
 	/**
@@ -340,9 +313,7 @@
 	 * @generated
 	 */
 	public Behavior basicGetSelection() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.OBJECT_NODE__SELECTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_NODE__SELECTION, false, true);
+		return (Behavior) eDynamicGet(UMLPackage.OBJECT_NODE__SELECTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_NODE__SELECTION, false, true);
 	}
 
 	/**
@@ -351,8 +322,7 @@
 	 * @generated
 	 */
 	public void setSelection(Behavior newSelection) {
-		eDynamicSet(UMLPackage.OBJECT_NODE__SELECTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OBJECT_NODE__SELECTION, newSelection);
+		eDynamicSet(UMLPackage.OBJECT_NODE__SELECTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OBJECT_NODE__SELECTION, newSelection);
 	}
 
 	/**
@@ -362,8 +332,7 @@
 	 */
 	public boolean validateObjectFlowEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ObjectNodeOperations.validateObjectFlowEdges(this, diagnostics,
-			context);
+		return ObjectNodeOperations.validateObjectFlowEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -373,8 +342,7 @@
 	 */
 	public boolean validateSelectionBehavior(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ObjectNodeOperations.validateSelectionBehavior(this, diagnostics,
-			context);
+		return ObjectNodeOperations.validateSelectionBehavior(this, diagnostics, context);
 	}
 
 	/**
@@ -384,8 +352,7 @@
 	 */
 	public boolean validateInputOutputParameter(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ObjectNodeOperations.validateInputOutputParameter(this,
-			diagnostics, context);
+		return ObjectNodeOperations.validateInputOutputParameter(this, diagnostics, context);
 	}
 
 	/**
@@ -397,30 +364,24 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.OBJECT_NODE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OBJECT_NODE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OBJECT_NODE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.OBJECT_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OBJECT_NODE__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.OBJECT_NODE__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.OBJECT_NODE__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.OBJECT_NODE__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OBJECT_NODE__UPPER_BOUND :
-				return basicSetUpperBound(null, msgs);
+		case UMLPackage.OBJECT_NODE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OBJECT_NODE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OBJECT_NODE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.OBJECT_NODE__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OBJECT_NODE__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.OBJECT_NODE__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OBJECT_NODE__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OBJECT_NODE__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OBJECT_NODE__UPPER_BOUND:
+			return basicSetUpperBound(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -433,76 +394,76 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.OBJECT_NODE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.OBJECT_NODE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.OBJECT_NODE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.OBJECT_NODE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.OBJECT_NODE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.OBJECT_NODE__NAME :
-				return getName();
-			case UMLPackage.OBJECT_NODE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.OBJECT_NODE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.OBJECT_NODE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.OBJECT_NODE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.OBJECT_NODE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.OBJECT_NODE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.OBJECT_NODE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.OBJECT_NODE__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.OBJECT_NODE__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.OBJECT_NODE__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.OBJECT_NODE__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.OBJECT_NODE__INCOMING :
-				return getIncomings();
-			case UMLPackage.OBJECT_NODE__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.OBJECT_NODE__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.OBJECT_NODE__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.OBJECT_NODE__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.OBJECT_NODE__IN_STATE :
-				return getInStates();
-			case UMLPackage.OBJECT_NODE__IS_CONTROL_TYPE :
-				return isControlType();
-			case UMLPackage.OBJECT_NODE__ORDERING :
-				return getOrdering();
-			case UMLPackage.OBJECT_NODE__SELECTION :
-				if (resolve)
-					return getSelection();
-				return basicGetSelection();
-			case UMLPackage.OBJECT_NODE__UPPER_BOUND :
-				if (resolve)
-					return getUpperBound();
-				return basicGetUpperBound();
+		case UMLPackage.OBJECT_NODE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.OBJECT_NODE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.OBJECT_NODE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.OBJECT_NODE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.OBJECT_NODE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.OBJECT_NODE__NAME:
+			return getName();
+		case UMLPackage.OBJECT_NODE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.OBJECT_NODE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.OBJECT_NODE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.OBJECT_NODE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.OBJECT_NODE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.OBJECT_NODE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.OBJECT_NODE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.OBJECT_NODE__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.OBJECT_NODE__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.OBJECT_NODE__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.OBJECT_NODE__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.OBJECT_NODE__INCOMING:
+			return getIncomings();
+		case UMLPackage.OBJECT_NODE__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.OBJECT_NODE__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.OBJECT_NODE__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.OBJECT_NODE__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.OBJECT_NODE__IN_STATE:
+			return getInStates();
+		case UMLPackage.OBJECT_NODE__IS_CONTROL_TYPE:
+			return isControlType();
+		case UMLPackage.OBJECT_NODE__ORDERING:
+			return getOrdering();
+		case UMLPackage.OBJECT_NODE__SELECTION:
+			if (resolve)
+				return getSelection();
+			return basicGetSelection();
+		case UMLPackage.OBJECT_NODE__UPPER_BOUND:
+			if (resolve)
+				return getUpperBound();
+			return basicGetUpperBound();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -516,78 +477,71 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.OBJECT_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__IN_STATE :
-				getInStates().clear();
-				getInStates().addAll((Collection<? extends State>) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__IS_CONTROL_TYPE :
-				setIsControlType((Boolean) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__ORDERING :
-				setOrdering((ObjectNodeOrderingKind) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__SELECTION :
-				setSelection((Behavior) newValue);
-				return;
-			case UMLPackage.OBJECT_NODE__UPPER_BOUND :
-				setUpperBound((ValueSpecification) newValue);
-				return;
+		case UMLPackage.OBJECT_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__IN_STATE:
+			getInStates().clear();
+			getInStates().addAll((Collection<? extends State>) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__IS_CONTROL_TYPE:
+			setIsControlType((Boolean) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__ORDERING:
+			setOrdering((ObjectNodeOrderingKind) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__SELECTION:
+			setSelection((Behavior) newValue);
+			return;
+		case UMLPackage.OBJECT_NODE__UPPER_BOUND:
+			setUpperBound((ValueSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -600,63 +554,63 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OBJECT_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.OBJECT_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.OBJECT_NODE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.OBJECT_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.OBJECT_NODE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.OBJECT_NODE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.OBJECT_NODE__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.OBJECT_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.OBJECT_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.OBJECT_NODE__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.OBJECT_NODE__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.OBJECT_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.OBJECT_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.OBJECT_NODE__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.OBJECT_NODE__IN_STATE :
-				getInStates().clear();
-				return;
-			case UMLPackage.OBJECT_NODE__IS_CONTROL_TYPE :
-				setIsControlType(IS_CONTROL_TYPE_EDEFAULT);
-				return;
-			case UMLPackage.OBJECT_NODE__ORDERING :
-				setOrdering(ORDERING_EDEFAULT);
-				return;
-			case UMLPackage.OBJECT_NODE__SELECTION :
-				setSelection((Behavior) null);
-				return;
-			case UMLPackage.OBJECT_NODE__UPPER_BOUND :
-				setUpperBound((ValueSpecification) null);
-				return;
+		case UMLPackage.OBJECT_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.OBJECT_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.OBJECT_NODE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.OBJECT_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.OBJECT_NODE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.OBJECT_NODE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.OBJECT_NODE__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.OBJECT_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.OBJECT_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.OBJECT_NODE__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.OBJECT_NODE__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.OBJECT_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.OBJECT_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.OBJECT_NODE__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.OBJECT_NODE__IN_STATE:
+			getInStates().clear();
+			return;
+		case UMLPackage.OBJECT_NODE__IS_CONTROL_TYPE:
+			setIsControlType(IS_CONTROL_TYPE_EDEFAULT);
+			return;
+		case UMLPackage.OBJECT_NODE__ORDERING:
+			setOrdering(ORDERING_EDEFAULT);
+			return;
+		case UMLPackage.OBJECT_NODE__SELECTION:
+			setSelection((Behavior) null);
+			return;
+		case UMLPackage.OBJECT_NODE__UPPER_BOUND:
+			setUpperBound((ValueSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -669,62 +623,60 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OBJECT_NODE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.OBJECT_NODE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.OBJECT_NODE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.OBJECT_NODE__OWNER :
-				return isSetOwner();
-			case UMLPackage.OBJECT_NODE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.OBJECT_NODE__NAME :
-				return isSetName();
-			case UMLPackage.OBJECT_NODE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.OBJECT_NODE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.OBJECT_NODE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.OBJECT_NODE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.OBJECT_NODE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.OBJECT_NODE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.OBJECT_NODE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.OBJECT_NODE__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.OBJECT_NODE__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.OBJECT_NODE__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.OBJECT_NODE__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.OBJECT_NODE__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.OBJECT_NODE__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.OBJECT_NODE__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.OBJECT_NODE__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.OBJECT_NODE__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.OBJECT_NODE__IN_STATE :
-				return !getInStates().isEmpty();
-			case UMLPackage.OBJECT_NODE__IS_CONTROL_TYPE :
-				return isControlType() != IS_CONTROL_TYPE_EDEFAULT;
-			case UMLPackage.OBJECT_NODE__ORDERING :
-				return getOrdering() != ORDERING_EDEFAULT;
-			case UMLPackage.OBJECT_NODE__SELECTION :
-				return basicGetSelection() != null;
-			case UMLPackage.OBJECT_NODE__UPPER_BOUND :
-				return basicGetUpperBound() != null;
+		case UMLPackage.OBJECT_NODE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.OBJECT_NODE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.OBJECT_NODE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.OBJECT_NODE__OWNER:
+			return isSetOwner();
+		case UMLPackage.OBJECT_NODE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.OBJECT_NODE__NAME:
+			return isSetName();
+		case UMLPackage.OBJECT_NODE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.OBJECT_NODE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.OBJECT_NODE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.OBJECT_NODE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.OBJECT_NODE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.OBJECT_NODE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.OBJECT_NODE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.OBJECT_NODE__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.OBJECT_NODE__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.OBJECT_NODE__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.OBJECT_NODE__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.OBJECT_NODE__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.OBJECT_NODE__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.OBJECT_NODE__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.OBJECT_NODE__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.OBJECT_NODE__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.OBJECT_NODE__IN_STATE:
+			return !getInStates().isEmpty();
+		case UMLPackage.OBJECT_NODE__IS_CONTROL_TYPE:
+			return isControlType() != IS_CONTROL_TYPE_EDEFAULT;
+		case UMLPackage.OBJECT_NODE__ORDERING:
+			return getOrdering() != ORDERING_EDEFAULT;
+		case UMLPackage.OBJECT_NODE__SELECTION:
+			return basicGetSelection() != null;
+		case UMLPackage.OBJECT_NODE__UPPER_BOUND:
+			return basicGetUpperBound() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -739,10 +691,10 @@
 			Class<?> baseClass) {
 		if (baseClass == TypedElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.OBJECT_NODE__TYPE :
-					return UMLPackage.TYPED_ELEMENT__TYPE;
-				default :
-					return -1;
+			case UMLPackage.OBJECT_NODE__TYPE:
+				return UMLPackage.TYPED_ELEMENT__TYPE;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -758,10 +710,10 @@
 			Class<?> baseClass) {
 		if (baseClass == TypedElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.TYPED_ELEMENT__TYPE :
-					return UMLPackage.OBJECT_NODE__TYPE;
-				default :
-					return -1;
+			case UMLPackage.TYPED_ELEMENT__TYPE:
+				return UMLPackage.OBJECT_NODE__TYPE;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -777,156 +729,128 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.OBJECT_NODE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_NODE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.OBJECT_NODE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.OBJECT_NODE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.OBJECT_NODE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.OBJECT_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OBJECT_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___GET_MODEL :
-				return getModel();
-			case UMLPackage.OBJECT_NODE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.OBJECT_NODE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.OBJECT_NODE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.OBJECT_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.OBJECT_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.OBJECT_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.OBJECT_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OBJECT_NODE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OBJECT_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.OBJECT_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.OBJECT_NODE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.OBJECT_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_NODE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.OBJECT_NODE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.OBJECT_NODE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.OBJECT_NODE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.OBJECT_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.OBJECT_NODE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.OBJECT_NODE___SEPARATOR :
-				return separator();
-			case UMLPackage.OBJECT_NODE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.OBJECT_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.OBJECT_NODE___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.OBJECT_NODE___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP :
-				return validateInputOutputParameter(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_NODE___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateSelectionBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OBJECT_NODE___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateObjectFlowEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_NODE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_NODE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.OBJECT_NODE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.OBJECT_NODE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.OBJECT_NODE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.OBJECT_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OBJECT_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___GET_MODEL:
+			return getModel();
+		case UMLPackage.OBJECT_NODE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.OBJECT_NODE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.OBJECT_NODE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.OBJECT_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.OBJECT_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.OBJECT_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.OBJECT_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OBJECT_NODE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OBJECT_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.OBJECT_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.OBJECT_NODE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.OBJECT_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_NODE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.OBJECT_NODE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.OBJECT_NODE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.OBJECT_NODE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.OBJECT_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.OBJECT_NODE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.OBJECT_NODE___SEPARATOR:
+			return separator();
+		case UMLPackage.OBJECT_NODE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.OBJECT_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.OBJECT_NODE___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.OBJECT_NODE___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP:
+			return validateInputOutputParameter((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_NODE___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateSelectionBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OBJECT_NODE___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateObjectFlowEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -939,10 +863,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.OBJECT_NODE__OWNED_COMMENT,
-		UMLPackage.OBJECT_NODE__NAME_EXPRESSION,
-		UMLPackage.OBJECT_NODE__UPPER_BOUND};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.OBJECT_NODE__OWNED_COMMENT, UMLPackage.OBJECT_NODE__NAME_EXPRESSION, UMLPackage.OBJECT_NODE__UPPER_BOUND };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -952,7 +873,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.OBJECT_NODE__UPPER_BOUND);
+				|| eIsSet(UMLPackage.OBJECT_NODE__UPPER_BOUND);
 	}
 
 } //ObjectNodeImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ObservationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ObservationImpl.java
index cc764cb..dd2ab65 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ObservationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ObservationImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OccurrenceSpecificationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OccurrenceSpecificationImpl.java
index 190fdbb..f323cd7 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OccurrenceSpecificationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OccurrenceSpecificationImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 297216, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -24,6 +25,7 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Comment;
@@ -85,11 +87,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<GeneralOrdering> getToBefores() {
-		return (EList<GeneralOrdering>) eDynamicGet(
-			UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OCCURRENCE_SPECIFICATION__TO_BEFORE, true,
-			true);
+		return (EList<GeneralOrdering>) eDynamicGet(UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OCCURRENCE_SPECIFICATION__TO_BEFORE, true, true);
 	}
 
 	/**
@@ -107,10 +105,8 @@
 	 * @generated
 	 */
 	public GeneralOrdering getToBefore(String name, boolean ignoreCase) {
-		toBeforeLoop : for (GeneralOrdering toBefore : getToBefores()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(toBefore.getName())
-				: name.equals(toBefore.getName())))
+		toBeforeLoop: for (GeneralOrdering toBefore : getToBefores()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(toBefore.getName()) : name.equals(toBefore.getName())))
 				continue toBeforeLoop;
 			return toBefore;
 		}
@@ -124,10 +120,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<GeneralOrdering> getToAfters() {
-		return (EList<GeneralOrdering>) eDynamicGet(
-			UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OCCURRENCE_SPECIFICATION__TO_AFTER, true, true);
+		return (EList<GeneralOrdering>) eDynamicGet(UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OCCURRENCE_SPECIFICATION__TO_AFTER, true, true);
 	}
 
 	/**
@@ -145,10 +138,8 @@
 	 * @generated
 	 */
 	public GeneralOrdering getToAfter(String name, boolean ignoreCase) {
-		toAfterLoop : for (GeneralOrdering toAfter : getToAfters()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(toAfter.getName())
-				: name.equals(toAfter.getName())))
+		toAfterLoop: for (GeneralOrdering toAfter : getToAfters()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(toAfter.getName()) : name.equals(toAfter.getName())))
 				continue toAfterLoop;
 			return toAfter;
 		}
@@ -163,10 +154,7 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Lifeline> getCovereds() {
-		return (EList<Lifeline>) eDynamicGet(
-			UMLPackage.OCCURRENCE_SPECIFICATION__COVERED
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__COVERED, true, true);
+		return (EList<Lifeline>) eDynamicGet(UMLPackage.OCCURRENCE_SPECIFICATION__COVERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__COVERED, true, true);
 	}
 
 	/**
@@ -174,7 +162,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Lifeline getCovered(String name) {
 		return getCovered(name, false);
 	}
@@ -184,12 +171,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Lifeline getCovered(String name, boolean ignoreCase) {
-		coveredLoop : for (Lifeline covered : getCovereds()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(covered.getName())
-				: name.equals(covered.getName())))
+		coveredLoop: for (Lifeline covered : getCovereds()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(covered.getName()) : name.equals(covered.getName())))
 				continue coveredLoop;
 			return covered;
 		}
@@ -233,28 +217,22 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.OCCURRENCE_SPECIFICATION__COVERED :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getCovereds())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetEnclosingOperand((InteractionOperand) otherEnd,
-					msgs);
-			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetEnclosingInteraction((Interaction) otherEnd,
-					msgs);
-			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getToAfters())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getToBefores())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.OCCURRENCE_SPECIFICATION__COVERED:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getCovereds()).basicAdd(otherEnd, msgs);
+		case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetEnclosingOperand((InteractionOperand) otherEnd, msgs);
+		case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetEnclosingInteraction((Interaction) otherEnd, msgs);
+		case UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getToAfters()).basicAdd(otherEnd, msgs);
+		case UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getToBefores()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -268,30 +246,24 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.OCCURRENCE_SPECIFICATION__COVERED :
-				return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND :
-				return basicSetEnclosingOperand(null, msgs);
-			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
-				return basicSetEnclosingInteraction(null, msgs);
-			case UMLPackage.OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
-				return ((InternalEList<?>) getGeneralOrderings())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER :
-				return ((InternalEList<?>) getToAfters()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				return ((InternalEList<?>) getToBefores()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OCCURRENCE_SPECIFICATION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.OCCURRENCE_SPECIFICATION__COVERED:
+			return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND:
+			return basicSetEnclosingOperand(null, msgs);
+		case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION:
+			return basicSetEnclosingInteraction(null, msgs);
+		case UMLPackage.OCCURRENCE_SPECIFICATION__GENERAL_ORDERING:
+			return ((InternalEList<?>) getGeneralOrderings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER:
+			return ((InternalEList<?>) getToAfters()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE:
+			return ((InternalEList<?>) getToBefores()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -304,48 +276,48 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__NAME :
-				return getName();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__COVERED :
-				return getCovereds();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND :
-				if (resolve)
-					return getEnclosingOperand();
-				return basicGetEnclosingOperand();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
-				if (resolve)
-					return getEnclosingInteraction();
-				return basicGetEnclosingInteraction();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
-				return getGeneralOrderings();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER :
-				return getToAfters();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				return getToBefores();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__NAME:
+			return getName();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__COVERED:
+			return getCovereds();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND:
+			if (resolve)
+				return getEnclosingOperand();
+			return basicGetEnclosingOperand();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION:
+			if (resolve)
+				return getEnclosingInteraction();
+			return basicGetEnclosingInteraction();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__GENERAL_ORDERING:
+			return getGeneralOrderings();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER:
+			return getToAfters();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE:
+			return getToBefores();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -359,50 +331,45 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__COVERED :
-				getCovereds().clear();
-				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) newValue);
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				getGeneralOrderings()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER :
-				getToAfters().clear();
-				getToAfters()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				getToBefores().clear();
-				getToBefores()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__COVERED:
+			getCovereds().clear();
+			getCovereds().addAll((Collection<? extends Lifeline>) newValue);
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) newValue);
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			getGeneralOrderings().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER:
+			getToAfters().clear();
+			getToAfters().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE:
+			getToBefores().clear();
+			getToBefores().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -415,39 +382,39 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__COVERED :
-				getCovereds().clear();
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) null);
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) null);
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER :
-				getToAfters().clear();
-				return;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				getToBefores().clear();
-				return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__COVERED:
+			getCovereds().clear();
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) null);
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) null);
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER:
+			getToAfters().clear();
+			return;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE:
+			getToBefores().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -460,40 +427,38 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__NAME :
-				return isSetName();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.OCCURRENCE_SPECIFICATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__COVERED :
-				return isSetCovereds();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND :
-				return basicGetEnclosingOperand() != null;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION :
-				return basicGetEnclosingInteraction() != null;
-			case UMLPackage.OCCURRENCE_SPECIFICATION__GENERAL_ORDERING :
-				return !getGeneralOrderings().isEmpty();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER :
-				return !getToAfters().isEmpty();
-			case UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE :
-				return !getToBefores().isEmpty();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__NAME:
+			return isSetName();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.OCCURRENCE_SPECIFICATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__COVERED:
+			return isSetCovereds();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_OPERAND:
+			return basicGetEnclosingOperand() != null;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__ENCLOSING_INTERACTION:
+			return basicGetEnclosingInteraction() != null;
+		case UMLPackage.OCCURRENCE_SPECIFICATION__GENERAL_ORDERING:
+			return !getGeneralOrderings().isEmpty();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__TO_AFTER:
+			return !getToAfters().isEmpty();
+		case UMLPackage.OCCURRENCE_SPECIFICATION__TO_BEFORE:
+			return !getToBefores().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -508,130 +473,115 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.OCCURRENCE_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___SEPARATOR :
-				return separator();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___GET_COVERED :
-				return getCovered();
-			case UMLPackage.OCCURRENCE_SPECIFICATION___SET_COVERED__LIFELINE :
-				setCovered((Lifeline) arguments.get(0));
-				return null;
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.OCCURRENCE_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___SEPARATOR:
+			return separator();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___GET_COVERED:
+			return getCovered();
+		case UMLPackage.OCCURRENCE_SPECIFICATION___SET_COVERED__LIFELINE:
+			setCovered((Lifeline) arguments.get(0));
+			return null;
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OpaqueActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OpaqueActionImpl.java
index 0372bee..26fa63b 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OpaqueActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OpaqueActionImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
- *   Kenn Hussey - 519572
+ *   Kenn Hussey - 519572, 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -27,6 +27,10 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EDataTypeEList;
+import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -106,18 +110,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this, UMLPackage.OPAQUE_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.OPAQUE_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.OPAQUE_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.OPAQUE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -131,18 +130,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						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>(OutputPin.class, this,
-			UMLPackage.OPAQUE_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.OPAQUE_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -152,9 +146,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<String> getBodies() {
-		return (EList<String>) eDynamicGet(
-			UMLPackage.OPAQUE_ACTION__BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_ACTION__BODY, true, true);
+		return (EList<String>) eDynamicGet(UMLPackage.OPAQUE_ACTION__BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_ACTION__BODY, true, true);
 	}
 
 	/**
@@ -163,8 +155,7 @@
 	 * @generated
 	 */
 	public void unsetBodies() {
-		eDynamicUnset(UMLPackage.OPAQUE_ACTION__BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_ACTION__BODY);
+		eDynamicUnset(UMLPackage.OPAQUE_ACTION__BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_ACTION__BODY);
 	}
 
 	/**
@@ -173,9 +164,7 @@
 	 * @generated
 	 */
 	public boolean isSetBodies() {
-		return eDynamicIsSet(
-			UMLPackage.OPAQUE_ACTION__BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_ACTION__BODY);
+		return eDynamicIsSet(UMLPackage.OPAQUE_ACTION__BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_ACTION__BODY);
 	}
 
 	/**
@@ -185,9 +174,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<String> getLanguages() {
-		return (EList<String>) eDynamicGet(
-			UMLPackage.OPAQUE_ACTION__LANGUAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_ACTION__LANGUAGE, true, true);
+		return (EList<String>) eDynamicGet(UMLPackage.OPAQUE_ACTION__LANGUAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_ACTION__LANGUAGE, true, true);
 	}
 
 	/**
@@ -196,9 +183,7 @@
 	 * @generated
 	 */
 	public void unsetLanguages() {
-		eDynamicUnset(
-			UMLPackage.OPAQUE_ACTION__LANGUAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_ACTION__LANGUAGE);
+		eDynamicUnset(UMLPackage.OPAQUE_ACTION__LANGUAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_ACTION__LANGUAGE);
 	}
 
 	/**
@@ -207,9 +192,7 @@
 	 * @generated
 	 */
 	public boolean isSetLanguages() {
-		return eDynamicIsSet(
-			UMLPackage.OPAQUE_ACTION__LANGUAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_ACTION__LANGUAGE);
+		return eDynamicIsSet(UMLPackage.OPAQUE_ACTION__LANGUAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_ACTION__LANGUAGE);
 	}
 
 	/**
@@ -219,9 +202,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<InputPin> getInputValues() {
-		return (EList<InputPin>) eDynamicGet(
-			UMLPackage.OPAQUE_ACTION__INPUT_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_ACTION__INPUT_VALUE, true, true);
+		return (EList<InputPin>) eDynamicGet(UMLPackage.OPAQUE_ACTION__INPUT_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_ACTION__INPUT_VALUE, true, true);
 	}
 
 	/**
@@ -264,20 +245,16 @@
 	 */
 	public InputPin getInputValue(String name, Type type, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		inputValueLoop : for (InputPin inputValue : getInputValues()) {
+		inputValueLoop: for (InputPin inputValue : getInputValues()) {
 			if (eClass != null && !eClass.isInstance(inputValue))
 				continue inputValueLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(inputValue.getName())
-				: name.equals(inputValue.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(inputValue.getName()) : name.equals(inputValue.getName())))
 				continue inputValueLoop;
 			if (type != null && !type.equals(inputValue.getType()))
 				continue inputValueLoop;
 			return inputValue;
 		}
-		return createOnDemand && eClass != null
-			? createInputValue(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createInputValue(name, type, eClass) : null;
 	}
 
 	/**
@@ -297,9 +274,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<OutputPin> getOutputValues() {
-		return (EList<OutputPin>) eDynamicGet(
-			UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_ACTION__OUTPUT_VALUE, true, true);
+		return (EList<OutputPin>) eDynamicGet(UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_ACTION__OUTPUT_VALUE, true, true);
 	}
 
 	/**
@@ -308,8 +283,7 @@
 	 * @generated
 	 */
 	public OutputPin createOutputValue(String name, Type type) {
-		OutputPin newOutputValue = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newOutputValue = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		getOutputValues().add(newOutputValue);
 		if (name != null)
 			newOutputValue.setName(name);
@@ -334,18 +308,14 @@
 	 */
 	public OutputPin getOutputValue(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		outputValueLoop : for (OutputPin outputValue : getOutputValues()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(outputValue.getName())
-				: name.equals(outputValue.getName())))
+		outputValueLoop: for (OutputPin outputValue : getOutputValues()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(outputValue.getName()) : name.equals(outputValue.getName())))
 				continue outputValueLoop;
 			if (type != null && !type.equals(outputValue.getType()))
 				continue outputValueLoop;
 			return outputValue;
 		}
-		return createOnDemand
-			? createOutputValue(name, type)
-			: null;
+		return createOnDemand ? createOutputValue(name, type) : null;
 	}
 
 	/**
@@ -355,8 +325,7 @@
 	 */
 	public boolean validateLanguageBodySize(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return OpaqueActionOperations.validateLanguageBodySize(this,
-			diagnostics, context);
+		return OpaqueActionOperations.validateLanguageBodySize(this, diagnostics, context);
 	}
 
 	/**
@@ -378,43 +347,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.OPAQUE_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OPAQUE_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OPAQUE_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.OPAQUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OPAQUE_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.OPAQUE_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.OPAQUE_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.OPAQUE_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OPAQUE_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.OPAQUE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OPAQUE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OPAQUE_ACTION__INPUT_VALUE :
-				return ((InternalEList<?>) getInputValues())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE :
-				return ((InternalEList<?>) getOutputValues())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.OPAQUE_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPAQUE_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPAQUE_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.OPAQUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPAQUE_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.OPAQUE_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPAQUE_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPAQUE_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPAQUE_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPAQUE_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPAQUE_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPAQUE_ACTION__INPUT_VALUE:
+			return ((InternalEList<?>) getInputValues()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE:
+			return ((InternalEList<?>) getOutputValues()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -427,82 +385,82 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.OPAQUE_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.OPAQUE_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.OPAQUE_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.OPAQUE_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.OPAQUE_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.OPAQUE_ACTION__NAME :
-				return getName();
-			case UMLPackage.OPAQUE_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.OPAQUE_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.OPAQUE_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.OPAQUE_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.OPAQUE_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.OPAQUE_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.OPAQUE_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.OPAQUE_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.OPAQUE_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.OPAQUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.OPAQUE_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.OPAQUE_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.OPAQUE_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.OPAQUE_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.OPAQUE_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.OPAQUE_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.OPAQUE_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.OPAQUE_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.OPAQUE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.OPAQUE_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.OPAQUE_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.OPAQUE_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.OPAQUE_ACTION__BODY :
-				return getBodies();
-			case UMLPackage.OPAQUE_ACTION__INPUT_VALUE :
-				return getInputValues();
-			case UMLPackage.OPAQUE_ACTION__LANGUAGE :
-				return getLanguages();
-			case UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE :
-				return getOutputValues();
+		case UMLPackage.OPAQUE_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.OPAQUE_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.OPAQUE_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.OPAQUE_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.OPAQUE_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.OPAQUE_ACTION__NAME:
+			return getName();
+		case UMLPackage.OPAQUE_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.OPAQUE_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.OPAQUE_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.OPAQUE_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.OPAQUE_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.OPAQUE_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.OPAQUE_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.OPAQUE_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.OPAQUE_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.OPAQUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.OPAQUE_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.OPAQUE_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.OPAQUE_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.OPAQUE_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.OPAQUE_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.OPAQUE_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.OPAQUE_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.OPAQUE_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.OPAQUE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.OPAQUE_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.OPAQUE_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.OPAQUE_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.OPAQUE_ACTION__BODY:
+			return getBodies();
+		case UMLPackage.OPAQUE_ACTION__INPUT_VALUE:
+			return getInputValues();
+		case UMLPackage.OPAQUE_ACTION__LANGUAGE:
+			return getLanguages();
+		case UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE:
+			return getOutputValues();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -516,95 +474,83 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.OPAQUE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__BODY :
-				getBodies().clear();
-				getBodies().addAll((Collection<? extends String>) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__INPUT_VALUE :
-				getInputValues().clear();
-				getInputValues()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__LANGUAGE :
-				getLanguages().clear();
-				getLanguages().addAll((Collection<? extends String>) newValue);
-				return;
-			case UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE :
-				getOutputValues().clear();
-				getOutputValues()
-					.addAll((Collection<? extends OutputPin>) newValue);
-				return;
+		case UMLPackage.OPAQUE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__BODY:
+			getBodies().clear();
+			getBodies().addAll((Collection<? extends String>) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__INPUT_VALUE:
+			getInputValues().clear();
+			getInputValues().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__LANGUAGE:
+			getLanguages().clear();
+			getLanguages().addAll((Collection<? extends String>) newValue);
+			return;
+		case UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE:
+			getOutputValues().clear();
+			getOutputValues().addAll((Collection<? extends OutputPin>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -617,69 +563,69 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OPAQUE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.OPAQUE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.OPAQUE_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.OPAQUE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.OPAQUE_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.OPAQUE_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.OPAQUE_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.OPAQUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.OPAQUE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.OPAQUE_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.OPAQUE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.OPAQUE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.OPAQUE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.OPAQUE_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.OPAQUE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.OPAQUE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.OPAQUE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.OPAQUE_ACTION__BODY :
-				unsetBodies();
-				return;
-			case UMLPackage.OPAQUE_ACTION__INPUT_VALUE :
-				getInputValues().clear();
-				return;
-			case UMLPackage.OPAQUE_ACTION__LANGUAGE :
-				unsetLanguages();
-				return;
-			case UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE :
-				getOutputValues().clear();
-				return;
+		case UMLPackage.OPAQUE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.OPAQUE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.OPAQUE_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.OPAQUE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.OPAQUE_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.OPAQUE_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.OPAQUE_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.OPAQUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.OPAQUE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.OPAQUE_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.OPAQUE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.OPAQUE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.OPAQUE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.OPAQUE_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.OPAQUE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.OPAQUE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.OPAQUE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.OPAQUE_ACTION__BODY:
+			unsetBodies();
+			return;
+		case UMLPackage.OPAQUE_ACTION__INPUT_VALUE:
+			getInputValues().clear();
+			return;
+		case UMLPackage.OPAQUE_ACTION__LANGUAGE:
+			unsetLanguages();
+			return;
+		case UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE:
+			getOutputValues().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -692,72 +638,70 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OPAQUE_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.OPAQUE_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.OPAQUE_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.OPAQUE_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.OPAQUE_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.OPAQUE_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.OPAQUE_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.OPAQUE_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.OPAQUE_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.OPAQUE_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.OPAQUE_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.OPAQUE_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.OPAQUE_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.OPAQUE_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.OPAQUE_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.OPAQUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.OPAQUE_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.OPAQUE_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.OPAQUE_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.OPAQUE_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.OPAQUE_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.OPAQUE_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.OPAQUE_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.OPAQUE_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.OPAQUE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.OPAQUE_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.OPAQUE_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.OPAQUE_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.OPAQUE_ACTION__BODY :
-				return isSetBodies();
-			case UMLPackage.OPAQUE_ACTION__INPUT_VALUE :
-				return !getInputValues().isEmpty();
-			case UMLPackage.OPAQUE_ACTION__LANGUAGE :
-				return isSetLanguages();
-			case UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE :
-				return !getOutputValues().isEmpty();
+		case UMLPackage.OPAQUE_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.OPAQUE_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.OPAQUE_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.OPAQUE_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.OPAQUE_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.OPAQUE_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.OPAQUE_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.OPAQUE_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.OPAQUE_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.OPAQUE_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.OPAQUE_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.OPAQUE_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.OPAQUE_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.OPAQUE_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.OPAQUE_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.OPAQUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.OPAQUE_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.OPAQUE_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.OPAQUE_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.OPAQUE_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.OPAQUE_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.OPAQUE_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.OPAQUE_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.OPAQUE_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.OPAQUE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.OPAQUE_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.OPAQUE_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.OPAQUE_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.OPAQUE_ACTION__BODY:
+			return isSetBodies();
+		case UMLPackage.OPAQUE_ACTION__INPUT_VALUE:
+			return !getInputValues().isEmpty();
+		case UMLPackage.OPAQUE_ACTION__LANGUAGE:
+			return isSetLanguages();
+		case UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE:
+			return !getOutputValues().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -772,156 +716,132 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.OPAQUE_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.OPAQUE_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.OPAQUE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.OPAQUE_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.OPAQUE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OPAQUE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.OPAQUE_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.OPAQUE_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.OPAQUE_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.OPAQUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.OPAQUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.OPAQUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.OPAQUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OPAQUE_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OPAQUE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.OPAQUE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.OPAQUE_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.OPAQUE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.OPAQUE_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.OPAQUE_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.OPAQUE_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.OPAQUE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.OPAQUE_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.OPAQUE_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.OPAQUE_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.OPAQUE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.OPAQUE_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.OPAQUE_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.OPAQUE_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.OPAQUE_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.OPAQUE_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.OPAQUE_ACTION___VALIDATE_LANGUAGE_BODY_SIZE__DIAGNOSTICCHAIN_MAP :
-				return validateLanguageBodySize(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.OPAQUE_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.OPAQUE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.OPAQUE_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.OPAQUE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OPAQUE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.OPAQUE_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.OPAQUE_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.OPAQUE_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.OPAQUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.OPAQUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.OPAQUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.OPAQUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OPAQUE_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OPAQUE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.OPAQUE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.OPAQUE_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.OPAQUE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.OPAQUE_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.OPAQUE_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.OPAQUE_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.OPAQUE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.OPAQUE_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.OPAQUE_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.OPAQUE_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.OPAQUE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.OPAQUE_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.OPAQUE_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.OPAQUE_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.OPAQUE_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.OPAQUE_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.OPAQUE_ACTION___VALIDATE_LANGUAGE_BODY_SIZE__DIAGNOSTICCHAIN_MAP:
+			return validateLanguageBodySize((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -934,8 +854,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.OPAQUE_ACTION__INPUT_VALUE};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.OPAQUE_ACTION__INPUT_VALUE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -945,7 +864,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.OPAQUE_ACTION__INPUT_VALUE);
+				|| eIsSet(UMLPackage.OPAQUE_ACTION__INPUT_VALUE);
 	}
 
 	/**
@@ -956,8 +875,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -967,7 +885,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE);
+				|| eIsSet(UMLPackage.OPAQUE_ACTION__OUTPUT_VALUE);
 	}
 
 } //OpaqueActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OpaqueBehaviorImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OpaqueBehaviorImpl.java
index 8e320e9..5268d41 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OpaqueBehaviorImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OpaqueBehaviorImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
- *   Kenn Hussey - 519572
+ *   Kenn Hussey - 519572, 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -18,6 +18,10 @@
 
 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;
+
+import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.BehavioralFeature;
 import org.eclipse.uml2.uml.Classifier;
@@ -89,9 +93,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<String> getBodies() {
-		return (EList<String>) eDynamicGet(
-			UMLPackage.OPAQUE_BEHAVIOR__BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_BEHAVIOR__BODY, true, true);
+		return (EList<String>) eDynamicGet(UMLPackage.OPAQUE_BEHAVIOR__BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_BEHAVIOR__BODY, true, true);
 	}
 
 	/**
@@ -100,8 +102,7 @@
 	 * @generated
 	 */
 	public void unsetBodies() {
-		eDynamicUnset(UMLPackage.OPAQUE_BEHAVIOR__BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_BEHAVIOR__BODY);
+		eDynamicUnset(UMLPackage.OPAQUE_BEHAVIOR__BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_BEHAVIOR__BODY);
 	}
 
 	/**
@@ -110,9 +111,7 @@
 	 * @generated
 	 */
 	public boolean isSetBodies() {
-		return eDynamicIsSet(
-			UMLPackage.OPAQUE_BEHAVIOR__BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_BEHAVIOR__BODY);
+		return eDynamicIsSet(UMLPackage.OPAQUE_BEHAVIOR__BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_BEHAVIOR__BODY);
 	}
 
 	/**
@@ -122,9 +121,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<String> getLanguages() {
-		return (EList<String>) eDynamicGet(
-			UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_BEHAVIOR__LANGUAGE, true, true);
+		return (EList<String>) eDynamicGet(UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_BEHAVIOR__LANGUAGE, true, true);
 	}
 
 	/**
@@ -133,9 +130,7 @@
 	 * @generated
 	 */
 	public void unsetLanguages() {
-		eDynamicUnset(
-			UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_BEHAVIOR__LANGUAGE);
+		eDynamicUnset(UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_BEHAVIOR__LANGUAGE);
 	}
 
 	/**
@@ -144,9 +139,7 @@
 	 * @generated
 	 */
 	public boolean isSetLanguages() {
-		return eDynamicIsSet(
-			UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_BEHAVIOR__LANGUAGE);
+		return eDynamicIsSet(UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_BEHAVIOR__LANGUAGE);
 	}
 
 	/**
@@ -157,152 +150,152 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.OPAQUE_BEHAVIOR__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.OPAQUE_BEHAVIOR__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.OPAQUE_BEHAVIOR__NAME :
-				return getName();
-			case UMLPackage.OPAQUE_BEHAVIOR__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.OPAQUE_BEHAVIOR__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.OPAQUE_BEHAVIOR__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.OPAQUE_BEHAVIOR__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.OPAQUE_BEHAVIOR__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.OPAQUE_BEHAVIOR__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.OPAQUE_BEHAVIOR__MEMBER :
-				return getMembers();
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.OPAQUE_BEHAVIOR__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.OPAQUE_BEHAVIOR__FEATURE :
-				return getFeatures();
-			case UMLPackage.OPAQUE_BEHAVIOR__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.OPAQUE_BEHAVIOR__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.OPAQUE_BEHAVIOR__GENERAL :
-				return getGenerals();
-			case UMLPackage.OPAQUE_BEHAVIOR__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.OPAQUE_BEHAVIOR__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.OPAQUE_BEHAVIOR__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.OPAQUE_BEHAVIOR__USE_CASE :
-				return getUseCases();
-			case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.OPAQUE_BEHAVIOR__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.OPAQUE_BEHAVIOR__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_CONNECTOR :
-				return getOwnedConnectors();
-			case UMLPackage.OPAQUE_BEHAVIOR__PART :
-				return getParts();
-			case UMLPackage.OPAQUE_BEHAVIOR__ROLE :
-				return getRoles();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PORT :
-				return getOwnedPorts();
-			case UMLPackage.OPAQUE_BEHAVIOR__CLASSIFIER_BEHAVIOR :
-				if (resolve)
-					return getClassifierBehavior();
-				return basicGetClassifierBehavior();
-			case UMLPackage.OPAQUE_BEHAVIOR__INTERFACE_REALIZATION :
-				return getInterfaceRealizations();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_BEHAVIOR :
-				return getOwnedBehaviors();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_OPERATION :
-				return getOwnedOperations();
-			case UMLPackage.OPAQUE_BEHAVIOR__EXTENSION :
-				return getExtensions();
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_ACTIVE :
-				return isActive();
-			case UMLPackage.OPAQUE_BEHAVIOR__NESTED_CLASSIFIER :
-				return getNestedClassifiers();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RECEPTION :
-				return getOwnedReceptions();
-			case UMLPackage.OPAQUE_BEHAVIOR__SUPER_CLASS :
-				return getSuperClasses();
-			case UMLPackage.OPAQUE_BEHAVIOR__SPECIFICATION :
-				if (resolve)
-					return getSpecification();
-				return basicGetSpecification();
-			case UMLPackage.OPAQUE_BEHAVIOR__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_REENTRANT :
-				return isReentrant();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER :
-				return getOwnedParameters();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER_SET :
-				return getOwnedParameterSets();
-			case UMLPackage.OPAQUE_BEHAVIOR__POSTCONDITION :
-				return getPostconditions();
-			case UMLPackage.OPAQUE_BEHAVIOR__PRECONDITION :
-				return getPreconditions();
-			case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_BEHAVIOR :
-				return getRedefinedBehaviors();
-			case UMLPackage.OPAQUE_BEHAVIOR__BODY :
-				return getBodies();
-			case UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE :
-				return getLanguages();
+		case UMLPackage.OPAQUE_BEHAVIOR__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.OPAQUE_BEHAVIOR__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.OPAQUE_BEHAVIOR__NAME:
+			return getName();
+		case UMLPackage.OPAQUE_BEHAVIOR__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.OPAQUE_BEHAVIOR__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.OPAQUE_BEHAVIOR__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.OPAQUE_BEHAVIOR__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.OPAQUE_BEHAVIOR__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.OPAQUE_BEHAVIOR__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.OPAQUE_BEHAVIOR__MEMBER:
+			return getMembers();
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.OPAQUE_BEHAVIOR__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.OPAQUE_BEHAVIOR__FEATURE:
+			return getFeatures();
+		case UMLPackage.OPAQUE_BEHAVIOR__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.OPAQUE_BEHAVIOR__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.OPAQUE_BEHAVIOR__GENERAL:
+			return getGenerals();
+		case UMLPackage.OPAQUE_BEHAVIOR__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.OPAQUE_BEHAVIOR__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.OPAQUE_BEHAVIOR__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.OPAQUE_BEHAVIOR__USE_CASE:
+			return getUseCases();
+		case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.OPAQUE_BEHAVIOR__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.OPAQUE_BEHAVIOR__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_CONNECTOR:
+			return getOwnedConnectors();
+		case UMLPackage.OPAQUE_BEHAVIOR__PART:
+			return getParts();
+		case UMLPackage.OPAQUE_BEHAVIOR__ROLE:
+			return getRoles();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PORT:
+			return getOwnedPorts();
+		case UMLPackage.OPAQUE_BEHAVIOR__CLASSIFIER_BEHAVIOR:
+			if (resolve)
+				return getClassifierBehavior();
+			return basicGetClassifierBehavior();
+		case UMLPackage.OPAQUE_BEHAVIOR__INTERFACE_REALIZATION:
+			return getInterfaceRealizations();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_BEHAVIOR:
+			return getOwnedBehaviors();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_OPERATION:
+			return getOwnedOperations();
+		case UMLPackage.OPAQUE_BEHAVIOR__EXTENSION:
+			return getExtensions();
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_ACTIVE:
+			return isActive();
+		case UMLPackage.OPAQUE_BEHAVIOR__NESTED_CLASSIFIER:
+			return getNestedClassifiers();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RECEPTION:
+			return getOwnedReceptions();
+		case UMLPackage.OPAQUE_BEHAVIOR__SUPER_CLASS:
+			return getSuperClasses();
+		case UMLPackage.OPAQUE_BEHAVIOR__SPECIFICATION:
+			if (resolve)
+				return getSpecification();
+			return basicGetSpecification();
+		case UMLPackage.OPAQUE_BEHAVIOR__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_REENTRANT:
+			return isReentrant();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER:
+			return getOwnedParameters();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER_SET:
+			return getOwnedParameterSets();
+		case UMLPackage.OPAQUE_BEHAVIOR__POSTCONDITION:
+			return getPostconditions();
+		case UMLPackage.OPAQUE_BEHAVIOR__PRECONDITION:
+			return getPreconditions();
+		case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_BEHAVIOR:
+			return getRedefinedBehaviors();
+		case UMLPackage.OPAQUE_BEHAVIOR__BODY:
+			return getBodies();
+		case UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE:
+			return getLanguages();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -316,193 +309,167 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.OPAQUE_BEHAVIOR__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				getOwnedConnectors()
-					.addAll((Collection<? extends Connector>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll(
-					(Collection<? extends InterfaceRealization>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				getOwnedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_ACTIVE :
-				setIsActive((Boolean) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				getNestedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				getOwnedReceptions()
-					.addAll((Collection<? extends Reception>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__SUPER_CLASS :
-				getSuperClasses().clear();
-				getSuperClasses().addAll(
-					(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__SPECIFICATION :
-				setSpecification((BehavioralFeature) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_REENTRANT :
-				setIsReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				getOwnedParameters()
-					.addAll((Collection<? extends Parameter>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				getOwnedParameterSets()
-					.addAll((Collection<? extends ParameterSet>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__POSTCONDITION :
-				getPostconditions().clear();
-				getPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__PRECONDITION :
-				getPreconditions().clear();
-				getPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_BEHAVIOR :
-				getRedefinedBehaviors().clear();
-				getRedefinedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__BODY :
-				getBodies().clear();
-				getBodies().addAll((Collection<? extends String>) newValue);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE :
-				getLanguages().clear();
-				getLanguages().addAll((Collection<? extends String>) newValue);
-				return;
+		case UMLPackage.OPAQUE_BEHAVIOR__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			getOwnedConnectors().addAll((Collection<? extends Connector>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			getInterfaceRealizations().addAll((Collection<? extends InterfaceRealization>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			getOwnedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_ACTIVE:
+			setIsActive((Boolean) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			getNestedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			getOwnedReceptions().addAll((Collection<? extends Reception>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__SUPER_CLASS:
+			getSuperClasses().clear();
+			getSuperClasses().addAll((Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__SPECIFICATION:
+			setSpecification((BehavioralFeature) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_REENTRANT:
+			setIsReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			getOwnedParameters().addAll((Collection<? extends Parameter>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			getOwnedParameterSets().addAll((Collection<? extends ParameterSet>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__POSTCONDITION:
+			getPostconditions().clear();
+			getPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__PRECONDITION:
+			getPreconditions().clear();
+			getPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_BEHAVIOR:
+			getRedefinedBehaviors().clear();
+			getRedefinedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__BODY:
+			getBodies().clear();
+			getBodies().addAll((Collection<? extends String>) newValue);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE:
+			getLanguages().clear();
+			getLanguages().addAll((Collection<? extends String>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -515,138 +482,138 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OPAQUE_BEHAVIOR__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__NAME :
-				unsetName();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) null);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_ACTIVE :
-				setIsActive(IS_ACTIVE_EDEFAULT);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__SUPER_CLASS :
-				getSuperClasses().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__SPECIFICATION :
-				setSpecification((BehavioralFeature) null);
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_REENTRANT :
-				unsetIsReentrant();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__POSTCONDITION :
-				getPostconditions().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__PRECONDITION :
-				getPreconditions().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_BEHAVIOR :
-				getRedefinedBehaviors().clear();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__BODY :
-				unsetBodies();
-				return;
-			case UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE :
-				unsetLanguages();
-				return;
+		case UMLPackage.OPAQUE_BEHAVIOR__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__NAME:
+			unsetName();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) null);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_ACTIVE:
+			setIsActive(IS_ACTIVE_EDEFAULT);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__SUPER_CLASS:
+			getSuperClasses().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__SPECIFICATION:
+			setSpecification((BehavioralFeature) null);
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_REENTRANT:
+			unsetIsReentrant();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__POSTCONDITION:
+			getPostconditions().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__PRECONDITION:
+			getPreconditions().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_BEHAVIOR:
+			getRedefinedBehaviors().clear();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__BODY:
+			unsetBodies();
+			return;
+		case UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE:
+			unsetLanguages();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -659,132 +626,130 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OPAQUE_BEHAVIOR__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNER :
-				return isSetOwner();
-			case UMLPackage.OPAQUE_BEHAVIOR__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__NAME :
-				return isSetName();
-			case UMLPackage.OPAQUE_BEHAVIOR__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.OPAQUE_BEHAVIOR__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.OPAQUE_BEHAVIOR__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.OPAQUE_BEHAVIOR__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.OPAQUE_BEHAVIOR__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__MEMBER :
-				return isSetMembers();
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.OPAQUE_BEHAVIOR__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.OPAQUE_BEHAVIOR__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.OPAQUE_BEHAVIOR__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.OPAQUE_BEHAVIOR__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__GENERAL :
-				return isSetGenerals();
-			case UMLPackage.OPAQUE_BEHAVIOR__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_ABSTRACT :
-				return isSetIsAbstract();
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.OPAQUE_BEHAVIOR__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_ATTRIBUTE :
-				return isSetOwnedAttributes();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_CONNECTOR :
-				return !getOwnedConnectors().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__PART :
-				return !getParts().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__ROLE :
-				return isSetRoles();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PORT :
-				return !getOwnedPorts().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__CLASSIFIER_BEHAVIOR :
-				return basicGetClassifierBehavior() != null;
-			case UMLPackage.OPAQUE_BEHAVIOR__INTERFACE_REALIZATION :
-				return !getInterfaceRealizations().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_BEHAVIOR :
-				return !getOwnedBehaviors().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__EXTENSION :
-				return !getExtensions().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_ACTIVE :
-				return isActive() != IS_ACTIVE_EDEFAULT;
-			case UMLPackage.OPAQUE_BEHAVIOR__NESTED_CLASSIFIER :
-				return !getNestedClassifiers().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RECEPTION :
-				return !getOwnedReceptions().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__SUPER_CLASS :
-				return isSetSuperClasses();
-			case UMLPackage.OPAQUE_BEHAVIOR__SPECIFICATION :
-				return basicGetSpecification() != null;
-			case UMLPackage.OPAQUE_BEHAVIOR__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.OPAQUE_BEHAVIOR__IS_REENTRANT :
-				return isSetIsReentrant();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER :
-				return !getOwnedParameters().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER_SET :
-				return !getOwnedParameterSets().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__POSTCONDITION :
-				return !getPostconditions().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__PRECONDITION :
-				return !getPreconditions().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_BEHAVIOR :
-				return !getRedefinedBehaviors().isEmpty();
-			case UMLPackage.OPAQUE_BEHAVIOR__BODY :
-				return isSetBodies();
-			case UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE :
-				return isSetLanguages();
+		case UMLPackage.OPAQUE_BEHAVIOR__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNER:
+			return isSetOwner();
+		case UMLPackage.OPAQUE_BEHAVIOR__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__NAME:
+			return isSetName();
+		case UMLPackage.OPAQUE_BEHAVIOR__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.OPAQUE_BEHAVIOR__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.OPAQUE_BEHAVIOR__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.OPAQUE_BEHAVIOR__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.OPAQUE_BEHAVIOR__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__MEMBER:
+			return isSetMembers();
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.OPAQUE_BEHAVIOR__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.OPAQUE_BEHAVIOR__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.OPAQUE_BEHAVIOR__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.OPAQUE_BEHAVIOR__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.OPAQUE_BEHAVIOR__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.OPAQUE_BEHAVIOR__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__GENERAL:
+			return isSetGenerals();
+		case UMLPackage.OPAQUE_BEHAVIOR__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_ABSTRACT:
+			return isSetIsAbstract();
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.OPAQUE_BEHAVIOR__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_ATTRIBUTE:
+			return isSetOwnedAttributes();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_CONNECTOR:
+			return !getOwnedConnectors().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__PART:
+			return !getParts().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__ROLE:
+			return isSetRoles();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PORT:
+			return !getOwnedPorts().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__CLASSIFIER_BEHAVIOR:
+			return basicGetClassifierBehavior() != null;
+		case UMLPackage.OPAQUE_BEHAVIOR__INTERFACE_REALIZATION:
+			return !getInterfaceRealizations().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_BEHAVIOR:
+			return !getOwnedBehaviors().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__EXTENSION:
+			return !getExtensions().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_ACTIVE:
+			return isActive() != IS_ACTIVE_EDEFAULT;
+		case UMLPackage.OPAQUE_BEHAVIOR__NESTED_CLASSIFIER:
+			return !getNestedClassifiers().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_RECEPTION:
+			return !getOwnedReceptions().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__SUPER_CLASS:
+			return isSetSuperClasses();
+		case UMLPackage.OPAQUE_BEHAVIOR__SPECIFICATION:
+			return basicGetSpecification() != null;
+		case UMLPackage.OPAQUE_BEHAVIOR__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.OPAQUE_BEHAVIOR__IS_REENTRANT:
+			return isSetIsReentrant();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER:
+			return !getOwnedParameters().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__OWNED_PARAMETER_SET:
+			return !getOwnedParameterSets().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__POSTCONDITION:
+			return !getPostconditions().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__PRECONDITION:
+			return !getPreconditions().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__REDEFINED_BEHAVIOR:
+			return !getRedefinedBehaviors().isEmpty();
+		case UMLPackage.OPAQUE_BEHAVIOR__BODY:
+			return isSetBodies();
+		case UMLPackage.OPAQUE_BEHAVIOR__LANGUAGE:
+			return isSetLanguages();
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OpaqueExpressionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OpaqueExpressionImpl.java
index 9e4f5ca..d20480a 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OpaqueExpressionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OpaqueExpressionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,8 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 import org.eclipse.emf.common.util.DiagnosticChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -25,6 +27,12 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EDataTypeEList;
+import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
+
+import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.NamedElement;
@@ -87,9 +95,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<String> getBodies() {
-		return (EList<String>) eDynamicGet(
-			UMLPackage.OPAQUE_EXPRESSION__BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_EXPRESSION__BODY, true, true);
+		return (EList<String>) eDynamicGet(UMLPackage.OPAQUE_EXPRESSION__BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_EXPRESSION__BODY, true, true);
 	}
 
 	/**
@@ -98,9 +104,7 @@
 	 * @generated
 	 */
 	public void unsetBodies() {
-		eDynamicUnset(
-			UMLPackage.OPAQUE_EXPRESSION__BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_EXPRESSION__BODY);
+		eDynamicUnset(UMLPackage.OPAQUE_EXPRESSION__BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_EXPRESSION__BODY);
 	}
 
 	/**
@@ -109,9 +113,7 @@
 	 * @generated
 	 */
 	public boolean isSetBodies() {
-		return eDynamicIsSet(
-			UMLPackage.OPAQUE_EXPRESSION__BODY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_EXPRESSION__BODY);
+		return eDynamicIsSet(UMLPackage.OPAQUE_EXPRESSION__BODY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_EXPRESSION__BODY);
 	}
 
 	/**
@@ -121,9 +123,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<String> getLanguages() {
-		return (EList<String>) eDynamicGet(
-			UMLPackage.OPAQUE_EXPRESSION__LANGUAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_EXPRESSION__LANGUAGE, true, true);
+		return (EList<String>) eDynamicGet(UMLPackage.OPAQUE_EXPRESSION__LANGUAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_EXPRESSION__LANGUAGE, true, true);
 	}
 
 	/**
@@ -132,9 +132,7 @@
 	 * @generated
 	 */
 	public void unsetLanguages() {
-		eDynamicUnset(
-			UMLPackage.OPAQUE_EXPRESSION__LANGUAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_EXPRESSION__LANGUAGE);
+		eDynamicUnset(UMLPackage.OPAQUE_EXPRESSION__LANGUAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_EXPRESSION__LANGUAGE);
 	}
 
 	/**
@@ -143,9 +141,7 @@
 	 * @generated
 	 */
 	public boolean isSetLanguages() {
-		return eDynamicIsSet(
-			UMLPackage.OPAQUE_EXPRESSION__LANGUAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_EXPRESSION__LANGUAGE);
+		return eDynamicIsSet(UMLPackage.OPAQUE_EXPRESSION__LANGUAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_EXPRESSION__LANGUAGE);
 	}
 
 	/**
@@ -155,9 +151,7 @@
 	 */
 	public Parameter getResult() {
 		Parameter result = basicGetResult();
-		return result != null && result.eIsProxy()
-			? (Parameter) eResolveProxy((InternalEObject) result)
-			: result;
+		return result != null && result.eIsProxy() ? (Parameter) eResolveProxy((InternalEObject) result) : result;
 	}
 
 	/**
@@ -175,9 +169,7 @@
 	 * @generated
 	 */
 	public Behavior getBehavior() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.OPAQUE_EXPRESSION__BEHAVIOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_EXPRESSION__BEHAVIOR, true, true);
+		return (Behavior) eDynamicGet(UMLPackage.OPAQUE_EXPRESSION__BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_EXPRESSION__BEHAVIOR, true, true);
 	}
 
 	/**
@@ -186,9 +178,7 @@
 	 * @generated
 	 */
 	public Behavior basicGetBehavior() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.OPAQUE_EXPRESSION__BEHAVIOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_EXPRESSION__BEHAVIOR, false, true);
+		return (Behavior) eDynamicGet(UMLPackage.OPAQUE_EXPRESSION__BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_EXPRESSION__BEHAVIOR, false, true);
 	}
 
 	/**
@@ -197,9 +187,7 @@
 	 * @generated
 	 */
 	public void setBehavior(Behavior newBehavior) {
-		eDynamicSet(
-			UMLPackage.OPAQUE_EXPRESSION__BEHAVIOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPAQUE_EXPRESSION__BEHAVIOR, newBehavior);
+		eDynamicSet(UMLPackage.OPAQUE_EXPRESSION__BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPAQUE_EXPRESSION__BEHAVIOR, newBehavior);
 	}
 
 	/**
@@ -209,8 +197,7 @@
 	 */
 	public boolean validateLanguageBodySize(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return OpaqueExpressionOperations.validateLanguageBodySize(this,
-			diagnostics, context);
+		return OpaqueExpressionOperations.validateLanguageBodySize(this, diagnostics, context);
 	}
 
 	/**
@@ -220,8 +207,7 @@
 	 */
 	public boolean validateOnlyReturnResultParameters(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return OpaqueExpressionOperations
-			.validateOnlyReturnResultParameters(this, diagnostics, context);
+		return OpaqueExpressionOperations.validateOnlyReturnResultParameters(this, diagnostics, context);
 	}
 
 	/**
@@ -231,8 +217,7 @@
 	 */
 	public boolean validateOneReturnResultParameter(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return OpaqueExpressionOperations.validateOneReturnResultParameter(this,
-			diagnostics, context);
+		return OpaqueExpressionOperations.validateOneReturnResultParameter(this, diagnostics, context);
 	}
 
 	/**
@@ -289,56 +274,56 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.OPAQUE_EXPRESSION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.OPAQUE_EXPRESSION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.OPAQUE_EXPRESSION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.OPAQUE_EXPRESSION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.OPAQUE_EXPRESSION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.OPAQUE_EXPRESSION__NAME :
-				return getName();
-			case UMLPackage.OPAQUE_EXPRESSION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.OPAQUE_EXPRESSION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.OPAQUE_EXPRESSION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.OPAQUE_EXPRESSION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.OPAQUE_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.OPAQUE_EXPRESSION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.OPAQUE_EXPRESSION__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.OPAQUE_EXPRESSION__BEHAVIOR :
-				if (resolve)
-					return getBehavior();
-				return basicGetBehavior();
-			case UMLPackage.OPAQUE_EXPRESSION__BODY :
-				return getBodies();
-			case UMLPackage.OPAQUE_EXPRESSION__LANGUAGE :
-				return getLanguages();
-			case UMLPackage.OPAQUE_EXPRESSION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
+		case UMLPackage.OPAQUE_EXPRESSION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.OPAQUE_EXPRESSION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.OPAQUE_EXPRESSION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.OPAQUE_EXPRESSION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.OPAQUE_EXPRESSION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.OPAQUE_EXPRESSION__NAME:
+			return getName();
+		case UMLPackage.OPAQUE_EXPRESSION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.OPAQUE_EXPRESSION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.OPAQUE_EXPRESSION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.OPAQUE_EXPRESSION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.OPAQUE_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.OPAQUE_EXPRESSION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.OPAQUE_EXPRESSION__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.OPAQUE_EXPRESSION__BEHAVIOR:
+			if (resolve)
+				return getBehavior();
+			return basicGetBehavior();
+		case UMLPackage.OPAQUE_EXPRESSION__BODY:
+			return getBodies();
+		case UMLPackage.OPAQUE_EXPRESSION__LANGUAGE:
+			return getLanguages();
+		case UMLPackage.OPAQUE_EXPRESSION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -352,45 +337,43 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.OPAQUE_EXPRESSION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__BEHAVIOR :
-				setBehavior((Behavior) newValue);
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__BODY :
-				getBodies().clear();
-				getBodies().addAll((Collection<? extends String>) newValue);
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__LANGUAGE :
-				getLanguages().clear();
-				getLanguages().addAll((Collection<? extends String>) newValue);
-				return;
+		case UMLPackage.OPAQUE_EXPRESSION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__BEHAVIOR:
+			setBehavior((Behavior) newValue);
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__BODY:
+			getBodies().clear();
+			getBodies().addAll((Collection<? extends String>) newValue);
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__LANGUAGE:
+			getLanguages().clear();
+			getLanguages().addAll((Collection<? extends String>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -403,39 +386,39 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OPAQUE_EXPRESSION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__BEHAVIOR :
-				setBehavior((Behavior) null);
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__BODY :
-				unsetBodies();
-				return;
-			case UMLPackage.OPAQUE_EXPRESSION__LANGUAGE :
-				unsetLanguages();
-				return;
+		case UMLPackage.OPAQUE_EXPRESSION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__BEHAVIOR:
+			setBehavior((Behavior) null);
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__BODY:
+			unsetBodies();
+			return;
+		case UMLPackage.OPAQUE_EXPRESSION__LANGUAGE:
+			unsetLanguages();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -448,42 +431,40 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OPAQUE_EXPRESSION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.OPAQUE_EXPRESSION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.OPAQUE_EXPRESSION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.OPAQUE_EXPRESSION__OWNER :
-				return isSetOwner();
-			case UMLPackage.OPAQUE_EXPRESSION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.OPAQUE_EXPRESSION__NAME :
-				return isSetName();
-			case UMLPackage.OPAQUE_EXPRESSION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.OPAQUE_EXPRESSION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.OPAQUE_EXPRESSION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.OPAQUE_EXPRESSION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.OPAQUE_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.OPAQUE_EXPRESSION__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.OPAQUE_EXPRESSION__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.OPAQUE_EXPRESSION__BEHAVIOR :
-				return basicGetBehavior() != null;
-			case UMLPackage.OPAQUE_EXPRESSION__BODY :
-				return isSetBodies();
-			case UMLPackage.OPAQUE_EXPRESSION__LANGUAGE :
-				return isSetLanguages();
-			case UMLPackage.OPAQUE_EXPRESSION__RESULT :
-				return basicGetResult() != null;
+		case UMLPackage.OPAQUE_EXPRESSION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.OPAQUE_EXPRESSION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.OPAQUE_EXPRESSION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.OPAQUE_EXPRESSION__OWNER:
+			return isSetOwner();
+		case UMLPackage.OPAQUE_EXPRESSION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.OPAQUE_EXPRESSION__NAME:
+			return isSetName();
+		case UMLPackage.OPAQUE_EXPRESSION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.OPAQUE_EXPRESSION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.OPAQUE_EXPRESSION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.OPAQUE_EXPRESSION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.OPAQUE_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.OPAQUE_EXPRESSION__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.OPAQUE_EXPRESSION__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.OPAQUE_EXPRESSION__BEHAVIOR:
+			return basicGetBehavior() != null;
+		case UMLPackage.OPAQUE_EXPRESSION__BODY:
+			return isSetBodies();
+		case UMLPackage.OPAQUE_EXPRESSION__LANGUAGE:
+			return isSetLanguages();
+		case UMLPackage.OPAQUE_EXPRESSION__RESULT:
+			return basicGetResult() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -498,170 +479,146 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.OPAQUE_EXPRESSION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_EXPRESSION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.OPAQUE_EXPRESSION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.OPAQUE_EXPRESSION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.OPAQUE_EXPRESSION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.OPAQUE_EXPRESSION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OPAQUE_EXPRESSION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___GET_MODEL :
-				return getModel();
-			case UMLPackage.OPAQUE_EXPRESSION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.OPAQUE_EXPRESSION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.OPAQUE_EXPRESSION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.OPAQUE_EXPRESSION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.OPAQUE_EXPRESSION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.OPAQUE_EXPRESSION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.OPAQUE_EXPRESSION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OPAQUE_EXPRESSION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OPAQUE_EXPRESSION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.OPAQUE_EXPRESSION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.OPAQUE_EXPRESSION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_EXPRESSION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.OPAQUE_EXPRESSION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.OPAQUE_EXPRESSION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.OPAQUE_EXPRESSION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.OPAQUE_EXPRESSION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.OPAQUE_EXPRESSION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.OPAQUE_EXPRESSION___SEPARATOR :
-				return separator();
-			case UMLPackage.OPAQUE_EXPRESSION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.OPAQUE_EXPRESSION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.OPAQUE_EXPRESSION___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_EXPRESSION___BOOLEAN_VALUE :
-				return booleanValue();
-			case UMLPackage.OPAQUE_EXPRESSION___INTEGER_VALUE :
-				return integerValue();
-			case UMLPackage.OPAQUE_EXPRESSION___IS_COMPUTABLE :
-				return isComputable();
-			case UMLPackage.OPAQUE_EXPRESSION___IS_NULL :
-				return isNull();
-			case UMLPackage.OPAQUE_EXPRESSION___REAL_VALUE :
-				return realValue();
-			case UMLPackage.OPAQUE_EXPRESSION___STRING_VALUE :
-				return stringValue();
-			case UMLPackage.OPAQUE_EXPRESSION___UNLIMITED_VALUE :
-				return unlimitedValue();
-			case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_LANGUAGE_BODY_SIZE__DIAGNOSTICCHAIN_MAP :
-				return validateLanguageBodySize(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_ONE_RETURN_RESULT_PARAMETER__DIAGNOSTICCHAIN_MAP :
-				return validateOneReturnResultParameter(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_ONLY_RETURN_RESULT_PARAMETERS__DIAGNOSTICCHAIN_MAP :
-				return validateOnlyReturnResultParameters(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPAQUE_EXPRESSION___IS_INTEGRAL :
-				return isIntegral();
-			case UMLPackage.OPAQUE_EXPRESSION___IS_NON_NEGATIVE :
-				return isNonNegative();
-			case UMLPackage.OPAQUE_EXPRESSION___IS_POSITIVE :
-				return isPositive();
-			case UMLPackage.OPAQUE_EXPRESSION___GET_RESULT :
-				return getResult();
-			case UMLPackage.OPAQUE_EXPRESSION___VALUE :
-				return value();
+		case UMLPackage.OPAQUE_EXPRESSION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_EXPRESSION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.OPAQUE_EXPRESSION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.OPAQUE_EXPRESSION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.OPAQUE_EXPRESSION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.OPAQUE_EXPRESSION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OPAQUE_EXPRESSION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___GET_MODEL:
+			return getModel();
+		case UMLPackage.OPAQUE_EXPRESSION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.OPAQUE_EXPRESSION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.OPAQUE_EXPRESSION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.OPAQUE_EXPRESSION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.OPAQUE_EXPRESSION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.OPAQUE_EXPRESSION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.OPAQUE_EXPRESSION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OPAQUE_EXPRESSION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OPAQUE_EXPRESSION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.OPAQUE_EXPRESSION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.OPAQUE_EXPRESSION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_EXPRESSION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.OPAQUE_EXPRESSION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.OPAQUE_EXPRESSION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.OPAQUE_EXPRESSION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.OPAQUE_EXPRESSION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.OPAQUE_EXPRESSION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.OPAQUE_EXPRESSION___SEPARATOR:
+			return separator();
+		case UMLPackage.OPAQUE_EXPRESSION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.OPAQUE_EXPRESSION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.OPAQUE_EXPRESSION___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_EXPRESSION___BOOLEAN_VALUE:
+			return booleanValue();
+		case UMLPackage.OPAQUE_EXPRESSION___INTEGER_VALUE:
+			return integerValue();
+		case UMLPackage.OPAQUE_EXPRESSION___IS_COMPUTABLE:
+			return isComputable();
+		case UMLPackage.OPAQUE_EXPRESSION___IS_NULL:
+			return isNull();
+		case UMLPackage.OPAQUE_EXPRESSION___REAL_VALUE:
+			return realValue();
+		case UMLPackage.OPAQUE_EXPRESSION___STRING_VALUE:
+			return stringValue();
+		case UMLPackage.OPAQUE_EXPRESSION___UNLIMITED_VALUE:
+			return unlimitedValue();
+		case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_LANGUAGE_BODY_SIZE__DIAGNOSTICCHAIN_MAP:
+			return validateLanguageBodySize((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_ONE_RETURN_RESULT_PARAMETER__DIAGNOSTICCHAIN_MAP:
+			return validateOneReturnResultParameter((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_EXPRESSION___VALIDATE_ONLY_RETURN_RESULT_PARAMETERS__DIAGNOSTICCHAIN_MAP:
+			return validateOnlyReturnResultParameters((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPAQUE_EXPRESSION___IS_INTEGRAL:
+			return isIntegral();
+		case UMLPackage.OPAQUE_EXPRESSION___IS_NON_NEGATIVE:
+			return isNonNegative();
+		case UMLPackage.OPAQUE_EXPRESSION___IS_POSITIVE:
+			return isPositive();
+		case UMLPackage.OPAQUE_EXPRESSION___GET_RESULT:
+			return getResult();
+		case UMLPackage.OPAQUE_EXPRESSION___VALUE:
+			return value();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OperationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OperationImpl.java
index a0fdc96..4f9c73e 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OperationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OperationImpl.java
@@ -1,36 +1,51 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 212765, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
+
 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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectContainmentWithInverseEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectResolvingEList;
+
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.CallConcurrencyKind;
 import org.eclipse.uml2.uml.Classifier;
@@ -59,6 +74,7 @@
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.VisibilityKind;
+
 import org.eclipse.uml2.uml.internal.operations.OperationOperations;
 import org.eclipse.uml2.uml.internal.operations.ParameterableElementOperations;
 import org.eclipse.uml2.uml.internal.operations.TemplateableElementOperations;
@@ -174,17 +190,9 @@
 		return UMLPackage.Literals.OPERATION;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.NAMESPACE__OWNED_RULE) {
 			return createOwnedRulesList();
 		}
@@ -208,9 +216,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -219,10 +225,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.OPERATION__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true,
-			true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.OPERATION__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -231,10 +234,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.OPERATION__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.OPERATION__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -244,13 +244,10 @@
 	 */
 	public NotificationChain basicSetTemplateParameterGen(
 			TemplateParameter newTemplateParameter, NotificationChain msgs) {
-		if (newTemplateParameter != null
-			&& !(newTemplateParameter instanceof OperationTemplateParameter)) {
-			throw new IllegalArgumentException(
-				"newTemplateParameter must be an instance of OperationTemplateParameter"); //$NON-NLS-1$
+		if (newTemplateParameter != null && !(newTemplateParameter instanceof OperationTemplateParameter)) {
+			throw new IllegalArgumentException("newTemplateParameter must be an instance of OperationTemplateParameter"); //$NON-NLS-1$
 		}
-		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter,
-			UMLPackage.OPERATION__TEMPLATE_PARAMETER, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter, UMLPackage.OPERATION__TEMPLATE_PARAMETER, msgs);
 		return msgs;
 	}
 
@@ -264,7 +261,7 @@
 			TemplateParameter owningTemplateParameter = basicGetOwningTemplateParameter();
 
 			if (owningTemplateParameter != null
-				&& owningTemplateParameter != newTemplateParameter) {
+					&& owningTemplateParameter != newTemplateParameter) {
 
 				setOwningTemplateParameter(null);
 			}
@@ -279,15 +276,10 @@
 	 * @generated
 	 */
 	public void setTemplateParameter(TemplateParameter newTemplateParameter) {
-		if (newTemplateParameter != null
-			&& !(newTemplateParameter instanceof OperationTemplateParameter)) {
-			throw new IllegalArgumentException(
-				"newTemplateParameter must be an instance of OperationTemplateParameter"); //$NON-NLS-1$
+		if (newTemplateParameter != null && !(newTemplateParameter instanceof OperationTemplateParameter)) {
+			throw new IllegalArgumentException("newTemplateParameter must be an instance of OperationTemplateParameter"); //$NON-NLS-1$
 		}
-		eDynamicSet(
-			UMLPackage.OPERATION__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			newTemplateParameter);
+		eDynamicSet(UMLPackage.OPERATION__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, newTemplateParameter);
 	}
 
 	/**
@@ -305,11 +297,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			true, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -318,11 +306,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -333,8 +317,7 @@
 	public NotificationChain basicSetOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter,
-			UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter, UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -353,11 +336,7 @@
 	 */
 	public void setOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter) {
-		eDynamicSet(
-			UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			newOwningTemplateParameter);
+		eDynamicSet(UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, newOwningTemplateParameter);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -379,20 +358,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.OPERATION__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.OPERATION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.OPERATION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.OPERATION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -402,10 +374,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<TemplateBinding> getTemplateBindings() {
-		return (EList<TemplateBinding>) eDynamicGet(
-			UMLPackage.OPERATION__TEMPLATE_BINDING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING, true,
-			true);
+		return (EList<TemplateBinding>) eDynamicGet(UMLPackage.OPERATION__TEMPLATE_BINDING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING, true, true);
 	}
 
 	/**
@@ -414,8 +383,7 @@
 	 * @generated
 	 */
 	public TemplateBinding createTemplateBinding(TemplateSignature signature) {
-		TemplateBinding newTemplateBinding = (TemplateBinding) create(
-			UMLPackage.Literals.TEMPLATE_BINDING);
+		TemplateBinding newTemplateBinding = (TemplateBinding) create(UMLPackage.Literals.TEMPLATE_BINDING);
 		getTemplateBindings().add(newTemplateBinding);
 		if (signature != null)
 			newTemplateBinding.setSignature(signature);
@@ -438,15 +406,12 @@
 	 */
 	public TemplateBinding getTemplateBinding(TemplateSignature signature,
 			boolean createOnDemand) {
-		templateBindingLoop : for (TemplateBinding templateBinding : getTemplateBindings()) {
-			if (signature != null
-				&& !signature.equals(templateBinding.getSignature()))
+		templateBindingLoop: for (TemplateBinding templateBinding : getTemplateBindings()) {
+			if (signature != null && !signature.equals(templateBinding.getSignature()))
 				continue templateBindingLoop;
 			return templateBinding;
 		}
-		return createOnDemand
-			? createTemplateBinding(signature)
-			: null;
+		return createOnDemand ? createTemplateBinding(signature) : null;
 	}
 
 	/**
@@ -455,11 +420,7 @@
 	 * @generated
 	 */
 	public TemplateSignature getOwnedTemplateSignature() {
-		return (TemplateSignature) eDynamicGet(
-			UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-			true, true);
+		return (TemplateSignature) eDynamicGet(UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, true, true);
 	}
 
 	/**
@@ -468,11 +429,7 @@
 	 * @generated
 	 */
 	public TemplateSignature basicGetOwnedTemplateSignature() {
-		return (TemplateSignature) eDynamicGet(
-			UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-			false, true);
+		return (TemplateSignature) eDynamicGet(UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, false, true);
 	}
 
 	/**
@@ -483,8 +440,7 @@
 	public NotificationChain basicSetOwnedTemplateSignature(
 			TemplateSignature newOwnedTemplateSignature,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newOwnedTemplateSignature,
-			UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newOwnedTemplateSignature, UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE, msgs);
 		return msgs;
 	}
 
@@ -495,11 +451,7 @@
 	 */
 	public void setOwnedTemplateSignature(
 			TemplateSignature newOwnedTemplateSignature) {
-		eDynamicSet(
-			UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-			newOwnedTemplateSignature);
+		eDynamicSet(UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, newOwnedTemplateSignature);
 	}
 
 	/**
@@ -508,8 +460,7 @@
 	 * @generated
 	 */
 	public TemplateSignature createOwnedTemplateSignature(EClass eClass) {
-		TemplateSignature newOwnedTemplateSignature = (TemplateSignature) create(
-			eClass);
+		TemplateSignature newOwnedTemplateSignature = (TemplateSignature) create(eClass);
 		setOwnedTemplateSignature(newOwnedTemplateSignature);
 		return newOwnedTemplateSignature;
 	}
@@ -520,8 +471,7 @@
 	 * @generated
 	 */
 	public TemplateSignature createOwnedTemplateSignature() {
-		return createOwnedTemplateSignature(
-			UMLPackage.Literals.TEMPLATE_SIGNATURE);
+		return createOwnedTemplateSignature(UMLPackage.Literals.TEMPLATE_SIGNATURE);
 	}
 
 	/**
@@ -535,22 +485,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			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<Classifier>(
-						Classifier.class, this,
-						UMLPackage.OPERATION__REDEFINITION_CONTEXT,
-						REDEFINITION_CONTEXT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
+						redefinitionContexts = new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.OPERATION__REDEFINITION_CONTEXT, REDEFINITION_CONTEXT_ESUBSETS));
 			}
 			return redefinitionContexts;
 		}
-		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
-			UMLPackage.OPERATION__REDEFINITION_CONTEXT,
-			REDEFINITION_CONTEXT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.OPERATION__REDEFINITION_CONTEXT, REDEFINITION_CONTEXT_ESUBSETS);
 	}
 
 	/**
@@ -564,22 +506,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Classifier> featuringClassifiers = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
+			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>(
-						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>(Classifier.class, this,
-			UMLPackage.OPERATION__FEATURING_CLASSIFIER,
-			FEATURING_CLASSIFIER_ESUBSETS);
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.OPERATION__FEATURING_CLASSIFIER, FEATURING_CLASSIFIER_ESUBSETS);
 	}
 
 	/**
@@ -593,23 +526,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			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>(
-						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>(
-			RedefinableElement.class, this,
-			UMLPackage.OPERATION__REDEFINED_ELEMENT,
-			REDEFINED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<RedefinableElement>(RedefinableElement.class, this, UMLPackage.OPERATION__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -620,15 +544,13 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Constraint> getOwnedRules() {
-		return (EList<Constraint>) eDynamicGet(
-			UMLPackage.OPERATION__OWNED_RULE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMESPACE__OWNED_RULE, true, true);
+		return (EList<Constraint>) eDynamicGet(UMLPackage.OPERATION__OWNED_RULE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMESPACE__OWNED_RULE, true, true);
 	}
 
 	private EList<Constraint> createOwnedRulesList() {
 		return new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Constraint>(
-			Constraint.class, this, UMLPackage.OPERATION__OWNED_RULE, null,
-			OWNED_RULE_ESUBSETS, UMLPackage.CONSTRAINT__CONTEXT);
+				Constraint.class, this, UMLPackage.OPERATION__OWNED_RULE, null,
+				OWNED_RULE_ESUBSETS, UMLPackage.CONSTRAINT__CONTEXT);
 	}
 
 	/**
@@ -637,9 +559,7 @@
 	 * @generated
 	 */
 	public boolean isQuery() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.OPERATION__IS_QUERY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__IS_QUERY, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.OPERATION__IS_QUERY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__IS_QUERY, true, true);
 	}
 
 	/**
@@ -648,8 +568,7 @@
 	 * @generated
 	 */
 	public void setIsQuery(boolean newIsQuery) {
-		eDynamicSet(UMLPackage.OPERATION__IS_QUERY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__IS_QUERY, newIsQuery);
+		eDynamicSet(UMLPackage.OPERATION__IS_QUERY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__IS_QUERY, newIsQuery);
 	}
 
 	/**
@@ -694,9 +613,7 @@
 	 * @generated
 	 */
 	public org.eclipse.uml2.uml.Class getClass_() {
-		return (org.eclipse.uml2.uml.Class) eDynamicGet(
-			UMLPackage.OPERATION__CLASS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__CLASS, true, true);
+		return (org.eclipse.uml2.uml.Class) eDynamicGet(UMLPackage.OPERATION__CLASS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__CLASS, true, true);
 	}
 
 	/**
@@ -705,9 +622,7 @@
 	 * @generated
 	 */
 	public org.eclipse.uml2.uml.Class basicGetClass_() {
-		return (org.eclipse.uml2.uml.Class) eDynamicGet(
-			UMLPackage.OPERATION__CLASS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__CLASS, false, true);
+		return (org.eclipse.uml2.uml.Class) eDynamicGet(UMLPackage.OPERATION__CLASS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__CLASS, false, true);
 	}
 
 	/**
@@ -717,8 +632,7 @@
 	 */
 	public NotificationChain basicSetClass_(org.eclipse.uml2.uml.Class newClass,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newClass,
-			UMLPackage.OPERATION__CLASS, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newClass, UMLPackage.OPERATION__CLASS, msgs);
 		return msgs;
 	}
 
@@ -728,8 +642,7 @@
 	 * @generated
 	 */
 	public void setClass_(org.eclipse.uml2.uml.Class newClass) {
-		eDynamicSet(UMLPackage.OPERATION__CLASS - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__CLASS, newClass);
+		eDynamicSet(UMLPackage.OPERATION__CLASS - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__CLASS, newClass);
 	}
 
 	/**
@@ -739,15 +652,13 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Constraint> getPreconditions() {
-		return (EList<Constraint>) eDynamicGet(
-			UMLPackage.OPERATION__PRECONDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__PRECONDITION, true, true);
+		return (EList<Constraint>) eDynamicGet(UMLPackage.OPERATION__PRECONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__PRECONDITION, true, true);
 	}
 
 	private EList<Constraint> createPreconditionsList() {
 		return new SubsetSupersetEObjectResolvingEList<Constraint>(
-			Constraint.class, this, UMLPackage.OPERATION__PRECONDITION,
-			PRECONDITION_ESUPERSETS, null);
+				Constraint.class, this, UMLPackage.OPERATION__PRECONDITION,
+				PRECONDITION_ESUPERSETS, null);
 	}
 
 	/**
@@ -757,15 +668,13 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Constraint> getPostconditions() {
-		return (EList<Constraint>) eDynamicGet(
-			UMLPackage.OPERATION__POSTCONDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__POSTCONDITION, true, true);
+		return (EList<Constraint>) eDynamicGet(UMLPackage.OPERATION__POSTCONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__POSTCONDITION, true, true);
 	}
 
 	private EList<Constraint> createPostconditionsList() {
 		return new SubsetSupersetEObjectResolvingEList<Constraint>(
-			Constraint.class, this, UMLPackage.OPERATION__POSTCONDITION,
-			POSTCONDITION_ESUPERSETS, null);
+				Constraint.class, this, UMLPackage.OPERATION__POSTCONDITION,
+				POSTCONDITION_ESUPERSETS, null);
 	}
 
 	/**
@@ -775,9 +684,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Operation> getRedefinedOperations() {
-		return (EList<Operation>) eDynamicGet(
-			UMLPackage.OPERATION__REDEFINED_OPERATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__REDEFINED_OPERATION, true, true);
+		return (EList<Operation>) eDynamicGet(UMLPackage.OPERATION__REDEFINED_OPERATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__REDEFINED_OPERATION, true, true);
 	}
 
 	/**
@@ -788,8 +695,7 @@
 	public Operation getRedefinedOperation(String name,
 			EList<String> ownedParameterNames,
 			EList<Type> ownedParameterTypes) {
-		return getRedefinedOperation(name, ownedParameterNames,
-			ownedParameterTypes, false);
+		return getRedefinedOperation(name, ownedParameterNames, ownedParameterTypes, false);
 	}
 
 	/**
@@ -800,29 +706,18 @@
 	public Operation getRedefinedOperation(String name,
 			EList<String> ownedParameterNames, EList<Type> ownedParameterTypes,
 			boolean ignoreCase) {
-		redefinedOperationLoop : for (Operation redefinedOperation : getRedefinedOperations()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinedOperation.getName())
-				: name.equals(redefinedOperation.getName())))
+		redefinedOperationLoop: for (Operation redefinedOperation : getRedefinedOperations()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinedOperation.getName()) : name.equals(redefinedOperation.getName())))
 				continue redefinedOperationLoop;
-			EList<Parameter> ownedParameterList = redefinedOperation
-				.getOwnedParameters();
+			EList<Parameter> ownedParameterList = redefinedOperation.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
-			if (ownedParameterNames != null
-				&& ownedParameterNames.size() != ownedParameterListSize
-				|| (ownedParameterTypes != null
-					&& ownedParameterTypes.size() != ownedParameterListSize))
+			if (ownedParameterNames != null && ownedParameterNames.size() != ownedParameterListSize || (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue redefinedOperationLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
 				Parameter ownedParameter = ownedParameterList.get(j);
-				if (ownedParameterNames != null && !(ignoreCase
-					? (ownedParameterNames.get(j))
-						.equalsIgnoreCase(ownedParameter.getName())
-					: ownedParameterNames.get(j)
-						.equals(ownedParameter.getName())))
+				if (ownedParameterNames != null && !(ignoreCase ? (ownedParameterNames.get(j)).equalsIgnoreCase(ownedParameter.getName()) : ownedParameterNames.get(j).equals(ownedParameter.getName())))
 					continue redefinedOperationLoop;
-				if (ownedParameterTypes != null && !ownedParameterTypes.get(j)
-					.equals(ownedParameter.getType()))
+				if (ownedParameterTypes != null && !ownedParameterTypes.get(j).equals(ownedParameter.getType()))
 					continue redefinedOperationLoop;
 			}
 			return redefinedOperation;
@@ -836,9 +731,7 @@
 	 * @generated
 	 */
 	public DataType getDatatype() {
-		return (DataType) eDynamicGet(
-			UMLPackage.OPERATION__DATATYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__DATATYPE, true, true);
+		return (DataType) eDynamicGet(UMLPackage.OPERATION__DATATYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__DATATYPE, true, true);
 	}
 
 	/**
@@ -847,9 +740,7 @@
 	 * @generated
 	 */
 	public DataType basicGetDatatype() {
-		return (DataType) eDynamicGet(
-			UMLPackage.OPERATION__DATATYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__DATATYPE, false, true);
+		return (DataType) eDynamicGet(UMLPackage.OPERATION__DATATYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__DATATYPE, false, true);
 	}
 
 	/**
@@ -859,8 +750,7 @@
 	 */
 	public NotificationChain basicSetDatatype(DataType newDatatype,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newDatatype,
-			UMLPackage.OPERATION__DATATYPE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newDatatype, UMLPackage.OPERATION__DATATYPE, msgs);
 		return msgs;
 	}
 
@@ -870,8 +760,7 @@
 	 * @generated
 	 */
 	public void setDatatype(DataType newDatatype) {
-		eDynamicSet(UMLPackage.OPERATION__DATATYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__DATATYPE, newDatatype);
+		eDynamicSet(UMLPackage.OPERATION__DATATYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__DATATYPE, newDatatype);
 	}
 
 	/**
@@ -880,9 +769,7 @@
 	 * @generated
 	 */
 	public Constraint getBodyCondition() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.OPERATION__BODY_CONDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__BODY_CONDITION, true, true);
+		return (Constraint) eDynamicGet(UMLPackage.OPERATION__BODY_CONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__BODY_CONDITION, true, true);
 	}
 
 	/**
@@ -891,9 +778,7 @@
 	 * @generated
 	 */
 	public Constraint basicGetBodyCondition() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.OPERATION__BODY_CONDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__BODY_CONDITION, false, true);
+		return (Constraint) eDynamicGet(UMLPackage.OPERATION__BODY_CONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__BODY_CONDITION, false, true);
 	}
 
 	/**
@@ -902,9 +787,7 @@
 	 * @generated
 	 */
 	public void setBodyCondition(Constraint newBodyCondition) {
-		eDynamicSet(
-			UMLPackage.OPERATION__BODY_CONDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__BODY_CONDITION, newBodyCondition);
+		eDynamicSet(UMLPackage.OPERATION__BODY_CONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__BODY_CONDITION, newBodyCondition);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newBodyCondition != null) {
@@ -945,9 +828,7 @@
 	 */
 	public Type getType() {
 		Type type = basicGetType();
-		return type != null && type.eIsProxy()
-			? (Type) eResolveProxy((InternalEObject) type)
-			: type;
+		return type != null && type.eIsProxy() ? (Type) eResolveProxy((InternalEObject) type) : type;
 	}
 
 	/**
@@ -965,9 +846,7 @@
 	 * @generated
 	 */
 	public Interface getInterface() {
-		return (Interface) eDynamicGet(
-			UMLPackage.OPERATION__INTERFACE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__INTERFACE, true, true);
+		return (Interface) eDynamicGet(UMLPackage.OPERATION__INTERFACE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__INTERFACE, true, true);
 	}
 
 	/**
@@ -976,9 +855,7 @@
 	 * @generated
 	 */
 	public Interface basicGetInterface() {
-		return (Interface) eDynamicGet(
-			UMLPackage.OPERATION__INTERFACE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__INTERFACE, false, true);
+		return (Interface) eDynamicGet(UMLPackage.OPERATION__INTERFACE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__INTERFACE, false, true);
 	}
 
 	/**
@@ -988,8 +865,7 @@
 	 */
 	public NotificationChain basicSetInterface(Interface newInterface,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newInterface,
-			UMLPackage.OPERATION__INTERFACE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newInterface, UMLPackage.OPERATION__INTERFACE, msgs);
 		return msgs;
 	}
 
@@ -999,8 +875,7 @@
 	 * @generated
 	 */
 	public void setInterface(Interface newInterface) {
-		eDynamicSet(UMLPackage.OPERATION__INTERFACE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.OPERATION__INTERFACE, newInterface);
+		eDynamicSet(UMLPackage.OPERATION__INTERFACE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.OPERATION__INTERFACE, newInterface);
 	}
 
 	/**
@@ -1011,10 +886,7 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Parameter> getOwnedParameters() {
-		return (EList<Parameter>) eDynamicGet(
-			UMLPackage.OPERATION__OWNED_PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORAL_FEATURE__OWNED_PARAMETER, true,
-			true);
+		return (EList<Parameter>) eDynamicGet(UMLPackage.OPERATION__OWNED_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORAL_FEATURE__OWNED_PARAMETER, true, true);
 	}
 
 	/**
@@ -1022,10 +894,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Parameter createOwnedParameter(String name, Type type) {
-		Parameter newOwnedParameter = (Parameter) create(
-			UMLPackage.Literals.PARAMETER);
+		Parameter newOwnedParameter = (Parameter) create(UMLPackage.Literals.PARAMETER);
 		getOwnedParameters().add(newOwnedParameter);
 		if (name != null)
 			newOwnedParameter.setName(name);
@@ -1039,7 +909,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Parameter getOwnedParameter(String name, Type type) {
 		return getOwnedParameter(name, type, false, false);
 	}
@@ -1049,21 +918,16 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Parameter getOwnedParameter(String name, Type type,
 			boolean ignoreCase, boolean createOnDemand) {
-		ownedParameterLoop : for (Parameter ownedParameter : getOwnedParameters()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedParameter.getName())
-				: name.equals(ownedParameter.getName())))
+		ownedParameterLoop: for (Parameter ownedParameter : getOwnedParameters()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedParameter.getName()) : name.equals(ownedParameter.getName())))
 				continue ownedParameterLoop;
 			if (type != null && !type.equals(ownedParameter.getType()))
 				continue ownedParameterLoop;
 			return ownedParameter;
 		}
-		return createOnDemand
-			? createOwnedParameter(name, type)
-			: null;
+		return createOnDemand ? createOwnedParameter(name, type) : null;
 	}
 
 	/**
@@ -1083,10 +947,7 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Type> getRaisedExceptions() {
-		return (EList<Type>) eDynamicGet(
-			UMLPackage.OPERATION__RAISED_EXCEPTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.BEHAVIORAL_FEATURE__RAISED_EXCEPTION, true,
-			true);
+		return (EList<Type>) eDynamicGet(UMLPackage.OPERATION__RAISED_EXCEPTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.BEHAVIORAL_FEATURE__RAISED_EXCEPTION, true, true);
 	}
 
 	/**
@@ -1094,7 +955,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Type getRaisedException(String name) {
 		return getRaisedException(name, false, null);
 	}
@@ -1104,15 +964,12 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Type getRaisedException(String name, boolean ignoreCase,
 			EClass eClass) {
-		raisedExceptionLoop : for (Type raisedException : getRaisedExceptions()) {
+		raisedExceptionLoop: for (Type raisedException : getRaisedExceptions()) {
 			if (eClass != null && !eClass.isInstance(raisedException))
 				continue raisedExceptionLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(raisedException.getName())
-				: name.equals(raisedException.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(raisedException.getName()) : name.equals(raisedException.getName())))
 				continue raisedExceptionLoop;
 			return raisedException;
 		}
@@ -1155,14 +1012,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<ParameterableElement> result = (EList<ParameterableElement>) cache
-				.get(this,
-					UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS);
+			EList<ParameterableElement> result = (EList<ParameterableElement>) cache.get(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS,
-					result = TemplateableElementOperations
-						.parameterableElements(this));
+				cache.put(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS, result = TemplateableElementOperations.parameterableElements(this));
 			}
 			return result;
 		}
@@ -1185,8 +1037,7 @@
 	 */
 	public boolean validateAtMostOneReturn(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return OperationOperations.validateAtMostOneReturn(this, diagnostics,
-			context);
+		return OperationOperations.validateAtMostOneReturn(this, diagnostics, context);
 	}
 
 	/**
@@ -1196,8 +1047,7 @@
 	 */
 	public boolean validateOnlyBodyForQuery(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return OperationOperations.validateOnlyBodyForQuery(this, diagnostics,
-			context);
+		return OperationOperations.validateOnlyBodyForQuery(this, diagnostics, context);
 	}
 
 	/**
@@ -1263,11 +1113,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Parameter> result = (EList<Parameter>) cache.get(this,
-				UMLPackage.Literals.OPERATION___RETURN_RESULT);
+			EList<Parameter> result = (EList<Parameter>) cache.get(this, UMLPackage.Literals.OPERATION___RETURN_RESULT);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.OPERATION___RETURN_RESULT,
-					result = OperationOperations.returnResult(this));
+				cache.put(this, UMLPackage.Literals.OPERATION___RETURN_RESULT, result = OperationOperations.returnResult(this));
 			}
 			return result;
 		}
@@ -1294,60 +1142,44 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.OPERATION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.OPERATION__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.OPERATION__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.OPERATION__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.OPERATION__METHOD :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getMethods())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.OPERATION__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.OPERATION__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.OPERATION__CLASS :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetClass_((org.eclipse.uml2.uml.Class) otherEnd,
-					msgs);
-			case UMLPackage.OPERATION__DATATYPE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetDatatype((DataType) otherEnd, msgs);
-			case UMLPackage.OPERATION__INTERFACE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetInterface((Interface) otherEnd, msgs);
+		case UMLPackage.OPERATION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.OPERATION__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.OPERATION__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.OPERATION__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.OPERATION__METHOD:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getMethods()).basicAdd(otherEnd, msgs);
+		case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.OPERATION__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.OPERATION__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.OPERATION__CLASS:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetClass_((org.eclipse.uml2.uml.Class) otherEnd, msgs);
+		case UMLPackage.OPERATION__DATATYPE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetDatatype((DataType) otherEnd, msgs);
+		case UMLPackage.OPERATION__INTERFACE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetInterface((Interface) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -1361,47 +1193,38 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.OPERATION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OPERATION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OPERATION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.OPERATION__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OPERATION__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OPERATION__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OPERATION__METHOD :
-				return ((InternalEList<?>) getMethods()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.OPERATION__OWNED_PARAMETER :
-				return ((InternalEList<?>) getOwnedParameters())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OPERATION__OWNED_PARAMETER_SET :
-				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(otherEnd, msgs);
-			case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.OPERATION__CLASS :
-				return basicSetClass_(null, msgs);
-			case UMLPackage.OPERATION__DATATYPE :
-				return basicSetDatatype(null, msgs);
-			case UMLPackage.OPERATION__INTERFACE :
-				return basicSetInterface(null, msgs);
+		case UMLPackage.OPERATION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPERATION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPERATION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.OPERATION__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPERATION__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPERATION__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPERATION__METHOD:
+			return ((InternalEList<?>) getMethods()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPERATION__OWNED_PARAMETER:
+			return ((InternalEList<?>) getOwnedParameters()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPERATION__OWNED_PARAMETER_SET:
+			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(otherEnd, msgs);
+		case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.OPERATION__CLASS:
+			return basicSetClass_(null, msgs);
+		case UMLPackage.OPERATION__DATATYPE:
+			return basicSetDatatype(null, msgs);
+		case UMLPackage.OPERATION__INTERFACE:
+			return basicSetInterface(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -1415,22 +1238,14 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
-			case UMLPackage.OPERATION__CLASS :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.CLASS__OWNED_OPERATION,
-					org.eclipse.uml2.uml.Class.class, msgs);
-			case UMLPackage.OPERATION__DATATYPE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.DATA_TYPE__OWNED_OPERATION, DataType.class,
-					msgs);
-			case UMLPackage.OPERATION__INTERFACE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.INTERFACE__OWNED_OPERATION, Interface.class,
-					msgs);
+		case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+		case UMLPackage.OPERATION__CLASS:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.CLASS__OWNED_OPERATION, org.eclipse.uml2.uml.Class.class, msgs);
+		case UMLPackage.OPERATION__DATATYPE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.DATA_TYPE__OWNED_OPERATION, DataType.class, msgs);
+		case UMLPackage.OPERATION__INTERFACE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.INTERFACE__OWNED_OPERATION, Interface.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -1443,116 +1258,116 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.OPERATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.OPERATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.OPERATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.OPERATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.OPERATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.OPERATION__NAME :
-				return getName();
-			case UMLPackage.OPERATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.OPERATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.OPERATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.OPERATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.OPERATION__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.OPERATION__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.OPERATION__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.OPERATION__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.OPERATION__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.OPERATION__MEMBER :
-				return getMembers();
-			case UMLPackage.OPERATION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.OPERATION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.OPERATION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.OPERATION__FEATURING_CLASSIFIER :
-				return getFeaturingClassifiers();
-			case UMLPackage.OPERATION__IS_STATIC :
-				return isStatic();
-			case UMLPackage.OPERATION__CONCURRENCY :
-				return getConcurrency();
-			case UMLPackage.OPERATION__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.OPERATION__METHOD :
-				return getMethods();
-			case UMLPackage.OPERATION__OWNED_PARAMETER :
-				return getOwnedParameters();
-			case UMLPackage.OPERATION__OWNED_PARAMETER_SET :
-				return getOwnedParameterSets();
-			case UMLPackage.OPERATION__RAISED_EXCEPTION :
-				return getRaisedExceptions();
-			case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.OPERATION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.OPERATION__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.OPERATION__BODY_CONDITION :
-				if (resolve)
-					return getBodyCondition();
-				return basicGetBodyCondition();
-			case UMLPackage.OPERATION__CLASS :
-				if (resolve)
-					return getClass_();
-				return basicGetClass_();
-			case UMLPackage.OPERATION__DATATYPE :
-				if (resolve)
-					return getDatatype();
-				return basicGetDatatype();
-			case UMLPackage.OPERATION__INTERFACE :
-				if (resolve)
-					return getInterface();
-				return basicGetInterface();
-			case UMLPackage.OPERATION__IS_ORDERED :
-				return isOrdered();
-			case UMLPackage.OPERATION__IS_QUERY :
-				return isQuery();
-			case UMLPackage.OPERATION__IS_UNIQUE :
-				return isUnique();
-			case UMLPackage.OPERATION__LOWER :
-				return getLower();
-			case UMLPackage.OPERATION__POSTCONDITION :
-				return getPostconditions();
-			case UMLPackage.OPERATION__PRECONDITION :
-				return getPreconditions();
-			case UMLPackage.OPERATION__REDEFINED_OPERATION :
-				return getRedefinedOperations();
-			case UMLPackage.OPERATION__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.OPERATION__UPPER :
-				return getUpper();
+		case UMLPackage.OPERATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.OPERATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.OPERATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.OPERATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.OPERATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.OPERATION__NAME:
+			return getName();
+		case UMLPackage.OPERATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.OPERATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.OPERATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.OPERATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.OPERATION__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.OPERATION__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.OPERATION__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.OPERATION__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.OPERATION__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.OPERATION__MEMBER:
+			return getMembers();
+		case UMLPackage.OPERATION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.OPERATION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.OPERATION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.OPERATION__FEATURING_CLASSIFIER:
+			return getFeaturingClassifiers();
+		case UMLPackage.OPERATION__IS_STATIC:
+			return isStatic();
+		case UMLPackage.OPERATION__CONCURRENCY:
+			return getConcurrency();
+		case UMLPackage.OPERATION__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.OPERATION__METHOD:
+			return getMethods();
+		case UMLPackage.OPERATION__OWNED_PARAMETER:
+			return getOwnedParameters();
+		case UMLPackage.OPERATION__OWNED_PARAMETER_SET:
+			return getOwnedParameterSets();
+		case UMLPackage.OPERATION__RAISED_EXCEPTION:
+			return getRaisedExceptions();
+		case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.OPERATION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.OPERATION__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.OPERATION__BODY_CONDITION:
+			if (resolve)
+				return getBodyCondition();
+			return basicGetBodyCondition();
+		case UMLPackage.OPERATION__CLASS:
+			if (resolve)
+				return getClass_();
+			return basicGetClass_();
+		case UMLPackage.OPERATION__DATATYPE:
+			if (resolve)
+				return getDatatype();
+			return basicGetDatatype();
+		case UMLPackage.OPERATION__INTERFACE:
+			if (resolve)
+				return getInterface();
+			return basicGetInterface();
+		case UMLPackage.OPERATION__IS_ORDERED:
+			return isOrdered();
+		case UMLPackage.OPERATION__IS_QUERY:
+			return isQuery();
+		case UMLPackage.OPERATION__IS_UNIQUE:
+			return isUnique();
+		case UMLPackage.OPERATION__LOWER:
+			return getLower();
+		case UMLPackage.OPERATION__POSTCONDITION:
+			return getPostconditions();
+		case UMLPackage.OPERATION__PRECONDITION:
+			return getPreconditions();
+		case UMLPackage.OPERATION__REDEFINED_OPERATION:
+			return getRedefinedOperations();
+		case UMLPackage.OPERATION__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.OPERATION__UPPER:
+			return getUpper();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -1566,115 +1381,103 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.OPERATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.OPERATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.OPERATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.OPERATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.OPERATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.OPERATION__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.OPERATION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.OPERATION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.OPERATION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.OPERATION__IS_STATIC :
-				setIsStatic((Boolean) newValue);
-				return;
-			case UMLPackage.OPERATION__CONCURRENCY :
-				setConcurrency((CallConcurrencyKind) newValue);
-				return;
-			case UMLPackage.OPERATION__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.OPERATION__METHOD :
-				getMethods().clear();
-				getMethods().addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.OPERATION__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				getOwnedParameters()
-					.addAll((Collection<? extends Parameter>) newValue);
-				return;
-			case UMLPackage.OPERATION__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				getOwnedParameterSets()
-					.addAll((Collection<? extends ParameterSet>) newValue);
-				return;
-			case UMLPackage.OPERATION__RAISED_EXCEPTION :
-				getRaisedExceptions().clear();
-				getRaisedExceptions()
-					.addAll((Collection<? extends Type>) newValue);
-				return;
-			case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.OPERATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.OPERATION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.OPERATION__BODY_CONDITION :
-				setBodyCondition((Constraint) newValue);
-				return;
-			case UMLPackage.OPERATION__CLASS :
-				setClass_((org.eclipse.uml2.uml.Class) newValue);
-				return;
-			case UMLPackage.OPERATION__DATATYPE :
-				setDatatype((DataType) newValue);
-				return;
-			case UMLPackage.OPERATION__INTERFACE :
-				setInterface((Interface) newValue);
-				return;
-			case UMLPackage.OPERATION__IS_QUERY :
-				setIsQuery((Boolean) newValue);
-				return;
-			case UMLPackage.OPERATION__POSTCONDITION :
-				getPostconditions().clear();
-				getPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.OPERATION__PRECONDITION :
-				getPreconditions().clear();
-				getPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.OPERATION__REDEFINED_OPERATION :
-				getRedefinedOperations().clear();
-				getRedefinedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
+		case UMLPackage.OPERATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.OPERATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.OPERATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.OPERATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.OPERATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.OPERATION__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.OPERATION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.OPERATION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.OPERATION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.OPERATION__IS_STATIC:
+			setIsStatic((Boolean) newValue);
+			return;
+		case UMLPackage.OPERATION__CONCURRENCY:
+			setConcurrency((CallConcurrencyKind) newValue);
+			return;
+		case UMLPackage.OPERATION__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.OPERATION__METHOD:
+			getMethods().clear();
+			getMethods().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.OPERATION__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			getOwnedParameters().addAll((Collection<? extends Parameter>) newValue);
+			return;
+		case UMLPackage.OPERATION__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			getOwnedParameterSets().addAll((Collection<? extends ParameterSet>) newValue);
+			return;
+		case UMLPackage.OPERATION__RAISED_EXCEPTION:
+			getRaisedExceptions().clear();
+			getRaisedExceptions().addAll((Collection<? extends Type>) newValue);
+			return;
+		case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.OPERATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.OPERATION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.OPERATION__BODY_CONDITION:
+			setBodyCondition((Constraint) newValue);
+			return;
+		case UMLPackage.OPERATION__CLASS:
+			setClass_((org.eclipse.uml2.uml.Class) newValue);
+			return;
+		case UMLPackage.OPERATION__DATATYPE:
+			setDatatype((DataType) newValue);
+			return;
+		case UMLPackage.OPERATION__INTERFACE:
+			setInterface((Interface) newValue);
+			return;
+		case UMLPackage.OPERATION__IS_QUERY:
+			setIsQuery((Boolean) newValue);
+			return;
+		case UMLPackage.OPERATION__POSTCONDITION:
+			getPostconditions().clear();
+			getPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.OPERATION__PRECONDITION:
+			getPreconditions().clear();
+			getPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.OPERATION__REDEFINED_OPERATION:
+			getRedefinedOperations().clear();
+			getRedefinedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -1687,90 +1490,90 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OPERATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.OPERATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.OPERATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.OPERATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.OPERATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.OPERATION__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.OPERATION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.OPERATION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.OPERATION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.OPERATION__IS_STATIC :
-				setIsStatic(IS_STATIC_EDEFAULT);
-				return;
-			case UMLPackage.OPERATION__CONCURRENCY :
-				setConcurrency(CONCURRENCY_EDEFAULT);
-				return;
-			case UMLPackage.OPERATION__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.OPERATION__METHOD :
-				getMethods().clear();
-				return;
-			case UMLPackage.OPERATION__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				return;
-			case UMLPackage.OPERATION__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				return;
-			case UMLPackage.OPERATION__RAISED_EXCEPTION :
-				getRaisedExceptions().clear();
-				return;
-			case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.OPERATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.OPERATION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.OPERATION__BODY_CONDITION :
-				setBodyCondition((Constraint) null);
-				return;
-			case UMLPackage.OPERATION__CLASS :
-				setClass_((org.eclipse.uml2.uml.Class) null);
-				return;
-			case UMLPackage.OPERATION__DATATYPE :
-				setDatatype((DataType) null);
-				return;
-			case UMLPackage.OPERATION__INTERFACE :
-				setInterface((Interface) null);
-				return;
-			case UMLPackage.OPERATION__IS_QUERY :
-				setIsQuery(IS_QUERY_EDEFAULT);
-				return;
-			case UMLPackage.OPERATION__POSTCONDITION :
-				getPostconditions().clear();
-				return;
-			case UMLPackage.OPERATION__PRECONDITION :
-				getPreconditions().clear();
-				return;
-			case UMLPackage.OPERATION__REDEFINED_OPERATION :
-				getRedefinedOperations().clear();
-				return;
+		case UMLPackage.OPERATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.OPERATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.OPERATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.OPERATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.OPERATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.OPERATION__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.OPERATION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.OPERATION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.OPERATION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.OPERATION__IS_STATIC:
+			setIsStatic(IS_STATIC_EDEFAULT);
+			return;
+		case UMLPackage.OPERATION__CONCURRENCY:
+			setConcurrency(CONCURRENCY_EDEFAULT);
+			return;
+		case UMLPackage.OPERATION__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.OPERATION__METHOD:
+			getMethods().clear();
+			return;
+		case UMLPackage.OPERATION__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			return;
+		case UMLPackage.OPERATION__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			return;
+		case UMLPackage.OPERATION__RAISED_EXCEPTION:
+			getRaisedExceptions().clear();
+			return;
+		case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.OPERATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.OPERATION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.OPERATION__BODY_CONDITION:
+			setBodyCondition((Constraint) null);
+			return;
+		case UMLPackage.OPERATION__CLASS:
+			setClass_((org.eclipse.uml2.uml.Class) null);
+			return;
+		case UMLPackage.OPERATION__DATATYPE:
+			setDatatype((DataType) null);
+			return;
+		case UMLPackage.OPERATION__INTERFACE:
+			setInterface((Interface) null);
+			return;
+		case UMLPackage.OPERATION__IS_QUERY:
+			setIsQuery(IS_QUERY_EDEFAULT);
+			return;
+		case UMLPackage.OPERATION__POSTCONDITION:
+			getPostconditions().clear();
+			return;
+		case UMLPackage.OPERATION__PRECONDITION:
+			getPreconditions().clear();
+			return;
+		case UMLPackage.OPERATION__REDEFINED_OPERATION:
+			getRedefinedOperations().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1783,96 +1586,94 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OPERATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.OPERATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.OPERATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.OPERATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.OPERATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.OPERATION__NAME :
-				return isSetName();
-			case UMLPackage.OPERATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.OPERATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.OPERATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.OPERATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.OPERATION__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.OPERATION__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.OPERATION__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.OPERATION__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.OPERATION__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.OPERATION__MEMBER :
-				return isSetMembers();
-			case UMLPackage.OPERATION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.OPERATION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.OPERATION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.OPERATION__FEATURING_CLASSIFIER :
-				return isSetFeaturingClassifiers();
-			case UMLPackage.OPERATION__IS_STATIC :
-				return isStatic() != IS_STATIC_EDEFAULT;
-			case UMLPackage.OPERATION__CONCURRENCY :
-				return getConcurrency() != CONCURRENCY_EDEFAULT;
-			case UMLPackage.OPERATION__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.OPERATION__METHOD :
-				return !getMethods().isEmpty();
-			case UMLPackage.OPERATION__OWNED_PARAMETER :
-				return isSetOwnedParameters();
-			case UMLPackage.OPERATION__OWNED_PARAMETER_SET :
-				return !getOwnedParameterSets().isEmpty();
-			case UMLPackage.OPERATION__RAISED_EXCEPTION :
-				return isSetRaisedExceptions();
-			case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.OPERATION__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.OPERATION__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE :
-				return basicGetOwnedTemplateSignature() != null;
-			case UMLPackage.OPERATION__BODY_CONDITION :
-				return basicGetBodyCondition() != null;
-			case UMLPackage.OPERATION__CLASS :
-				return basicGetClass_() != null;
-			case UMLPackage.OPERATION__DATATYPE :
-				return basicGetDatatype() != null;
-			case UMLPackage.OPERATION__INTERFACE :
-				return basicGetInterface() != null;
-			case UMLPackage.OPERATION__IS_ORDERED :
-				return isOrdered() != IS_ORDERED_EDEFAULT;
-			case UMLPackage.OPERATION__IS_QUERY :
-				return isQuery() != IS_QUERY_EDEFAULT;
-			case UMLPackage.OPERATION__IS_UNIQUE :
-				return isUnique() != IS_UNIQUE_EDEFAULT;
-			case UMLPackage.OPERATION__LOWER :
-				return getLower() != LOWER_EDEFAULT;
-			case UMLPackage.OPERATION__POSTCONDITION :
-				return !getPostconditions().isEmpty();
-			case UMLPackage.OPERATION__PRECONDITION :
-				return !getPreconditions().isEmpty();
-			case UMLPackage.OPERATION__REDEFINED_OPERATION :
-				return !getRedefinedOperations().isEmpty();
-			case UMLPackage.OPERATION__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.OPERATION__UPPER :
-				return getUpper() != UPPER_EDEFAULT;
+		case UMLPackage.OPERATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.OPERATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.OPERATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.OPERATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.OPERATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.OPERATION__NAME:
+			return isSetName();
+		case UMLPackage.OPERATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.OPERATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.OPERATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.OPERATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.OPERATION__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.OPERATION__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.OPERATION__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.OPERATION__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.OPERATION__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.OPERATION__MEMBER:
+			return isSetMembers();
+		case UMLPackage.OPERATION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.OPERATION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.OPERATION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.OPERATION__FEATURING_CLASSIFIER:
+			return isSetFeaturingClassifiers();
+		case UMLPackage.OPERATION__IS_STATIC:
+			return isStatic() != IS_STATIC_EDEFAULT;
+		case UMLPackage.OPERATION__CONCURRENCY:
+			return getConcurrency() != CONCURRENCY_EDEFAULT;
+		case UMLPackage.OPERATION__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.OPERATION__METHOD:
+			return !getMethods().isEmpty();
+		case UMLPackage.OPERATION__OWNED_PARAMETER:
+			return isSetOwnedParameters();
+		case UMLPackage.OPERATION__OWNED_PARAMETER_SET:
+			return !getOwnedParameterSets().isEmpty();
+		case UMLPackage.OPERATION__RAISED_EXCEPTION:
+			return isSetRaisedExceptions();
+		case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.OPERATION__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.OPERATION__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE:
+			return basicGetOwnedTemplateSignature() != null;
+		case UMLPackage.OPERATION__BODY_CONDITION:
+			return basicGetBodyCondition() != null;
+		case UMLPackage.OPERATION__CLASS:
+			return basicGetClass_() != null;
+		case UMLPackage.OPERATION__DATATYPE:
+			return basicGetDatatype() != null;
+		case UMLPackage.OPERATION__INTERFACE:
+			return basicGetInterface() != null;
+		case UMLPackage.OPERATION__IS_ORDERED:
+			return isOrdered() != IS_ORDERED_EDEFAULT;
+		case UMLPackage.OPERATION__IS_QUERY:
+			return isQuery() != IS_QUERY_EDEFAULT;
+		case UMLPackage.OPERATION__IS_UNIQUE:
+			return isUnique() != IS_UNIQUE_EDEFAULT;
+		case UMLPackage.OPERATION__LOWER:
+			return getLower() != LOWER_EDEFAULT;
+		case UMLPackage.OPERATION__POSTCONDITION:
+			return !getPostconditions().isEmpty();
+		case UMLPackage.OPERATION__PRECONDITION:
+			return !getPreconditions().isEmpty();
+		case UMLPackage.OPERATION__REDEFINED_OPERATION:
+			return !getRedefinedOperations().isEmpty();
+		case UMLPackage.OPERATION__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.OPERATION__UPPER:
+			return getUpper() != UPPER_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1887,22 +1688,22 @@
 			Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER :
-					return UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
-				case UMLPackage.OPERATION__TEMPLATE_PARAMETER :
-					return UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER:
+				return UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
+			case UMLPackage.OPERATION__TEMPLATE_PARAMETER:
+				return UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == TemplateableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.OPERATION__TEMPLATE_BINDING :
-					return UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING;
-				case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE :
-					return UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE;
-				default :
-					return -1;
+			case UMLPackage.OPERATION__TEMPLATE_BINDING:
+				return UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING;
+			case UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE:
+				return UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -1918,22 +1719,22 @@
 			Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-					return UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER;
-				case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER :
-					return UMLPackage.OPERATION__TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+				return UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER;
+			case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER:
+				return UMLPackage.OPERATION__TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == TemplateableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING :
-					return UMLPackage.OPERATION__TEMPLATE_BINDING;
-				case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE :
-					return UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE;
-				default :
-					return -1;
+			case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING:
+				return UMLPackage.OPERATION__TEMPLATE_BINDING;
+			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE:
+				return UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1948,22 +1749,22 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-					return UMLPackage.OPERATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT;
-				case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER :
-					return UMLPackage.OPERATION___IS_TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+				return UMLPackage.OPERATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT;
+			case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER:
+				return UMLPackage.OPERATION___IS_TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == TemplateableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.TEMPLATEABLE_ELEMENT___IS_TEMPLATE :
-					return UMLPackage.OPERATION___IS_TEMPLATE;
-				case UMLPackage.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS :
-					return UMLPackage.OPERATION___PARAMETERABLE_ELEMENTS;
-				default :
-					return -1;
+			case UMLPackage.TEMPLATEABLE_ELEMENT___IS_TEMPLATE:
+				return UMLPackage.OPERATION___IS_TEMPLATE;
+			case UMLPackage.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS:
+				return UMLPackage.OPERATION___PARAMETERABLE_ELEMENTS;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -1979,237 +1780,195 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.OPERATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.OPERATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.OPERATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OPERATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.OPERATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.OPERATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.OPERATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.OPERATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.OPERATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.OPERATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.OPERATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OPERATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.OPERATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.OPERATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.OPERATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.OPERATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.OPERATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.OPERATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.OPERATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.OPERATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OPERATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.OPERATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.OPERATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.OPERATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OPERATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OPERATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.OPERATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OPERATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.OPERATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.OPERATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.OPERATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.OPERATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.OPERATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OPERATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.OPERATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.OPERATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.OPERATION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.OPERATION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.OPERATION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.OPERATION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.OPERATION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.OPERATION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.OPERATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.OPERATION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.OPERATION___SEPARATOR :
-				return separator();
-			case UMLPackage.OPERATION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.OPERATION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.OPERATION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.OPERATION___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.OPERATION___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.OPERATION___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.OPERATION___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.OPERATION___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.OPERATION___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.OPERATION___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.OPERATION___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.OPERATION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.OPERATION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.OPERATION___VALIDATE_ABSTRACT_NO_METHOD__DIAGNOSTICCHAIN_MAP :
-				return validateAbstractNoMethod(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION___CREATE_RETURN_RESULT__STRING_TYPE :
-				return createReturnResult((String) arguments.get(0),
-					(Type) arguments.get(1));
-			case UMLPackage.OPERATION___INPUT_PARAMETERS :
-				return inputParameters();
-			case UMLPackage.OPERATION___OUTPUT_PARAMETERS :
-				return outputParameters();
-			case UMLPackage.OPERATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.OPERATION___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.OPERATION___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.OPERATION___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.OPERATION___VALIDATE_AT_MOST_ONE_RETURN__DIAGNOSTICCHAIN_MAP :
-				return validateAtMostOneReturn(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION___VALIDATE_ONLY_BODY_FOR_QUERY__DIAGNOSTICCHAIN_MAP :
-				return validateOnlyBodyForQuery(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION___GET_RETURN_RESULT :
-				return getReturnResult();
-			case UMLPackage.OPERATION___SET_IS_ORDERED__BOOLEAN :
-				setIsOrdered((Boolean) arguments.get(0));
-				return null;
-			case UMLPackage.OPERATION___SET_IS_UNIQUE__BOOLEAN :
-				setIsUnique((Boolean) arguments.get(0));
-				return null;
-			case UMLPackage.OPERATION___SET_LOWER__INT :
-				setLower((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.OPERATION___SET_TYPE__TYPE :
-				setType((Type) arguments.get(0));
-				return null;
-			case UMLPackage.OPERATION___SET_UPPER__INT :
-				setUpper((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.OPERATION___IS_ORDERED :
-				return isOrdered();
-			case UMLPackage.OPERATION___IS_UNIQUE :
-				return isUnique();
-			case UMLPackage.OPERATION___GET_LOWER :
-				return getLower();
-			case UMLPackage.OPERATION___RETURN_RESULT :
-				return returnResult();
-			case UMLPackage.OPERATION___GET_TYPE :
-				return getType();
-			case UMLPackage.OPERATION___GET_UPPER :
-				return getUpper();
+		case UMLPackage.OPERATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.OPERATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.OPERATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OPERATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.OPERATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.OPERATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.OPERATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.OPERATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.OPERATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.OPERATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.OPERATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OPERATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.OPERATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.OPERATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.OPERATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.OPERATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.OPERATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.OPERATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.OPERATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.OPERATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OPERATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.OPERATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.OPERATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.OPERATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OPERATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OPERATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.OPERATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OPERATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.OPERATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.OPERATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.OPERATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.OPERATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.OPERATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OPERATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.OPERATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.OPERATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.OPERATION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.OPERATION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.OPERATION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.OPERATION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.OPERATION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.OPERATION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.OPERATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.OPERATION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.OPERATION___SEPARATOR:
+			return separator();
+		case UMLPackage.OPERATION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.OPERATION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.OPERATION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.OPERATION___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.OPERATION___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.OPERATION___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.OPERATION___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.OPERATION___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.OPERATION___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.OPERATION___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.OPERATION___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.OPERATION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.OPERATION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.OPERATION___VALIDATE_ABSTRACT_NO_METHOD__DIAGNOSTICCHAIN_MAP:
+			return validateAbstractNoMethod((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION___CREATE_RETURN_RESULT__STRING_TYPE:
+			return createReturnResult((String) arguments.get(0), (Type) arguments.get(1));
+		case UMLPackage.OPERATION___INPUT_PARAMETERS:
+			return inputParameters();
+		case UMLPackage.OPERATION___OUTPUT_PARAMETERS:
+			return outputParameters();
+		case UMLPackage.OPERATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.OPERATION___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.OPERATION___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.OPERATION___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.OPERATION___VALIDATE_AT_MOST_ONE_RETURN__DIAGNOSTICCHAIN_MAP:
+			return validateAtMostOneReturn((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION___VALIDATE_ONLY_BODY_FOR_QUERY__DIAGNOSTICCHAIN_MAP:
+			return validateOnlyBodyForQuery((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION___GET_RETURN_RESULT:
+			return getReturnResult();
+		case UMLPackage.OPERATION___SET_IS_ORDERED__BOOLEAN:
+			setIsOrdered((Boolean) arguments.get(0));
+			return null;
+		case UMLPackage.OPERATION___SET_IS_UNIQUE__BOOLEAN:
+			setIsUnique((Boolean) arguments.get(0));
+			return null;
+		case UMLPackage.OPERATION___SET_LOWER__INT:
+			setLower((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.OPERATION___SET_TYPE__TYPE:
+			setType((Type) arguments.get(0));
+			return null;
+		case UMLPackage.OPERATION___SET_UPPER__INT:
+			setUpper((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.OPERATION___IS_ORDERED:
+			return isOrdered();
+		case UMLPackage.OPERATION___IS_UNIQUE:
+			return isUnique();
+		case UMLPackage.OPERATION___GET_LOWER:
+			return getLower();
+		case UMLPackage.OPERATION___RETURN_RESULT:
+			return returnResult();
+		case UMLPackage.OPERATION___GET_TYPE:
+			return getType();
+		case UMLPackage.OPERATION___GET_UPPER:
+			return getUpper();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -2236,7 +1995,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER);
+				|| eIsSet(UMLPackage.OPERATION__OWNING_TEMPLATE_PARAMETER);
 	}
 
 	/**
@@ -2247,14 +2006,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.OPERATION__OWNED_COMMENT,
-		UMLPackage.OPERATION__NAME_EXPRESSION,
-		UMLPackage.OPERATION__ELEMENT_IMPORT,
-		UMLPackage.OPERATION__PACKAGE_IMPORT,
-		UMLPackage.OPERATION__OWNED_MEMBER,
-		UMLPackage.OPERATION__TEMPLATE_BINDING,
-		UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.OPERATION__OWNED_COMMENT, UMLPackage.OPERATION__NAME_EXPRESSION, UMLPackage.OPERATION__ELEMENT_IMPORT, UMLPackage.OPERATION__PACKAGE_IMPORT, UMLPackage.OPERATION__OWNED_MEMBER,
+			UMLPackage.OPERATION__TEMPLATE_BINDING, UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2264,8 +2017,8 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.OPERATION__TEMPLATE_BINDING)
-			|| eIsSet(UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE);
+				|| eIsSet(UMLPackage.OPERATION__TEMPLATE_BINDING)
+				|| eIsSet(UMLPackage.OPERATION__OWNED_TEMPLATE_SIGNATURE);
 	}
 
 	/**
@@ -2276,9 +2029,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -2289,9 +2040,9 @@
 	@Override
 	public boolean isSetRedefinitionContexts() {
 		return super.isSetRedefinitionContexts()
-			|| eIsSet(UMLPackage.OPERATION__CLASS)
-			|| eIsSet(UMLPackage.OPERATION__DATATYPE)
-			|| eIsSet(UMLPackage.OPERATION__INTERFACE);
+				|| eIsSet(UMLPackage.OPERATION__CLASS)
+				|| eIsSet(UMLPackage.OPERATION__DATATYPE)
+				|| eIsSet(UMLPackage.OPERATION__INTERFACE);
 	}
 
 	/**
@@ -2323,9 +2074,10 @@
 	 */
 	@Override
 	public boolean isSetNamespace() {
-		return super.isSetNamespace() || eIsSet(UMLPackage.OPERATION__CLASS)
-			|| eIsSet(UMLPackage.OPERATION__DATATYPE)
-			|| eIsSet(UMLPackage.OPERATION__INTERFACE);
+		return super.isSetNamespace()
+				|| eIsSet(UMLPackage.OPERATION__CLASS)
+				|| eIsSet(UMLPackage.OPERATION__DATATYPE)
+				|| eIsSet(UMLPackage.OPERATION__INTERFACE);
 	}
 
 	/**
@@ -2336,9 +2088,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] FEATURING_CLASSIFIER_ESUBSETS = new int[]{
-		UMLPackage.OPERATION__CLASS, UMLPackage.OPERATION__DATATYPE,
-		UMLPackage.OPERATION__INTERFACE};
+	protected static final int[] FEATURING_CLASSIFIER_ESUBSETS = new int[] { UMLPackage.OPERATION__CLASS, UMLPackage.OPERATION__DATATYPE, UMLPackage.OPERATION__INTERFACE };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getRedefinitionContexts() <em>Redefinition Context</em>}' reference list.
@@ -2348,9 +2098,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[]{
-		UMLPackage.OPERATION__CLASS, UMLPackage.OPERATION__DATATYPE,
-		UMLPackage.OPERATION__INTERFACE};
+	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[] { UMLPackage.OPERATION__CLASS, UMLPackage.OPERATION__DATATYPE, UMLPackage.OPERATION__INTERFACE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2360,9 +2108,9 @@
 	@Override
 	public boolean isSetFeaturingClassifiers() {
 		return super.isSetFeaturingClassifiers()
-			|| eIsSet(UMLPackage.OPERATION__CLASS)
-			|| eIsSet(UMLPackage.OPERATION__DATATYPE)
-			|| eIsSet(UMLPackage.OPERATION__INTERFACE);
+				|| eIsSet(UMLPackage.OPERATION__CLASS)
+				|| eIsSet(UMLPackage.OPERATION__DATATYPE)
+				|| eIsSet(UMLPackage.OPERATION__INTERFACE);
 	}
 
 	/**
@@ -2373,8 +2121,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.OPERATION__REDEFINED_OPERATION};
+	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[] { UMLPackage.OPERATION__REDEFINED_OPERATION };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedRules() <em>Owned Rule</em>}' containment reference list.
@@ -2384,10 +2131,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_RULE_ESUBSETS = new int[]{
-		UMLPackage.OPERATION__BODY_CONDITION,
-		UMLPackage.OPERATION__POSTCONDITION,
-		UMLPackage.OPERATION__PRECONDITION};
+	protected static final int[] OWNED_RULE_ESUBSETS = new int[] { UMLPackage.OPERATION__BODY_CONDITION, UMLPackage.OPERATION__POSTCONDITION, UMLPackage.OPERATION__PRECONDITION };
 
 	/**
 	 * The array of superset feature identifiers for the '{@link #getPostconditions() <em>Postcondition</em>}' reference list.
@@ -2397,8 +2141,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] POSTCONDITION_ESUPERSETS = new int[]{
-		UMLPackage.OPERATION__OWNED_RULE};
+	protected static final int[] POSTCONDITION_ESUPERSETS = new int[] { UMLPackage.OPERATION__OWNED_RULE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2438,18 +2181,14 @@
 	 */
 	public Constraint getPostcondition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		postconditionLoop : for (Constraint postcondition : getPostconditions()) {
+		postconditionLoop: for (Constraint postcondition : getPostconditions()) {
 			if (eClass != null && !eClass.isInstance(postcondition))
 				continue postconditionLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(postcondition.getName())
-				: name.equals(postcondition.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(postcondition.getName()) : name.equals(postcondition.getName())))
 				continue postconditionLoop;
 			return postcondition;
 		}
-		return createOnDemand && eClass != null
-			? createPostcondition(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createPostcondition(name, eClass) : null;
 	}
 
 	/**
@@ -2460,8 +2199,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] PRECONDITION_ESUPERSETS = new int[]{
-		UMLPackage.OPERATION__OWNED_RULE};
+	protected static final int[] PRECONDITION_ESUPERSETS = new int[] { UMLPackage.OPERATION__OWNED_RULE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2501,18 +2239,14 @@
 	 */
 	public Constraint getPrecondition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		preconditionLoop : for (Constraint precondition : getPreconditions()) {
+		preconditionLoop: for (Constraint precondition : getPreconditions()) {
 			if (eClass != null && !eClass.isInstance(precondition))
 				continue preconditionLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(precondition.getName())
-				: name.equals(precondition.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(precondition.getName()) : name.equals(precondition.getName())))
 				continue preconditionLoop;
 			return precondition;
 		}
-		return createOnDemand && eClass != null
-			? createPrecondition(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createPrecondition(name, eClass) : null;
 	}
 
 	/**
@@ -2523,7 +2257,7 @@
 	@Override
 	public boolean isSetRedefinedElements() {
 		return super.isSetRedefinedElements()
-			|| eIsSet(UMLPackage.OPERATION__REDEFINED_OPERATION);
+				|| eIsSet(UMLPackage.OPERATION__REDEFINED_OPERATION);
 	}
 
 } //OperationImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OperationTemplateParameterImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OperationTemplateParameterImpl.java
index 5376966..7c40b2f 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OperationTemplateParameterImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OperationTemplateParameterImpl.java
@@ -1,31 +1,40 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 212765, 418466, 451350, 485756
+ *   Eike Stepper - 540786
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Map;
+
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 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;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Operation;
 import org.eclipse.uml2.uml.OperationTemplateParameter;
@@ -33,6 +42,7 @@
 import org.eclipse.uml2.uml.Stereotype;
 import org.eclipse.uml2.uml.TemplateSignature;
 import org.eclipse.uml2.uml.UMLPackage;
+
 import org.eclipse.uml2.uml.internal.operations.OperationTemplateParameterOperations;
 
 /**
@@ -78,11 +88,7 @@
 	 */
 	@Override
 	public ParameterableElement getParameteredElement() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, true,
-			true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, true, true);
 	}
 
 	/**
@@ -92,11 +98,7 @@
 	 */
 	@Override
 	public ParameterableElement basicGetParameteredElement() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, false,
-			true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, false, true);
 	}
 
 	/**
@@ -107,13 +109,10 @@
 	public NotificationChain basicSetParameteredElementGen(
 			ParameterableElement newParameteredElement,
 			NotificationChain msgs) {
-		if (newParameteredElement != null
-			&& !(newParameteredElement instanceof Operation)) {
-			throw new IllegalArgumentException(
-				"newParameteredElement must be an instance of Operation"); //$NON-NLS-1$
+		if (newParameteredElement != null && !(newParameteredElement instanceof Operation)) {
+			throw new IllegalArgumentException("newParameteredElement must be an instance of Operation"); //$NON-NLS-1$
 		}
-		msgs = eDynamicInverseAdd((InternalEObject) newParameteredElement,
-			UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newParameteredElement, UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, msgs);
 		return msgs;
 	}
 
@@ -129,7 +128,7 @@
 
 			ParameterableElement ownedParameteredElement = basicGetOwnedParameteredElement();
 			if (ownedParameteredElement != null
-				&& ownedParameteredElement != newParameteredElement) {
+					&& ownedParameteredElement != newParameteredElement) {
 
 				setOwnedParameteredElement(null);
 			}
@@ -146,16 +145,10 @@
 	@Override
 	public void setParameteredElement(
 			ParameterableElement newParameteredElement) {
-		if (newParameteredElement != null
-			&& !(newParameteredElement instanceof Operation)) {
-			throw new IllegalArgumentException(
-				"newParameteredElement must be an instance of Operation"); //$NON-NLS-1$
+		if (newParameteredElement != null && !(newParameteredElement instanceof Operation)) {
+			throw new IllegalArgumentException("newParameteredElement must be an instance of Operation"); //$NON-NLS-1$
 		}
-		eDynamicSet(
-			UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-			newParameteredElement);
+		eDynamicSet(UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, newParameteredElement);
 	}
 
 	/**
@@ -174,8 +167,7 @@
 	 */
 	public boolean validateMatchDefaultSignature(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return OperationTemplateParameterOperations
-			.validateMatchDefaultSignature(this, diagnostics, context);
+		return OperationTemplateParameterOperations.validateMatchDefaultSignature(this, diagnostics, context);
 	}
 
 	/**
@@ -188,31 +180,22 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				ParameterableElement parameteredElement = basicGetParameteredElement();
-				if (parameteredElement != null)
-					msgs = ((InternalEObject) parameteredElement)
-						.eInverseRemove(this,
-							UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-							ParameterableElement.class, msgs);
-				return basicSetParameteredElement(
-					(ParameterableElement) otherEnd, msgs);
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__SIGNATURE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetSignature((TemplateSignature) otherEnd, msgs);
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				ParameterableElement ownedParameteredElement = basicGetOwnedParameteredElement();
-				if (ownedParameteredElement != null)
-					msgs = ((InternalEObject) ownedParameteredElement)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-							null, msgs);
-				return basicSetOwnedParameteredElement(
-					(ParameterableElement) otherEnd, msgs);
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			ParameterableElement parameteredElement = basicGetParameteredElement();
+			if (parameteredElement != null)
+				msgs = ((InternalEObject) parameteredElement).eInverseRemove(this, UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, ParameterableElement.class, msgs);
+			return basicSetParameteredElement((ParameterableElement) otherEnd, msgs);
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__SIGNATURE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			ParameterableElement ownedParameteredElement = basicGetOwnedParameteredElement();
+			if (ownedParameteredElement != null)
+				msgs = ((InternalEObject) ownedParameteredElement).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, null, msgs);
+			return basicSetOwnedParameteredElement((ParameterableElement) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -226,20 +209,18 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				return basicSetOwnedDefault(null, msgs);
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				return basicSetParameteredElement(null, msgs);
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__SIGNATURE :
-				return basicSetSignature(null, msgs);
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				return basicSetOwnedParameteredElement(null, msgs);
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			return basicSetOwnedDefault(null, msgs);
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			return basicSetParameteredElement(null, msgs);
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__SIGNATURE:
+			return basicSetSignature(null, msgs);
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			return basicSetOwnedParameteredElement(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -252,36 +233,36 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__DEFAULT :
-				if (resolve)
-					return getDefault();
-				return basicGetDefault();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				if (resolve)
-					return getOwnedDefault();
-				return basicGetOwnedDefault();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				if (resolve)
-					return getParameteredElement();
-				return basicGetParameteredElement();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__SIGNATURE :
-				if (resolve)
-					return getSignature();
-				return basicGetSignature();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				if (resolve)
-					return getOwnedParameteredElement();
-				return basicGetOwnedParameteredElement();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__DEFAULT:
+			if (resolve)
+				return getDefault();
+			return basicGetDefault();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			if (resolve)
+				return getOwnedDefault();
+			return basicGetOwnedDefault();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			if (resolve)
+				return getParameteredElement();
+			return basicGetParameteredElement();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__SIGNATURE:
+			if (resolve)
+				return getSignature();
+			return basicGetSignature();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			if (resolve)
+				return getOwnedParameteredElement();
+			return basicGetOwnedParameteredElement();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -295,31 +276,29 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__DEFAULT :
-				setDefault((ParameterableElement) newValue);
-				return;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				setOwnedDefault((ParameterableElement) newValue);
-				return;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				setParameteredElement((ParameterableElement) newValue);
-				return;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__SIGNATURE :
-				setSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				setOwnedParameteredElement((ParameterableElement) newValue);
-				return;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__DEFAULT:
+			setDefault((ParameterableElement) newValue);
+			return;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			setOwnedDefault((ParameterableElement) newValue);
+			return;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			setParameteredElement((ParameterableElement) newValue);
+			return;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__SIGNATURE:
+			setSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			setOwnedParameteredElement((ParameterableElement) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -332,27 +311,27 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__DEFAULT :
-				setDefault((ParameterableElement) null);
-				return;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				setOwnedDefault((ParameterableElement) null);
-				return;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				setParameteredElement((ParameterableElement) null);
-				return;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__SIGNATURE :
-				setSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				setOwnedParameteredElement((ParameterableElement) null);
-				return;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__DEFAULT:
+			setDefault((ParameterableElement) null);
+			return;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			setOwnedDefault((ParameterableElement) null);
+			return;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			setParameteredElement((ParameterableElement) null);
+			return;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__SIGNATURE:
+			setSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			setOwnedParameteredElement((ParameterableElement) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -365,24 +344,24 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNER :
-				return isSetOwner();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__DEFAULT :
-				return basicGetDefault() != null;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				return basicGetOwnedDefault() != null;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				return isSetParameteredElement();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__SIGNATURE :
-				return basicGetSignature() != null;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				return basicGetOwnedParameteredElement() != null;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNER:
+			return isSetOwner();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__DEFAULT:
+			return basicGetDefault() != null;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			return basicGetOwnedDefault() != null;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			return isSetParameteredElement();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__SIGNATURE:
+			return basicGetSignature() != null;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			return basicGetOwnedParameteredElement() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -397,98 +376,86 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_MODEL :
-				return getModel();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___VALIDATE_MUST_BE_COMPATIBLE__DIAGNOSTICCHAIN_MAP :
-				return validateMustBeCompatible(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER___VALIDATE_MATCH_DEFAULT_SIGNATURE__DIAGNOSTICCHAIN_MAP :
-				return validateMatchDefaultSignature(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_MODEL:
+			return getModel();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___VALIDATE_MUST_BE_COMPATIBLE__DIAGNOSTICCHAIN_MAP:
+			return validateMustBeCompatible((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER___VALIDATE_MATCH_DEFAULT_SIGNATURE__DIAGNOSTICCHAIN_MAP:
+			return validateMatchDefaultSignature((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OutputPinImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OutputPinImpl.java
index 3832bbc..b6ccc0e 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OutputPinImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/OutputPinImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -68,8 +68,7 @@
 	 */
 	public boolean validateIncomingEdgesStructuredOnly(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return OutputPinOperations.validateIncomingEdgesStructuredOnly(this,
-			diagnostics, context);
+		return OutputPinOperations.validateIncomingEdgesStructuredOnly(this, diagnostics, context);
 	}
 
 	/**
@@ -82,212 +81,168 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.OUTPUT_PIN___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.OUTPUT_PIN___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.OUTPUT_PIN___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.OUTPUT_PIN___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.OUTPUT_PIN___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___GET_MODEL :
-				return getModel();
-			case UMLPackage.OUTPUT_PIN___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.OUTPUT_PIN___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.OUTPUT_PIN___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.OUTPUT_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.OUTPUT_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.OUTPUT_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.OUTPUT_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.OUTPUT_PIN___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.OUTPUT_PIN___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.OUTPUT_PIN___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___GET_LABEL :
-				return getLabel();
-			case UMLPackage.OUTPUT_PIN___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.OUTPUT_PIN___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.OUTPUT_PIN___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.OUTPUT_PIN___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.OUTPUT_PIN___SEPARATOR :
-				return separator();
-			case UMLPackage.OUTPUT_PIN___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.OUTPUT_PIN___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.OUTPUT_PIN___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP :
-				return validateInputOutputParameter(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateSelectionBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateObjectFlowEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-				return validateUpperGeLower((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-				return validateLowerGe0((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationNoSideEffects(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationConstant(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-				return validateLowerIsInteger(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-				return validateUpperIsUnlimitedNatural(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___SET_LOWER__INT :
-				setLower((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.OUTPUT_PIN___SET_UPPER__INT :
-				setUpper((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.OUTPUT_PIN___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-				return compatibleWith((MultiplicityElement) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-				return includesMultiplicity(
-					(MultiplicityElement) arguments.get(0));
-			case UMLPackage.OUTPUT_PIN___IS__INT_INT :
-				return is((Integer) arguments.get(0),
-					(Integer) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___IS_MULTIVALUED :
-				return isMultivalued();
-			case UMLPackage.OUTPUT_PIN___GET_LOWER :
-				return getLower();
-			case UMLPackage.OUTPUT_PIN___LOWER_BOUND :
-				return lowerBound();
-			case UMLPackage.OUTPUT_PIN___GET_UPPER :
-				return getUpper();
-			case UMLPackage.OUTPUT_PIN___UPPER_BOUND :
-				return upperBound();
-			case UMLPackage.OUTPUT_PIN___VALIDATE_CONTROL_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateControlPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_NOT_UNIQUE__DIAGNOSTICCHAIN_MAP :
-				return validateNotUnique((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.OUTPUT_PIN___VALIDATE_INCOMING_EDGES_STRUCTURED_ONLY__DIAGNOSTICCHAIN_MAP :
-				return validateIncomingEdgesStructuredOnly(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.OUTPUT_PIN___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.OUTPUT_PIN___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.OUTPUT_PIN___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.OUTPUT_PIN___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___GET_MODEL:
+			return getModel();
+		case UMLPackage.OUTPUT_PIN___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.OUTPUT_PIN___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.OUTPUT_PIN___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.OUTPUT_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.OUTPUT_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.OUTPUT_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.OUTPUT_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.OUTPUT_PIN___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.OUTPUT_PIN___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.OUTPUT_PIN___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___GET_LABEL:
+			return getLabel();
+		case UMLPackage.OUTPUT_PIN___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.OUTPUT_PIN___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.OUTPUT_PIN___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.OUTPUT_PIN___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.OUTPUT_PIN___SEPARATOR:
+			return separator();
+		case UMLPackage.OUTPUT_PIN___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.OUTPUT_PIN___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.OUTPUT_PIN___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP:
+			return validateInputOutputParameter((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateSelectionBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateObjectFlowEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+			return validateUpperGeLower((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+			return validateLowerGe0((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationConstant((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+			return validateLowerIsInteger((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+			return validateUpperIsUnlimitedNatural((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___SET_LOWER__INT:
+			setLower((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.OUTPUT_PIN___SET_UPPER__INT:
+			setUpper((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.OUTPUT_PIN___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+			return compatibleWith((MultiplicityElement) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+			return includesMultiplicity((MultiplicityElement) arguments.get(0));
+		case UMLPackage.OUTPUT_PIN___IS__INT_INT:
+			return is((Integer) arguments.get(0), (Integer) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___IS_MULTIVALUED:
+			return isMultivalued();
+		case UMLPackage.OUTPUT_PIN___GET_LOWER:
+			return getLower();
+		case UMLPackage.OUTPUT_PIN___LOWER_BOUND:
+			return lowerBound();
+		case UMLPackage.OUTPUT_PIN___GET_UPPER:
+			return getUpper();
+		case UMLPackage.OUTPUT_PIN___UPPER_BOUND:
+			return upperBound();
+		case UMLPackage.OUTPUT_PIN___VALIDATE_CONTROL_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateControlPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_NOT_UNIQUE__DIAGNOSTICCHAIN_MAP:
+			return validateNotUnique((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.OUTPUT_PIN___VALIDATE_INCOMING_EDGES_STRUCTURED_ONLY__DIAGNOSTICCHAIN_MAP:
+			return validateIncomingEdgesStructuredOnly((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageImpl.java
index 49a7dea..e35bfe5 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 454400, 451350, 485756, 489209
  *
  */
@@ -34,6 +34,8 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
@@ -140,9 +142,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -151,10 +151,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PACKAGE__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true,
-			true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PACKAGE__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -163,10 +160,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PACKAGE__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PACKAGE__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -176,13 +170,11 @@
 	 */
 	public NotificationChain basicSetTemplateParameter(
 			TemplateParameter newTemplateParameter, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter,
-			UMLPackage.PACKAGE__TEMPLATE_PARAMETER, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter, UMLPackage.PACKAGE__TEMPLATE_PARAMETER, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			TemplateParameter owningTemplateParameter = basicGetOwningTemplateParameter();
-			if (owningTemplateParameter != null
-				&& owningTemplateParameter != newTemplateParameter) {
+			if (owningTemplateParameter != null && owningTemplateParameter != newTemplateParameter) {
 				setOwningTemplateParameter(null);
 			}
 		}
@@ -195,15 +187,11 @@
 	 * @generated
 	 */
 	public void setTemplateParameter(TemplateParameter newTemplateParameter) {
-		eDynamicSet(
-			UMLPackage.PACKAGE__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			newTemplateParameter);
+		eDynamicSet(UMLPackage.PACKAGE__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, newTemplateParameter);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			TemplateParameter owningTemplateParameter = basicGetOwningTemplateParameter();
-			if (owningTemplateParameter != null
-				&& owningTemplateParameter != newTemplateParameter) {
+			if (owningTemplateParameter != null && owningTemplateParameter != newTemplateParameter) {
 				setOwningTemplateParameter(null);
 			}
 		}
@@ -215,11 +203,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			true, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -228,11 +212,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -243,8 +223,7 @@
 	public NotificationChain basicSetOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter,
-			UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter, UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -263,11 +242,7 @@
 	 */
 	public void setOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter) {
-		eDynamicSet(
-			UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			newOwningTemplateParameter);
+		eDynamicSet(UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, newOwningTemplateParameter);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -285,9 +260,7 @@
 	 */
 	@Override
 	public VisibilityKind getVisibility() {
-		return (VisibilityKind) eDynamicGet(
-			UMLPackage.PACKAGE__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, true, true);
+		return (VisibilityKind) eDynamicGet(UMLPackage.PACKAGE__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, true, true);
 	}
 
 	/**
@@ -297,8 +270,7 @@
 	 */
 	@Override
 	public void setVisibility(VisibilityKind newVisibility) {
-		eDynamicSet(UMLPackage.PACKAGE__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, newVisibility);
+		eDynamicSet(UMLPackage.PACKAGE__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, newVisibility);
 	}
 
 	/**
@@ -308,8 +280,7 @@
 	 */
 	@Override
 	public void unsetVisibility() {
-		eDynamicUnset(UMLPackage.PACKAGE__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
+		eDynamicUnset(UMLPackage.PACKAGE__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
 	}
 
 	/**
@@ -319,9 +290,7 @@
 	 */
 	@Override
 	public boolean isSetVisibility() {
-		return eDynamicIsSet(
-			UMLPackage.PACKAGE__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
+		return eDynamicIsSet(UMLPackage.PACKAGE__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
 	}
 
 	/**
@@ -335,19 +304,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.PACKAGE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PACKAGE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.PACKAGE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PACKAGE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -357,10 +320,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<TemplateBinding> getTemplateBindings() {
-		return (EList<TemplateBinding>) eDynamicGet(
-			UMLPackage.PACKAGE__TEMPLATE_BINDING - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING, true,
-			true);
+		return (EList<TemplateBinding>) eDynamicGet(UMLPackage.PACKAGE__TEMPLATE_BINDING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING, true, true);
 	}
 
 	/**
@@ -369,8 +329,7 @@
 	 * @generated
 	 */
 	public TemplateBinding createTemplateBinding(TemplateSignature signature) {
-		TemplateBinding newTemplateBinding = (TemplateBinding) create(
-			UMLPackage.Literals.TEMPLATE_BINDING);
+		TemplateBinding newTemplateBinding = (TemplateBinding) create(UMLPackage.Literals.TEMPLATE_BINDING);
 		getTemplateBindings().add(newTemplateBinding);
 		if (signature != null)
 			newTemplateBinding.setSignature(signature);
@@ -393,15 +352,12 @@
 	 */
 	public TemplateBinding getTemplateBinding(TemplateSignature signature,
 			boolean createOnDemand) {
-		templateBindingLoop : for (TemplateBinding templateBinding : getTemplateBindings()) {
-			if (signature != null
-				&& !signature.equals(templateBinding.getSignature()))
+		templateBindingLoop: for (TemplateBinding templateBinding : getTemplateBindings()) {
+			if (signature != null && !signature.equals(templateBinding.getSignature()))
 				continue templateBindingLoop;
 			return templateBinding;
 		}
-		return createOnDemand
-			? createTemplateBinding(signature)
-			: null;
+		return createOnDemand ? createTemplateBinding(signature) : null;
 	}
 
 	/**
@@ -412,9 +368,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -437,11 +391,7 @@
 	 * @generated
 	 */
 	public TemplateSignature getOwnedTemplateSignature() {
-		return (TemplateSignature) eDynamicGet(
-			UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-			true, true);
+		return (TemplateSignature) eDynamicGet(UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, true, true);
 	}
 
 	/**
@@ -450,11 +400,7 @@
 	 * @generated
 	 */
 	public TemplateSignature basicGetOwnedTemplateSignature() {
-		return (TemplateSignature) eDynamicGet(
-			UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-			false, true);
+		return (TemplateSignature) eDynamicGet(UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, false, true);
 	}
 
 	/**
@@ -465,8 +411,7 @@
 	public NotificationChain basicSetOwnedTemplateSignature(
 			TemplateSignature newOwnedTemplateSignature,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newOwnedTemplateSignature,
-			UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newOwnedTemplateSignature, UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE, msgs);
 		return msgs;
 	}
 
@@ -477,11 +422,7 @@
 	 */
 	public void setOwnedTemplateSignature(
 			TemplateSignature newOwnedTemplateSignature) {
-		eDynamicSet(
-			UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-			newOwnedTemplateSignature);
+		eDynamicSet(UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, newOwnedTemplateSignature);
 	}
 
 	/**
@@ -490,8 +431,7 @@
 	 * @generated
 	 */
 	public TemplateSignature createOwnedTemplateSignature(EClass eClass) {
-		TemplateSignature newOwnedTemplateSignature = (TemplateSignature) create(
-			eClass);
+		TemplateSignature newOwnedTemplateSignature = (TemplateSignature) create(eClass);
 		setOwnedTemplateSignature(newOwnedTemplateSignature);
 		return newOwnedTemplateSignature;
 	}
@@ -502,8 +442,7 @@
 	 * @generated
 	 */
 	public TemplateSignature createOwnedTemplateSignature() {
-		return createOwnedTemplateSignature(
-			UMLPackage.Literals.TEMPLATE_SIGNATURE);
+		return createOwnedTemplateSignature(UMLPackage.Literals.TEMPLATE_SIGNATURE);
 	}
 
 	/**
@@ -517,20 +456,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.PACKAGE__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.PACKAGE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.PACKAGE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.PACKAGE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -540,9 +472,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<PackageableElement> getPackagedElements() {
-		return (EList<PackageableElement>) eDynamicGet(
-			UMLPackage.PACKAGE__PACKAGED_ELEMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE__PACKAGED_ELEMENT, true, true);
+		return (EList<PackageableElement>) eDynamicGet(UMLPackage.PACKAGE__PACKAGED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE__PACKAGED_ELEMENT, true, true);
 	}
 
 	/**
@@ -552,8 +482,7 @@
 	 */
 	public PackageableElement createPackagedElement(String name,
 			EClass eClass) {
-		PackageableElement newPackagedElement = (PackageableElement) create(
-			eClass);
+		PackageableElement newPackagedElement = (PackageableElement) create(eClass);
 		getPackagedElements().add(newPackagedElement);
 		if (name != null)
 			newPackagedElement.setName(name);
@@ -576,18 +505,14 @@
 	 */
 	public PackageableElement getPackagedElement(String name,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		packagedElementLoop : for (PackageableElement packagedElement : getPackagedElements()) {
+		packagedElementLoop: for (PackageableElement packagedElement : getPackagedElements()) {
 			if (eClass != null && !eClass.isInstance(packagedElement))
 				continue packagedElementLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(packagedElement.getName())
-				: name.equals(packagedElement.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(packagedElement.getName()) : name.equals(packagedElement.getName())))
 				continue packagedElementLoop;
 			return packagedElement;
 		}
-		return createOnDemand && eClass != null
-			? createPackagedElement(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createPackagedElement(name, eClass) : null;
 	}
 
 	/**
@@ -596,9 +521,7 @@
 	 * @generated
 	 */
 	public String getURI() {
-		return (String) eDynamicGet(
-			UMLPackage.PACKAGE__URI - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE__URI, true, true);
+		return (String) eDynamicGet(UMLPackage.PACKAGE__URI - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE__URI, true, true);
 	}
 
 	/**
@@ -607,8 +530,7 @@
 	 * @generated
 	 */
 	public void setURI(String newURI) {
-		eDynamicSet(UMLPackage.PACKAGE__URI - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE__URI, newURI);
+		eDynamicSet(UMLPackage.PACKAGE__URI - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE__URI, newURI);
 	}
 
 	/**
@@ -618,9 +540,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<PackageMerge> getPackageMerges() {
-		return (EList<PackageMerge>) eDynamicGet(
-			UMLPackage.PACKAGE__PACKAGE_MERGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE__PACKAGE_MERGE, true, true);
+		return (EList<PackageMerge>) eDynamicGet(UMLPackage.PACKAGE__PACKAGE_MERGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE__PACKAGE_MERGE, true, true);
 	}
 
 	/**
@@ -630,8 +550,7 @@
 	 */
 	public PackageMerge createPackageMerge(
 			org.eclipse.uml2.uml.Package mergedPackage) {
-		PackageMerge newPackageMerge = (PackageMerge) create(
-			UMLPackage.Literals.PACKAGE_MERGE);
+		PackageMerge newPackageMerge = (PackageMerge) create(UMLPackage.Literals.PACKAGE_MERGE);
 		getPackageMerges().add(newPackageMerge);
 		if (mergedPackage != null)
 			newPackageMerge.setMergedPackage(mergedPackage);
@@ -656,15 +575,12 @@
 	public PackageMerge getPackageMerge(
 			org.eclipse.uml2.uml.Package mergedPackage,
 			boolean createOnDemand) {
-		packageMergeLoop : for (PackageMerge packageMerge : getPackageMerges()) {
-			if (mergedPackage != null
-				&& !mergedPackage.equals(packageMerge.getMergedPackage()))
+		packageMergeLoop: for (PackageMerge packageMerge : getPackageMerges()) {
+			if (mergedPackage != null && !mergedPackage.equals(packageMerge.getMergedPackage()))
 				continue packageMergeLoop;
 			return packageMerge;
 		}
-		return createOnDemand
-			? createPackageMerge(mergedPackage)
-			: null;
+		return createOnDemand ? createPackageMerge(mergedPackage) : null;
 	}
 
 	/**
@@ -678,18 +594,18 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<Type> ownedTypes = (EList<Type>) cache.get(eResource, this,
-				UMLPackage.Literals.PACKAGE__OWNED_TYPE);
+					UMLPackage.Literals.PACKAGE__OWNED_TYPE);
 			if (ownedTypes == null) {
 				cache.put(eResource, this,
-					UMLPackage.Literals.PACKAGE__OWNED_TYPE,
-					ownedTypes = new DerivedSubsetEObjectEList<Type>(Type.class,
-						this, UMLPackage.PACKAGE__OWNED_TYPE,
-						OWNED_TYPE_ESUPERSETS));
+						UMLPackage.Literals.PACKAGE__OWNED_TYPE,
+						ownedTypes = new DerivedSubsetEObjectEList<Type>(Type.class,
+								this, UMLPackage.PACKAGE__OWNED_TYPE,
+								OWNED_TYPE_ESUPERSETS));
 			}
 			return ownedTypes;
 		}
 		return new DerivedSubsetEObjectEList<Type>(Type.class, this,
-			UMLPackage.PACKAGE__OWNED_TYPE, OWNED_TYPE_ESUPERSETS);
+				UMLPackage.PACKAGE__OWNED_TYPE, OWNED_TYPE_ESUPERSETS);
 	}
 
 	/**
@@ -703,21 +619,21 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<org.eclipse.uml2.uml.Package> nestedPackages = (EList<org.eclipse.uml2.uml.Package>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.PACKAGE__NESTED_PACKAGE);
+					.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>(
-						org.eclipse.uml2.uml.Package.class, this,
-						UMLPackage.PACKAGE__NESTED_PACKAGE,
-						NESTED_PACKAGE_ESUPERSETS));
+						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<org.eclipse.uml2.uml.Package>(
-			org.eclipse.uml2.uml.Package.class, this,
-			UMLPackage.PACKAGE__NESTED_PACKAGE, NESTED_PACKAGE_ESUPERSETS);
+				org.eclipse.uml2.uml.Package.class, this,
+				UMLPackage.PACKAGE__NESTED_PACKAGE, NESTED_PACKAGE_ESUPERSETS);
 	}
 
 	/**
@@ -727,10 +643,7 @@
 	 */
 	public org.eclipse.uml2.uml.Package getNestingPackage() {
 		org.eclipse.uml2.uml.Package nestingPackage = basicGetNestingPackage();
-		return nestingPackage != null && nestingPackage.eIsProxy()
-			? (org.eclipse.uml2.uml.Package) eResolveProxy(
-				(InternalEObject) nestingPackage)
-			: nestingPackage;
+		return nestingPackage != null && nestingPackage.eIsProxy() ? (org.eclipse.uml2.uml.Package) eResolveProxy((InternalEObject) nestingPackage) : nestingPackage;
 	}
 
 	/**
@@ -741,8 +654,8 @@
 	public org.eclipse.uml2.uml.Package basicGetNestingPackage() {
 		InternalEObject eInternalContainer = eInternalContainer();
 		return eInternalContainer instanceof org.eclipse.uml2.uml.Package
-			? (org.eclipse.uml2.uml.Package) eInternalContainer
-			: null;
+				? (org.eclipse.uml2.uml.Package) eInternalContainer
+				: null;
 	}
 
 	/**
@@ -755,23 +668,23 @@
 		if (newNestingPackage != eInternalContainer()) {
 			if (EcoreUtil.isAncestor(this, newNestingPackage))
 				throw new IllegalArgumentException(
-					"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
+						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
 			NotificationChain msgs = null;
 			if (eInternalContainer() != null)
 				msgs = eBasicRemoveFromContainer(msgs);
 			if (newNestingPackage != null)
 				msgs = ((InternalEList<org.eclipse.uml2.uml.Package>) newNestingPackage
-					.getNestedPackages()).basicAdd(this, msgs);
+						.getNestedPackages()).basicAdd(this, msgs);
 			msgs = eBasicSetContainer((InternalEObject) newNestingPackage,
-				InternalEObject.EOPPOSITE_FEATURE_BASE
-					- UMLPackage.PACKAGE__PACKAGED_ELEMENT,
-				msgs);
+					InternalEObject.EOPPOSITE_FEATURE_BASE
+							- UMLPackage.PACKAGE__PACKAGED_ELEMENT,
+					msgs);
 			if (msgs != null)
 				msgs.dispatch();
 		} else if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET,
-				UMLPackage.PACKAGE__NESTING_PACKAGE, newNestingPackage,
-				newNestingPackage));
+					UMLPackage.PACKAGE__NESTING_PACKAGE, newNestingPackage,
+					newNestingPackage));
 	}
 
 	/**
@@ -785,19 +698,19 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<Stereotype> ownedStereotypes = (EList<Stereotype>) cache.get(
-				eResource, this, UMLPackage.Literals.PACKAGE__OWNED_STEREOTYPE);
+					eResource, this, UMLPackage.Literals.PACKAGE__OWNED_STEREOTYPE);
 			if (ownedStereotypes == null) {
 				cache.put(eResource, this,
-					UMLPackage.Literals.PACKAGE__OWNED_STEREOTYPE,
-					ownedStereotypes = new DerivedSubsetEObjectEList<Stereotype>(
-						Stereotype.class, this,
-						UMLPackage.PACKAGE__OWNED_STEREOTYPE,
-						OWNED_STEREOTYPE_ESUPERSETS));
+						UMLPackage.Literals.PACKAGE__OWNED_STEREOTYPE,
+						ownedStereotypes = new DerivedSubsetEObjectEList<Stereotype>(
+								Stereotype.class, this,
+								UMLPackage.PACKAGE__OWNED_STEREOTYPE,
+								OWNED_STEREOTYPE_ESUPERSETS));
 			}
 			return ownedStereotypes;
 		}
 		return new DerivedSubsetEObjectEList<Stereotype>(Stereotype.class, this,
-			UMLPackage.PACKAGE__OWNED_STEREOTYPE, OWNED_STEREOTYPE_ESUPERSETS);
+				UMLPackage.PACKAGE__OWNED_STEREOTYPE, OWNED_STEREOTYPE_ESUPERSETS);
 	}
 
 	/**
@@ -807,9 +720,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ProfileApplication> getProfileApplications() {
-		return (EList<ProfileApplication>) eDynamicGet(
-			UMLPackage.PACKAGE__PROFILE_APPLICATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE__PROFILE_APPLICATION, true, true);
+		return (EList<ProfileApplication>) eDynamicGet(UMLPackage.PACKAGE__PROFILE_APPLICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE__PROFILE_APPLICATION, true, true);
 	}
 
 	/**
@@ -818,8 +729,7 @@
 	 * @generated
 	 */
 	public ProfileApplication createProfileApplication() {
-		ProfileApplication newProfileApplication = (ProfileApplication) create(
-			UMLPackage.Literals.PROFILE_APPLICATION);
+		ProfileApplication newProfileApplication = (ProfileApplication) create(UMLPackage.Literals.PROFILE_APPLICATION);
 		getProfileApplications().add(newProfileApplication);
 		return newProfileApplication;
 	}
@@ -849,8 +759,7 @@
 	 */
 	public boolean validateNamespaceNeedsVisibility(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PackageableElementOperations
-			.validateNamespaceNeedsVisibility(this, diagnostics, context);
+		return PackageableElementOperations.validateNamespaceNeedsVisibility(this, diagnostics, context);
 	}
 
 	/**
@@ -862,14 +771,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<ParameterableElement> result = (EList<ParameterableElement>) cache
-				.get(this,
-					UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS);
+			EList<ParameterableElement> result = (EList<ParameterableElement>) cache.get(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS,
-					result = TemplateableElementOperations
-						.parameterableElements(this));
+				cache.put(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS, result = TemplateableElementOperations.parameterableElements(this));
 			}
 			return result;
 		}
@@ -892,8 +796,7 @@
 	 */
 	public boolean validateElementsPublicOrPrivate(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PackageOperations.validateElementsPublicOrPrivate(this,
-			diagnostics, context);
+		return PackageOperations.validateElementsPublicOrPrivate(this, diagnostics, context);
 	}
 
 	/**
@@ -978,12 +881,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Stereotype> result = (EList<Stereotype>) cache.get(this,
-				UMLPackage.Literals.PACKAGE___ALL_APPLICABLE_STEREOTYPES);
+			EList<Stereotype> result = (EList<Stereotype>) cache.get(this, UMLPackage.Literals.PACKAGE___ALL_APPLICABLE_STEREOTYPES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.PACKAGE___ALL_APPLICABLE_STEREOTYPES,
-					result = PackageOperations.allApplicableStereotypes(this));
+				cache.put(this, UMLPackage.Literals.PACKAGE___ALL_APPLICABLE_STEREOTYPES, result = PackageOperations.allApplicableStereotypes(this));
 			}
 			return result;
 		}
@@ -1008,12 +908,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Profile> result = (EList<Profile>) cache.get(this,
-				UMLPackage.Literals.PACKAGE___GET_APPLIED_PROFILES);
+			EList<Profile> result = (EList<Profile>) cache.get(this, UMLPackage.Literals.PACKAGE___GET_APPLIED_PROFILES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.PACKAGE___GET_APPLIED_PROFILES,
-					result = PackageOperations.getAppliedProfiles(this));
+				cache.put(this, UMLPackage.Literals.PACKAGE___GET_APPLIED_PROFILES, result = PackageOperations.getAppliedProfiles(this));
 			}
 			return result;
 		}
@@ -1035,8 +932,7 @@
 	 * @generated
 	 */
 	public Profile getAppliedProfile(String qualifiedName, boolean recurse) {
-		return PackageOperations.getAppliedProfile(this, qualifiedName,
-			recurse);
+		return PackageOperations.getAppliedProfile(this, qualifiedName, recurse);
 	}
 
 	/**
@@ -1048,13 +944,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<ProfileApplication> result = (EList<ProfileApplication>) cache
-				.get(this,
-					UMLPackage.Literals.PACKAGE___GET_ALL_PROFILE_APPLICATIONS);
+			EList<ProfileApplication> result = (EList<ProfileApplication>) cache.get(this, UMLPackage.Literals.PACKAGE___GET_ALL_PROFILE_APPLICATIONS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.PACKAGE___GET_ALL_PROFILE_APPLICATIONS,
-					result = PackageOperations.getAllProfileApplications(this));
+				cache.put(this, UMLPackage.Literals.PACKAGE___GET_ALL_PROFILE_APPLICATIONS, result = PackageOperations.getAllProfileApplications(this));
 			}
 			return result;
 		}
@@ -1107,12 +999,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Profile> result = (EList<Profile>) cache.get(this,
-				UMLPackage.Literals.PACKAGE___GET_ALL_APPLIED_PROFILES);
+			EList<Profile> result = (EList<Profile>) cache.get(this, UMLPackage.Literals.PACKAGE___GET_ALL_APPLIED_PROFILES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.PACKAGE___GET_ALL_APPLIED_PROFILES,
-					result = PackageOperations.getAllAppliedProfiles(this));
+				cache.put(this, UMLPackage.Literals.PACKAGE___GET_ALL_APPLIED_PROFILES, result = PackageOperations.getAllAppliedProfiles(this));
 			}
 			return result;
 		}
@@ -1128,11 +1017,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<PackageableElement> result = (EList<PackageableElement>) cache
-				.get(this, UMLPackage.Literals.PACKAGE___VISIBLE_MEMBERS);
+			EList<PackageableElement> result = (EList<PackageableElement>) cache.get(this, UMLPackage.Literals.PACKAGE___VISIBLE_MEMBERS);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.PACKAGE___VISIBLE_MEMBERS,
-					result = PackageOperations.visibleMembers(this));
+				cache.put(this, UMLPackage.Literals.PACKAGE___VISIBLE_MEMBERS, result = PackageOperations.visibleMembers(this));
 			}
 			return result;
 		}
@@ -1168,51 +1055,34 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PACKAGE__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PACKAGE__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PACKAGE__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.PACKAGE__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.PACKAGE__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this,
-							EOPPOSITE_FEATURE_BASE
-								- UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.PACKAGE__PACKAGE_MERGE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageMerges())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PACKAGE__PROFILE_APPLICATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getProfileApplications())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.PACKAGE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PACKAGE__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PACKAGE__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PACKAGE__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.PACKAGE__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.PACKAGE__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.PACKAGE__PACKAGE_MERGE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageMerges()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PACKAGE__PROFILE_APPLICATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getProfileApplications()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -1226,41 +1096,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PACKAGE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PACKAGE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.PACKAGE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PACKAGE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PACKAGE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.PACKAGE__PACKAGE_MERGE :
-				return ((InternalEList<?>) getPackageMerges())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PACKAGE__PACKAGED_ELEMENT :
-				return ((InternalEList<?>) getPackagedElements())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PACKAGE__PROFILE_APPLICATION :
-				return ((InternalEList<?>) getProfileApplications())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.PACKAGE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PACKAGE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PACKAGE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.PACKAGE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PACKAGE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PACKAGE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.PACKAGE__PACKAGE_MERGE:
+			return ((InternalEList<?>) getPackageMerges()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PACKAGE__PACKAGED_ELEMENT:
+			return ((InternalEList<?>) getPackagedElements()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PACKAGE__PROFILE_APPLICATION:
+			return ((InternalEList<?>) getProfileApplications()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -1274,10 +1135,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
+		case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -1290,76 +1149,76 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PACKAGE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PACKAGE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PACKAGE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PACKAGE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.PACKAGE__NAME :
-				return getName();
-			case UMLPackage.PACKAGE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.PACKAGE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.PACKAGE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PACKAGE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.PACKAGE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.PACKAGE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.PACKAGE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.PACKAGE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.PACKAGE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.PACKAGE__MEMBER :
-				return getMembers();
-			case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.PACKAGE__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.PACKAGE__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.PACKAGE__URI :
-				return getURI();
-			case UMLPackage.PACKAGE__NESTED_PACKAGE :
-				return getNestedPackages();
-			case UMLPackage.PACKAGE__NESTING_PACKAGE :
-				if (resolve)
-					return getNestingPackage();
-				return basicGetNestingPackage();
-			case UMLPackage.PACKAGE__OWNED_STEREOTYPE :
-				return getOwnedStereotypes();
-			case UMLPackage.PACKAGE__OWNED_TYPE :
-				return getOwnedTypes();
-			case UMLPackage.PACKAGE__PACKAGE_MERGE :
-				return getPackageMerges();
-			case UMLPackage.PACKAGE__PACKAGED_ELEMENT :
-				return getPackagedElements();
-			case UMLPackage.PACKAGE__PROFILE_APPLICATION :
-				return getProfileApplications();
+		case UMLPackage.PACKAGE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PACKAGE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PACKAGE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PACKAGE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PACKAGE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.PACKAGE__NAME:
+			return getName();
+		case UMLPackage.PACKAGE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.PACKAGE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.PACKAGE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PACKAGE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.PACKAGE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.PACKAGE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.PACKAGE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.PACKAGE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.PACKAGE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.PACKAGE__MEMBER:
+			return getMembers();
+		case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.PACKAGE__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.PACKAGE__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.PACKAGE__URI:
+			return getURI();
+		case UMLPackage.PACKAGE__NESTED_PACKAGE:
+			return getNestedPackages();
+		case UMLPackage.PACKAGE__NESTING_PACKAGE:
+			if (resolve)
+				return getNestingPackage();
+			return basicGetNestingPackage();
+		case UMLPackage.PACKAGE__OWNED_STEREOTYPE:
+			return getOwnedStereotypes();
+		case UMLPackage.PACKAGE__OWNED_TYPE:
+			return getOwnedTypes();
+		case UMLPackage.PACKAGE__PACKAGE_MERGE:
+			return getPackageMerges();
+		case UMLPackage.PACKAGE__PACKAGED_ELEMENT:
+			return getPackagedElements();
+		case UMLPackage.PACKAGE__PROFILE_APPLICATION:
+			return getProfileApplications();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -1373,84 +1232,74 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PACKAGE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PACKAGE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.PACKAGE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.PACKAGE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.PACKAGE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.PACKAGE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.PACKAGE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.PACKAGE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.PACKAGE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.PACKAGE__URI :
-				setURI((String) newValue);
-				return;
-			case UMLPackage.PACKAGE__NESTED_PACKAGE :
-				getNestedPackages().clear();
-				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__OWNED_TYPE :
-				getOwnedTypes().clear();
-				getOwnedTypes().addAll((Collection<? extends Type>) newValue);
-				return;
-			case UMLPackage.PACKAGE__PACKAGE_MERGE :
-				getPackageMerges().clear();
-				getPackageMerges()
-					.addAll((Collection<? extends PackageMerge>) newValue);
-				return;
-			case UMLPackage.PACKAGE__PACKAGED_ELEMENT :
-				getPackagedElements().clear();
-				getPackagedElements().addAll(
-					(Collection<? extends PackageableElement>) newValue);
-				return;
-			case UMLPackage.PACKAGE__PROFILE_APPLICATION :
-				getProfileApplications().clear();
-				getProfileApplications().addAll(
-					(Collection<? extends ProfileApplication>) newValue);
-				return;
+		case UMLPackage.PACKAGE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PACKAGE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PACKAGE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.PACKAGE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.PACKAGE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.PACKAGE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.PACKAGE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.PACKAGE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.PACKAGE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.PACKAGE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.PACKAGE__URI:
+			setURI((String) newValue);
+			return;
+		case UMLPackage.PACKAGE__NESTED_PACKAGE:
+			getNestedPackages().clear();
+			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__OWNED_TYPE:
+			getOwnedTypes().clear();
+			getOwnedTypes().addAll((Collection<? extends Type>) newValue);
+			return;
+		case UMLPackage.PACKAGE__PACKAGE_MERGE:
+			getPackageMerges().clear();
+			getPackageMerges().addAll((Collection<? extends PackageMerge>) newValue);
+			return;
+		case UMLPackage.PACKAGE__PACKAGED_ELEMENT:
+			getPackagedElements().clear();
+			getPackagedElements().addAll((Collection<? extends PackageableElement>) newValue);
+			return;
+		case UMLPackage.PACKAGE__PROFILE_APPLICATION:
+			getProfileApplications().clear();
+			getProfileApplications().addAll((Collection<? extends ProfileApplication>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -1463,63 +1312,63 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PACKAGE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PACKAGE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.PACKAGE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.PACKAGE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.PACKAGE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.PACKAGE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.PACKAGE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.PACKAGE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.PACKAGE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.PACKAGE__URI :
-				setURI(URI_EDEFAULT);
-				return;
-			case UMLPackage.PACKAGE__NESTED_PACKAGE :
-				getNestedPackages().clear();
-				return;
-			case UMLPackage.PACKAGE__NESTING_PACKAGE :
-				setNestingPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.PACKAGE__OWNED_TYPE :
-				getOwnedTypes().clear();
-				return;
-			case UMLPackage.PACKAGE__PACKAGE_MERGE :
-				getPackageMerges().clear();
-				return;
-			case UMLPackage.PACKAGE__PACKAGED_ELEMENT :
-				getPackagedElements().clear();
-				return;
-			case UMLPackage.PACKAGE__PROFILE_APPLICATION :
-				getProfileApplications().clear();
-				return;
+		case UMLPackage.PACKAGE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PACKAGE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PACKAGE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.PACKAGE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.PACKAGE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.PACKAGE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.PACKAGE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.PACKAGE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.PACKAGE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.PACKAGE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.PACKAGE__URI:
+			setURI(URI_EDEFAULT);
+			return;
+		case UMLPackage.PACKAGE__NESTED_PACKAGE:
+			getNestedPackages().clear();
+			return;
+		case UMLPackage.PACKAGE__NESTING_PACKAGE:
+			setNestingPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.PACKAGE__OWNED_TYPE:
+			getOwnedTypes().clear();
+			return;
+		case UMLPackage.PACKAGE__PACKAGE_MERGE:
+			getPackageMerges().clear();
+			return;
+		case UMLPackage.PACKAGE__PACKAGED_ELEMENT:
+			getPackagedElements().clear();
+			return;
+		case UMLPackage.PACKAGE__PROFILE_APPLICATION:
+			getProfileApplications().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1532,66 +1381,62 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PACKAGE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PACKAGE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PACKAGE__OWNER :
-				return isSetOwner();
-			case UMLPackage.PACKAGE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.PACKAGE__NAME :
-				return isSetName();
-			case UMLPackage.PACKAGE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.PACKAGE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.PACKAGE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.PACKAGE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.PACKAGE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.PACKAGE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.PACKAGE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.PACKAGE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.PACKAGE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.PACKAGE__MEMBER :
-				return isSetMembers();
-			case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.PACKAGE__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.PACKAGE__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE :
-				return basicGetOwnedTemplateSignature() != null;
-			case UMLPackage.PACKAGE__URI :
-				return URI_EDEFAULT == null
-					? getURI() != null
-					: !URI_EDEFAULT.equals(getURI());
-			case UMLPackage.PACKAGE__NESTED_PACKAGE :
-				return !getNestedPackages().isEmpty();
-			case UMLPackage.PACKAGE__NESTING_PACKAGE :
-				return basicGetNestingPackage() != null;
-			case UMLPackage.PACKAGE__OWNED_STEREOTYPE :
-				return !getOwnedStereotypes().isEmpty();
-			case UMLPackage.PACKAGE__OWNED_TYPE :
-				return !getOwnedTypes().isEmpty();
-			case UMLPackage.PACKAGE__PACKAGE_MERGE :
-				return !getPackageMerges().isEmpty();
-			case UMLPackage.PACKAGE__PACKAGED_ELEMENT :
-				return !getPackagedElements().isEmpty();
-			case UMLPackage.PACKAGE__PROFILE_APPLICATION :
-				return !getProfileApplications().isEmpty();
+		case UMLPackage.PACKAGE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PACKAGE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PACKAGE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PACKAGE__OWNER:
+			return isSetOwner();
+		case UMLPackage.PACKAGE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.PACKAGE__NAME:
+			return isSetName();
+		case UMLPackage.PACKAGE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.PACKAGE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.PACKAGE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.PACKAGE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.PACKAGE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.PACKAGE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.PACKAGE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.PACKAGE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.PACKAGE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.PACKAGE__MEMBER:
+			return isSetMembers();
+		case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.PACKAGE__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.PACKAGE__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE:
+			return basicGetOwnedTemplateSignature() != null;
+		case UMLPackage.PACKAGE__URI:
+			return URI_EDEFAULT == null ? getURI() != null : !URI_EDEFAULT.equals(getURI());
+		case UMLPackage.PACKAGE__NESTED_PACKAGE:
+			return !getNestedPackages().isEmpty();
+		case UMLPackage.PACKAGE__NESTING_PACKAGE:
+			return basicGetNestingPackage() != null;
+		case UMLPackage.PACKAGE__OWNED_STEREOTYPE:
+			return !getOwnedStereotypes().isEmpty();
+		case UMLPackage.PACKAGE__OWNED_TYPE:
+			return !getOwnedTypes().isEmpty();
+		case UMLPackage.PACKAGE__PACKAGE_MERGE:
+			return !getPackageMerges().isEmpty();
+		case UMLPackage.PACKAGE__PACKAGED_ELEMENT:
+			return !getPackagedElements().isEmpty();
+		case UMLPackage.PACKAGE__PROFILE_APPLICATION:
+			return !getProfileApplications().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1606,28 +1451,28 @@
 			Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER :
-					return UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
-				case UMLPackage.PACKAGE__TEMPLATE_PARAMETER :
-					return UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER:
+				return UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
+			case UMLPackage.PACKAGE__TEMPLATE_PARAMETER:
+				return UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == PackageableElement.class) {
 			switch (derivedFeatureID) {
-				default :
-					return -1;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == TemplateableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.PACKAGE__TEMPLATE_BINDING :
-					return UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING;
-				case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE :
-					return UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE;
-				default :
-					return -1;
+			case UMLPackage.PACKAGE__TEMPLATE_BINDING:
+				return UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING;
+			case UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE:
+				return UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -1643,28 +1488,28 @@
 			Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-					return UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER;
-				case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER :
-					return UMLPackage.PACKAGE__TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+				return UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER;
+			case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER:
+				return UMLPackage.PACKAGE__TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == PackageableElement.class) {
 			switch (baseFeatureID) {
-				default :
-					return -1;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == TemplateableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING :
-					return UMLPackage.PACKAGE__TEMPLATE_BINDING;
-				case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE :
-					return UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE;
-				default :
-					return -1;
+			case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING:
+				return UMLPackage.PACKAGE__TEMPLATE_BINDING;
+			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE:
+				return UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1679,30 +1524,30 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-					return UMLPackage.PACKAGE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT;
-				case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER :
-					return UMLPackage.PACKAGE___IS_TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+				return UMLPackage.PACKAGE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT;
+			case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER:
+				return UMLPackage.PACKAGE___IS_TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == PackageableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.PACKAGE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP;
-				default :
-					return -1;
+			case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.PACKAGE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == TemplateableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.TEMPLATEABLE_ELEMENT___IS_TEMPLATE :
-					return UMLPackage.PACKAGE___IS_TEMPLATE;
-				case UMLPackage.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS :
-					return UMLPackage.PACKAGE___PARAMETERABLE_ELEMENTS;
-				default :
-					return -1;
+			case UMLPackage.TEMPLATEABLE_ELEMENT___IS_TEMPLATE:
+				return UMLPackage.PACKAGE___IS_TEMPLATE;
+			case UMLPackage.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS:
+				return UMLPackage.PACKAGE___PARAMETERABLE_ELEMENTS;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -1718,232 +1563,196 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.PACKAGE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.PACKAGE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.PACKAGE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.PACKAGE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.PACKAGE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.PACKAGE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.PACKAGE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.PACKAGE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.PACKAGE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.PACKAGE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PACKAGE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGE___GET_MODEL :
-				return getModel();
-			case UMLPackage.PACKAGE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.PACKAGE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.PACKAGE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.PACKAGE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.PACKAGE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.PACKAGE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.PACKAGE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PACKAGE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.PACKAGE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.PACKAGE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PACKAGE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PACKAGE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.PACKAGE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PACKAGE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.PACKAGE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.PACKAGE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.PACKAGE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.PACKAGE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.PACKAGE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.PACKAGE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.PACKAGE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.PACKAGE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.PACKAGE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.PACKAGE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.PACKAGE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.PACKAGE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PACKAGE___SEPARATOR :
-				return separator();
-			case UMLPackage.PACKAGE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.PACKAGE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.PACKAGE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.PACKAGE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.PACKAGE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.PACKAGE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.PACKAGE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.PACKAGE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.PACKAGE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.PACKAGE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.PACKAGE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.PACKAGE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.PACKAGE___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.PACKAGE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGE___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.PACKAGE___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.PACKAGE___VALIDATE_ELEMENTS_PUBLIC_OR_PRIVATE__DIAGNOSTICCHAIN_MAP :
-				return validateElementsPublicOrPrivate(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGE___APPLY_PROFILE__PROFILE :
-				return applyProfile((Profile) arguments.get(0));
-			case UMLPackage.PACKAGE___CREATE_OWNED_CLASS__STRING_BOOLEAN :
-				return createOwnedClass((String) arguments.get(0),
-					(Boolean) arguments.get(1));
-			case UMLPackage.PACKAGE___CREATE_OWNED_ENUMERATION__STRING :
-				return createOwnedEnumeration((String) arguments.get(0));
-			case UMLPackage.PACKAGE___CREATE_OWNED_INTERFACE__STRING :
-				return createOwnedInterface((String) arguments.get(0));
-			case UMLPackage.PACKAGE___CREATE_OWNED_PRIMITIVE_TYPE__STRING :
-				return createOwnedPrimitiveType((String) arguments.get(0));
-			case UMLPackage.PACKAGE___CREATE_OWNED_STEREOTYPE__STRING_BOOLEAN :
-				return createOwnedStereotype((String) arguments.get(0),
-					(Boolean) arguments.get(1));
-			case UMLPackage.PACKAGE___GET_ALL_APPLIED_PROFILES :
-				return getAllAppliedProfiles();
-			case UMLPackage.PACKAGE___GET_ALL_PROFILE_APPLICATIONS :
-				return getAllProfileApplications();
-			case UMLPackage.PACKAGE___GET_APPLIED_PROFILE__STRING :
-				return getAppliedProfile((String) arguments.get(0));
-			case UMLPackage.PACKAGE___GET_APPLIED_PROFILE__STRING_BOOLEAN :
-				return getAppliedProfile((String) arguments.get(0),
-					(Boolean) arguments.get(1));
-			case UMLPackage.PACKAGE___GET_APPLIED_PROFILES :
-				return getAppliedProfiles();
-			case UMLPackage.PACKAGE___GET_PROFILE_APPLICATION__PROFILE :
-				return getProfileApplication((Profile) arguments.get(0));
-			case UMLPackage.PACKAGE___GET_PROFILE_APPLICATION__PROFILE_BOOLEAN :
-				return getProfileApplication((Profile) arguments.get(0),
-					(Boolean) arguments.get(1));
-			case UMLPackage.PACKAGE___IS_MODEL_LIBRARY :
-				return isModelLibrary();
-			case UMLPackage.PACKAGE___IS_PROFILE_APPLIED__PROFILE :
-				return isProfileApplied((Profile) arguments.get(0));
-			case UMLPackage.PACKAGE___UNAPPLY_PROFILE__PROFILE :
-				return unapplyProfile((Profile) arguments.get(0));
-			case UMLPackage.PACKAGE___APPLY_PROFILES__ELIST :
-				return applyProfiles((EList<Profile>) arguments.get(0));
-			case UMLPackage.PACKAGE___ALL_APPLICABLE_STEREOTYPES :
-				return allApplicableStereotypes();
-			case UMLPackage.PACKAGE___CONTAINING_PROFILE :
-				return containingProfile();
-			case UMLPackage.PACKAGE___MAKES_VISIBLE__NAMEDELEMENT :
-				return makesVisible((NamedElement) arguments.get(0));
-			case UMLPackage.PACKAGE___GET_NESTED_PACKAGES :
-				return getNestedPackages();
-			case UMLPackage.PACKAGE___GET_OWNED_STEREOTYPES :
-				return getOwnedStereotypes();
-			case UMLPackage.PACKAGE___GET_OWNED_TYPES :
-				return getOwnedTypes();
-			case UMLPackage.PACKAGE___VISIBLE_MEMBERS :
-				return visibleMembers();
+		case UMLPackage.PACKAGE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.PACKAGE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.PACKAGE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.PACKAGE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.PACKAGE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.PACKAGE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.PACKAGE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.PACKAGE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.PACKAGE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.PACKAGE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PACKAGE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGE___GET_MODEL:
+			return getModel();
+		case UMLPackage.PACKAGE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.PACKAGE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.PACKAGE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.PACKAGE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.PACKAGE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.PACKAGE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.PACKAGE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PACKAGE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.PACKAGE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.PACKAGE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PACKAGE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PACKAGE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.PACKAGE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PACKAGE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.PACKAGE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.PACKAGE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.PACKAGE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.PACKAGE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.PACKAGE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.PACKAGE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.PACKAGE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.PACKAGE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.PACKAGE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.PACKAGE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.PACKAGE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.PACKAGE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PACKAGE___SEPARATOR:
+			return separator();
+		case UMLPackage.PACKAGE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.PACKAGE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.PACKAGE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.PACKAGE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.PACKAGE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.PACKAGE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.PACKAGE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.PACKAGE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.PACKAGE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.PACKAGE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.PACKAGE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.PACKAGE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.PACKAGE___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.PACKAGE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGE___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.PACKAGE___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.PACKAGE___VALIDATE_ELEMENTS_PUBLIC_OR_PRIVATE__DIAGNOSTICCHAIN_MAP:
+			return validateElementsPublicOrPrivate((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGE___APPLY_PROFILE__PROFILE:
+			return applyProfile((Profile) arguments.get(0));
+		case UMLPackage.PACKAGE___CREATE_OWNED_CLASS__STRING_BOOLEAN:
+			return createOwnedClass((String) arguments.get(0), (Boolean) arguments.get(1));
+		case UMLPackage.PACKAGE___CREATE_OWNED_ENUMERATION__STRING:
+			return createOwnedEnumeration((String) arguments.get(0));
+		case UMLPackage.PACKAGE___CREATE_OWNED_INTERFACE__STRING:
+			return createOwnedInterface((String) arguments.get(0));
+		case UMLPackage.PACKAGE___CREATE_OWNED_PRIMITIVE_TYPE__STRING:
+			return createOwnedPrimitiveType((String) arguments.get(0));
+		case UMLPackage.PACKAGE___CREATE_OWNED_STEREOTYPE__STRING_BOOLEAN:
+			return createOwnedStereotype((String) arguments.get(0), (Boolean) arguments.get(1));
+		case UMLPackage.PACKAGE___GET_ALL_APPLIED_PROFILES:
+			return getAllAppliedProfiles();
+		case UMLPackage.PACKAGE___GET_ALL_PROFILE_APPLICATIONS:
+			return getAllProfileApplications();
+		case UMLPackage.PACKAGE___GET_APPLIED_PROFILE__STRING:
+			return getAppliedProfile((String) arguments.get(0));
+		case UMLPackage.PACKAGE___GET_APPLIED_PROFILE__STRING_BOOLEAN:
+			return getAppliedProfile((String) arguments.get(0), (Boolean) arguments.get(1));
+		case UMLPackage.PACKAGE___GET_APPLIED_PROFILES:
+			return getAppliedProfiles();
+		case UMLPackage.PACKAGE___GET_PROFILE_APPLICATION__PROFILE:
+			return getProfileApplication((Profile) arguments.get(0));
+		case UMLPackage.PACKAGE___GET_PROFILE_APPLICATION__PROFILE_BOOLEAN:
+			return getProfileApplication((Profile) arguments.get(0), (Boolean) arguments.get(1));
+		case UMLPackage.PACKAGE___IS_MODEL_LIBRARY:
+			return isModelLibrary();
+		case UMLPackage.PACKAGE___IS_PROFILE_APPLIED__PROFILE:
+			return isProfileApplied((Profile) arguments.get(0));
+		case UMLPackage.PACKAGE___UNAPPLY_PROFILE__PROFILE:
+			return unapplyProfile((Profile) arguments.get(0));
+		case UMLPackage.PACKAGE___APPLY_PROFILES__ELIST:
+			return applyProfiles((EList<Profile>) arguments.get(0));
+		case UMLPackage.PACKAGE___ALL_APPLICABLE_STEREOTYPES:
+			return allApplicableStereotypes();
+		case UMLPackage.PACKAGE___CONTAINING_PROFILE:
+			return containingProfile();
+		case UMLPackage.PACKAGE___MAKES_VISIBLE__NAMEDELEMENT:
+			return makesVisible((NamedElement) arguments.get(0));
+		case UMLPackage.PACKAGE___GET_NESTED_PACKAGES:
+			return getNestedPackages();
+		case UMLPackage.PACKAGE___GET_OWNED_STEREOTYPES:
+			return getOwnedStereotypes();
+		case UMLPackage.PACKAGE___GET_OWNED_TYPES:
+			return getOwnedTypes();
+		case UMLPackage.PACKAGE___VISIBLE_MEMBERS:
+			return visibleMembers();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1970,7 +1779,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER);
+				|| eIsSet(UMLPackage.PACKAGE__OWNING_TEMPLATE_PARAMETER);
 	}
 
 	/**
@@ -1981,13 +1790,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.PACKAGE__OWNED_COMMENT, UMLPackage.PACKAGE__NAME_EXPRESSION,
-		UMLPackage.PACKAGE__ELEMENT_IMPORT, UMLPackage.PACKAGE__PACKAGE_IMPORT,
-		UMLPackage.PACKAGE__OWNED_MEMBER, UMLPackage.PACKAGE__TEMPLATE_BINDING,
-		UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE,
-		UMLPackage.PACKAGE__PACKAGE_MERGE,
-		UMLPackage.PACKAGE__PROFILE_APPLICATION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.PACKAGE__OWNED_COMMENT, UMLPackage.PACKAGE__NAME_EXPRESSION, UMLPackage.PACKAGE__ELEMENT_IMPORT, UMLPackage.PACKAGE__PACKAGE_IMPORT, UMLPackage.PACKAGE__OWNED_MEMBER,
+			UMLPackage.PACKAGE__TEMPLATE_BINDING, UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE, UMLPackage.PACKAGE__PACKAGE_MERGE, UMLPackage.PACKAGE__PROFILE_APPLICATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1997,10 +1801,10 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.PACKAGE__TEMPLATE_BINDING)
-			|| eIsSet(UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE)
-			|| eIsSet(UMLPackage.PACKAGE__PACKAGE_MERGE)
-			|| eIsSet(UMLPackage.PACKAGE__PROFILE_APPLICATION);
+				|| eIsSet(UMLPackage.PACKAGE__TEMPLATE_BINDING)
+				|| eIsSet(UMLPackage.PACKAGE__OWNED_TEMPLATE_SIGNATURE)
+				|| eIsSet(UMLPackage.PACKAGE__PACKAGE_MERGE)
+				|| eIsSet(UMLPackage.PACKAGE__PROFILE_APPLICATION);
 	}
 
 	/**
@@ -2011,7 +1815,7 @@
 	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
-			|| eIsSet(UMLPackage.PACKAGE__NESTING_PACKAGE);
+				|| eIsSet(UMLPackage.PACKAGE__NESTING_PACKAGE);
 	}
 
 	/**
@@ -2022,8 +1826,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.PACKAGE__OWNED_RULE, UMLPackage.PACKAGE__PACKAGED_ELEMENT};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.PACKAGE__OWNED_RULE, UMLPackage.PACKAGE__PACKAGED_ELEMENT };
 
 	/**
 	 * The array of superset feature identifiers for the '{@link #getNestedPackages() <em>Nested Package</em>}' reference list.
@@ -2033,8 +1836,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] NESTED_PACKAGE_ESUPERSETS = new int[]{
-		UMLPackage.PACKAGE__PACKAGED_ELEMENT};
+	protected static final int[] NESTED_PACKAGE_ESUPERSETS = new int[] { UMLPackage.PACKAGE__PACKAGED_ELEMENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2043,8 +1845,7 @@
 	 */
 	public org.eclipse.uml2.uml.Package createNestedPackage(String name,
 			EClass eClass) {
-		org.eclipse.uml2.uml.Package newNestedPackage = (org.eclipse.uml2.uml.Package) create(
-			eClass);
+		org.eclipse.uml2.uml.Package newNestedPackage = (org.eclipse.uml2.uml.Package) create(eClass);
 		getNestedPackages().add(newNestedPackage);
 		if (name != null)
 			newNestedPackage.setName(name);
@@ -2076,18 +1877,14 @@
 	 */
 	public org.eclipse.uml2.uml.Package getNestedPackage(String name,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		nestedPackageLoop : for (org.eclipse.uml2.uml.Package nestedPackage : getNestedPackages()) {
+		nestedPackageLoop: for (org.eclipse.uml2.uml.Package nestedPackage : getNestedPackages()) {
 			if (eClass != null && !eClass.isInstance(nestedPackage))
 				continue nestedPackageLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(nestedPackage.getName())
-				: name.equals(nestedPackage.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(nestedPackage.getName()) : name.equals(nestedPackage.getName())))
 				continue nestedPackageLoop;
 			return nestedPackage;
 		}
-		return createOnDemand && eClass != null
-			? createNestedPackage(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createNestedPackage(name, eClass) : null;
 	}
 
 	/**
@@ -2098,8 +1895,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_STEREOTYPE_ESUPERSETS = new int[]{
-		UMLPackage.PACKAGE__PACKAGED_ELEMENT};
+	protected static final int[] OWNED_STEREOTYPE_ESUPERSETS = new int[] { UMLPackage.PACKAGE__PACKAGED_ELEMENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2116,10 +1912,8 @@
 	 * @generated
 	 */
 	public Stereotype getOwnedStereotype(String name, boolean ignoreCase) {
-		ownedStereotypeLoop : for (Stereotype ownedStereotype : getOwnedStereotypes()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedStereotype.getName())
-				: name.equals(ownedStereotype.getName())))
+		ownedStereotypeLoop: for (Stereotype ownedStereotype : getOwnedStereotypes()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedStereotype.getName()) : name.equals(ownedStereotype.getName())))
 				continue ownedStereotypeLoop;
 			return ownedStereotype;
 		}
@@ -2134,8 +1928,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_TYPE_ESUPERSETS = new int[]{
-		UMLPackage.PACKAGE__PACKAGED_ELEMENT};
+	protected static final int[] OWNED_TYPE_ESUPERSETS = new int[] { UMLPackage.PACKAGE__PACKAGED_ELEMENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2162,18 +1955,14 @@
 	 */
 	public Type getOwnedType(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		ownedTypeLoop : for (Type ownedType : getOwnedTypes()) {
+		ownedTypeLoop: for (Type ownedType : getOwnedTypes()) {
 			if (eClass != null && !eClass.isInstance(ownedType))
 				continue ownedTypeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedType.getName())
-				: name.equals(ownedType.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedType.getName()) : name.equals(ownedType.getName())))
 				continue ownedTypeLoop;
 			return ownedType;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedType(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedType(name, eClass) : null;
 	}
 
 	/**
@@ -2184,7 +1973,7 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.PACKAGE__PACKAGED_ELEMENT);
+				|| eIsSet(UMLPackage.PACKAGE__PACKAGED_ELEMENT);
 	}
 
 } //PackageImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageImportImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageImportImpl.java
index 4671775..5984b97 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageImportImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageImportImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,8 +29,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -107,19 +111,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> targets = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			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>(
-						Element.class, this, UMLPackage.PACKAGE_IMPORT__TARGET,
-						TARGET_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET, targets = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PACKAGE_IMPORT__TARGET, TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.PACKAGE_IMPORT__TARGET, TARGET_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PACKAGE_IMPORT__TARGET, TARGET_ESUBSETS);
 	}
 
 	/**
@@ -133,19 +131,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> sources = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			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>(
-						Element.class, this, UMLPackage.PACKAGE_IMPORT__SOURCE,
-						SOURCE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE, sources = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PACKAGE_IMPORT__SOURCE, SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.PACKAGE_IMPORT__SOURCE, SOURCE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PACKAGE_IMPORT__SOURCE, SOURCE_ESUBSETS);
 	}
 
 	/**
@@ -154,9 +146,7 @@
 	 * @generated
 	 */
 	public VisibilityKind getVisibility() {
-		return (VisibilityKind) eDynamicGet(
-			UMLPackage.PACKAGE_IMPORT__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE_IMPORT__VISIBILITY, true, true);
+		return (VisibilityKind) eDynamicGet(UMLPackage.PACKAGE_IMPORT__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE_IMPORT__VISIBILITY, true, true);
 	}
 
 	/**
@@ -165,9 +155,7 @@
 	 * @generated
 	 */
 	public void setVisibility(VisibilityKind newVisibility) {
-		eDynamicSet(
-			UMLPackage.PACKAGE_IMPORT__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE_IMPORT__VISIBILITY, newVisibility);
+		eDynamicSet(UMLPackage.PACKAGE_IMPORT__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE_IMPORT__VISIBILITY, newVisibility);
 	}
 
 	/**
@@ -176,9 +164,7 @@
 	 * @generated
 	 */
 	public org.eclipse.uml2.uml.Package getImportedPackage() {
-		return (org.eclipse.uml2.uml.Package) eDynamicGet(
-			UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE_IMPORT__IMPORTED_PACKAGE, true, true);
+		return (org.eclipse.uml2.uml.Package) eDynamicGet(UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE_IMPORT__IMPORTED_PACKAGE, true, true);
 	}
 
 	/**
@@ -187,9 +173,7 @@
 	 * @generated
 	 */
 	public org.eclipse.uml2.uml.Package basicGetImportedPackage() {
-		return (org.eclipse.uml2.uml.Package) eDynamicGet(
-			UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE_IMPORT__IMPORTED_PACKAGE, false, true);
+		return (org.eclipse.uml2.uml.Package) eDynamicGet(UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE_IMPORT__IMPORTED_PACKAGE, false, true);
 	}
 
 	/**
@@ -199,10 +183,7 @@
 	 */
 	public void setImportedPackage(
 			org.eclipse.uml2.uml.Package newImportedPackage) {
-		eDynamicSet(
-			UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE_IMPORT__IMPORTED_PACKAGE,
-			newImportedPackage);
+		eDynamicSet(UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE_IMPORT__IMPORTED_PACKAGE, newImportedPackage);
 	}
 
 	/**
@@ -211,11 +192,7 @@
 	 * @generated
 	 */
 	public Namespace getImportingNamespace() {
-		return (Namespace) eDynamicGet(
-			UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE_IMPORT__IMPORTING_NAMESPACE, true,
-			true);
+		return (Namespace) eDynamicGet(UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE_IMPORT__IMPORTING_NAMESPACE, true, true);
 	}
 
 	/**
@@ -224,11 +201,7 @@
 	 * @generated
 	 */
 	public Namespace basicGetImportingNamespace() {
-		return (Namespace) eDynamicGet(
-			UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE_IMPORT__IMPORTING_NAMESPACE, false,
-			true);
+		return (Namespace) eDynamicGet(UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE_IMPORT__IMPORTING_NAMESPACE, false, true);
 	}
 
 	/**
@@ -238,8 +211,7 @@
 	 */
 	public NotificationChain basicSetImportingNamespace(
 			Namespace newImportingNamespace, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newImportingNamespace,
-			UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newImportingNamespace, UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE, msgs);
 		return msgs;
 	}
 
@@ -249,11 +221,7 @@
 	 * @generated
 	 */
 	public void setImportingNamespace(Namespace newImportingNamespace) {
-		eDynamicSet(
-			UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE_IMPORT__IMPORTING_NAMESPACE,
-			newImportingNamespace);
+		eDynamicSet(UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE_IMPORT__IMPORTING_NAMESPACE, newImportingNamespace);
 	}
 
 	/**
@@ -263,8 +231,7 @@
 	 */
 	public boolean validatePublicOrPrivate(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PackageImportOperations.validatePublicOrPrivate(this,
-			diagnostics, context);
+		return PackageImportOperations.validatePublicOrPrivate(this, diagnostics, context);
 	}
 
 	/**
@@ -277,13 +244,12 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetImportingNamespace((Namespace) otherEnd, msgs);
+		case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetImportingNamespace((Namespace) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -297,14 +263,12 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PACKAGE_IMPORT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE :
-				return basicSetImportingNamespace(null, msgs);
+		case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PACKAGE_IMPORT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE:
+			return basicSetImportingNamespace(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -318,10 +282,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.NAMESPACE__PACKAGE_IMPORT, Namespace.class,
-					msgs);
+		case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.NAMESPACE__PACKAGE_IMPORT, Namespace.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -334,32 +296,32 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PACKAGE_IMPORT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PACKAGE_IMPORT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PACKAGE_IMPORT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PACKAGE_IMPORT__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.PACKAGE_IMPORT__SOURCE :
-				return getSources();
-			case UMLPackage.PACKAGE_IMPORT__TARGET :
-				return getTargets();
-			case UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE :
-				if (resolve)
-					return getImportedPackage();
-				return basicGetImportedPackage();
-			case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE :
-				if (resolve)
-					return getImportingNamespace();
-				return basicGetImportingNamespace();
-			case UMLPackage.PACKAGE_IMPORT__VISIBILITY :
-				return getVisibility();
+		case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PACKAGE_IMPORT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PACKAGE_IMPORT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PACKAGE_IMPORT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PACKAGE_IMPORT__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.PACKAGE_IMPORT__SOURCE:
+			return getSources();
+		case UMLPackage.PACKAGE_IMPORT__TARGET:
+			return getTargets();
+		case UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE:
+			if (resolve)
+				return getImportedPackage();
+			return basicGetImportedPackage();
+		case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE:
+			if (resolve)
+				return getImportingNamespace();
+			return basicGetImportingNamespace();
+		case UMLPackage.PACKAGE_IMPORT__VISIBILITY:
+			return getVisibility();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -373,25 +335,23 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PACKAGE_IMPORT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE :
-				setImportedPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE :
-				setImportingNamespace((Namespace) newValue);
-				return;
-			case UMLPackage.PACKAGE_IMPORT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
+		case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PACKAGE_IMPORT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE:
+			setImportedPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE:
+			setImportingNamespace((Namespace) newValue);
+			return;
+		case UMLPackage.PACKAGE_IMPORT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -404,21 +364,21 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PACKAGE_IMPORT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE :
-				setImportedPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE :
-				setImportingNamespace((Namespace) null);
-				return;
-			case UMLPackage.PACKAGE_IMPORT__VISIBILITY :
-				setVisibility(VISIBILITY_EDEFAULT);
-				return;
+		case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PACKAGE_IMPORT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE:
+			setImportedPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE:
+			setImportingNamespace((Namespace) null);
+			return;
+		case UMLPackage.PACKAGE_IMPORT__VISIBILITY:
+			setVisibility(VISIBILITY_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -431,26 +391,26 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PACKAGE_IMPORT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PACKAGE_IMPORT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PACKAGE_IMPORT__OWNER :
-				return isSetOwner();
-			case UMLPackage.PACKAGE_IMPORT__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.PACKAGE_IMPORT__SOURCE :
-				return isSetSources();
-			case UMLPackage.PACKAGE_IMPORT__TARGET :
-				return isSetTargets();
-			case UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE :
-				return basicGetImportedPackage() != null;
-			case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE :
-				return basicGetImportingNamespace() != null;
-			case UMLPackage.PACKAGE_IMPORT__VISIBILITY :
-				return getVisibility() != VISIBILITY_EDEFAULT;
+		case UMLPackage.PACKAGE_IMPORT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PACKAGE_IMPORT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PACKAGE_IMPORT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PACKAGE_IMPORT__OWNER:
+			return isSetOwner();
+		case UMLPackage.PACKAGE_IMPORT__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.PACKAGE_IMPORT__SOURCE:
+			return isSetSources();
+		case UMLPackage.PACKAGE_IMPORT__TARGET:
+			return isSetTargets();
+		case UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE:
+			return basicGetImportedPackage() != null;
+		case UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE:
+			return basicGetImportingNamespace() != null;
+		case UMLPackage.PACKAGE_IMPORT__VISIBILITY:
+			return getVisibility() != VISIBILITY_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -465,94 +425,84 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.PACKAGE_IMPORT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGE_IMPORT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGE_IMPORT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.PACKAGE_IMPORT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.PACKAGE_IMPORT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.PACKAGE_IMPORT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.PACKAGE_IMPORT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PACKAGE_IMPORT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___GET_MODEL :
-				return getModel();
-			case UMLPackage.PACKAGE_IMPORT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.PACKAGE_IMPORT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.PACKAGE_IMPORT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.PACKAGE_IMPORT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.PACKAGE_IMPORT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.PACKAGE_IMPORT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.PACKAGE_IMPORT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PACKAGE_IMPORT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PACKAGE_IMPORT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.PACKAGE_IMPORT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGE_IMPORT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.PACKAGE_IMPORT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.PACKAGE_IMPORT___VALIDATE_PUBLIC_OR_PRIVATE__DIAGNOSTICCHAIN_MAP :
-				return validatePublicOrPrivate(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGE_IMPORT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGE_IMPORT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGE_IMPORT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.PACKAGE_IMPORT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.PACKAGE_IMPORT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.PACKAGE_IMPORT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.PACKAGE_IMPORT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PACKAGE_IMPORT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___GET_MODEL:
+			return getModel();
+		case UMLPackage.PACKAGE_IMPORT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.PACKAGE_IMPORT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.PACKAGE_IMPORT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.PACKAGE_IMPORT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.PACKAGE_IMPORT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.PACKAGE_IMPORT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.PACKAGE_IMPORT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PACKAGE_IMPORT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PACKAGE_IMPORT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.PACKAGE_IMPORT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGE_IMPORT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.PACKAGE_IMPORT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.PACKAGE_IMPORT___VALIDATE_PUBLIC_OR_PRIVATE__DIAGNOSTICCHAIN_MAP:
+			return validatePublicOrPrivate((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -565,8 +515,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] TARGET_ESUBSETS = new int[]{
-		UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE};
+	protected static final int[] TARGET_ESUBSETS = new int[] { UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -576,7 +525,7 @@
 	@Override
 	public boolean isSetTargets() {
 		return super.isSetTargets()
-			|| eIsSet(UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE);
+				|| eIsSet(UMLPackage.PACKAGE_IMPORT__IMPORTED_PACKAGE);
 	}
 
 	/**
@@ -587,8 +536,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SOURCE_ESUBSETS = new int[]{
-		UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE};
+	protected static final int[] SOURCE_ESUBSETS = new int[] { UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -598,9 +546,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -611,7 +557,7 @@
 	@Override
 	public boolean isSetSources() {
 		return super.isSetSources()
-			|| eIsSet(UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE);
+				|| eIsSet(UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE);
 	}
 
 	/**
@@ -636,7 +582,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE);
+				|| eIsSet(UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE);
 	}
 
 } //PackageImportImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageMergeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageMergeImpl.java
index a55a6c1..5df4ca7 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageMergeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageMergeImpl.java
@@ -1,18 +1,20 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -21,8 +23,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -84,19 +89,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> targets = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			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>(
-						Element.class, this, UMLPackage.PACKAGE_MERGE__TARGET,
-						TARGET_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET, targets = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PACKAGE_MERGE__TARGET, TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.PACKAGE_MERGE__TARGET, TARGET_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PACKAGE_MERGE__TARGET, TARGET_ESUBSETS);
 	}
 
 	/**
@@ -110,19 +109,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> sources = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			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>(
-						Element.class, this, UMLPackage.PACKAGE_MERGE__SOURCE,
-						SOURCE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE, sources = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PACKAGE_MERGE__SOURCE, SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.PACKAGE_MERGE__SOURCE, SOURCE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PACKAGE_MERGE__SOURCE, SOURCE_ESUBSETS);
 	}
 
 	/**
@@ -131,9 +124,7 @@
 	 * @generated
 	 */
 	public org.eclipse.uml2.uml.Package getMergedPackage() {
-		return (org.eclipse.uml2.uml.Package) eDynamicGet(
-			UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE_MERGE__MERGED_PACKAGE, true, true);
+		return (org.eclipse.uml2.uml.Package) eDynamicGet(UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE_MERGE__MERGED_PACKAGE, true, true);
 	}
 
 	/**
@@ -142,9 +133,7 @@
 	 * @generated
 	 */
 	public org.eclipse.uml2.uml.Package basicGetMergedPackage() {
-		return (org.eclipse.uml2.uml.Package) eDynamicGet(
-			UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE_MERGE__MERGED_PACKAGE, false, true);
+		return (org.eclipse.uml2.uml.Package) eDynamicGet(UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE_MERGE__MERGED_PACKAGE, false, true);
 	}
 
 	/**
@@ -154,10 +143,7 @@
 	 */
 	public void setMergedPackage(
 			org.eclipse.uml2.uml.Package newMergedPackage) {
-		eDynamicSet(
-			UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE_MERGE__MERGED_PACKAGE,
-			newMergedPackage);
+		eDynamicSet(UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE_MERGE__MERGED_PACKAGE, newMergedPackage);
 	}
 
 	/**
@@ -166,9 +152,7 @@
 	 * @generated
 	 */
 	public org.eclipse.uml2.uml.Package getReceivingPackage() {
-		return (org.eclipse.uml2.uml.Package) eDynamicGet(
-			UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE_MERGE__RECEIVING_PACKAGE, true, true);
+		return (org.eclipse.uml2.uml.Package) eDynamicGet(UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE_MERGE__RECEIVING_PACKAGE, true, true);
 	}
 
 	/**
@@ -177,9 +161,7 @@
 	 * @generated
 	 */
 	public org.eclipse.uml2.uml.Package basicGetReceivingPackage() {
-		return (org.eclipse.uml2.uml.Package) eDynamicGet(
-			UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE_MERGE__RECEIVING_PACKAGE, false, true);
+		return (org.eclipse.uml2.uml.Package) eDynamicGet(UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE_MERGE__RECEIVING_PACKAGE, false, true);
 	}
 
 	/**
@@ -190,8 +172,7 @@
 	public NotificationChain basicSetReceivingPackage(
 			org.eclipse.uml2.uml.Package newReceivingPackage,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newReceivingPackage,
-			UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newReceivingPackage, UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE, msgs);
 		return msgs;
 	}
 
@@ -202,10 +183,7 @@
 	 */
 	public void setReceivingPackage(
 			org.eclipse.uml2.uml.Package newReceivingPackage) {
-		eDynamicSet(
-			UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PACKAGE_MERGE__RECEIVING_PACKAGE,
-			newReceivingPackage);
+		eDynamicSet(UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PACKAGE_MERGE__RECEIVING_PACKAGE, newReceivingPackage);
 	}
 
 	/**
@@ -218,14 +196,12 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE_MERGE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetReceivingPackage(
-					(org.eclipse.uml2.uml.Package) otherEnd, msgs);
+		case UMLPackage.PACKAGE_MERGE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetReceivingPackage((org.eclipse.uml2.uml.Package) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -239,14 +215,12 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE_MERGE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PACKAGE_MERGE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE :
-				return basicSetReceivingPackage(null, msgs);
+		case UMLPackage.PACKAGE_MERGE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PACKAGE_MERGE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE:
+			return basicSetReceivingPackage(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -260,10 +234,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.PACKAGE__PACKAGE_MERGE,
-					org.eclipse.uml2.uml.Package.class, msgs);
+		case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.PACKAGE__PACKAGE_MERGE, org.eclipse.uml2.uml.Package.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -276,30 +248,30 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE_MERGE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PACKAGE_MERGE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PACKAGE_MERGE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PACKAGE_MERGE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PACKAGE_MERGE__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.PACKAGE_MERGE__SOURCE :
-				return getSources();
-			case UMLPackage.PACKAGE_MERGE__TARGET :
-				return getTargets();
-			case UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE :
-				if (resolve)
-					return getMergedPackage();
-				return basicGetMergedPackage();
-			case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE :
-				if (resolve)
-					return getReceivingPackage();
-				return basicGetReceivingPackage();
+		case UMLPackage.PACKAGE_MERGE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PACKAGE_MERGE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PACKAGE_MERGE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PACKAGE_MERGE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PACKAGE_MERGE__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.PACKAGE_MERGE__SOURCE:
+			return getSources();
+		case UMLPackage.PACKAGE_MERGE__TARGET:
+			return getTargets();
+		case UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE:
+			if (resolve)
+				return getMergedPackage();
+			return basicGetMergedPackage();
+		case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE:
+			if (resolve)
+				return getReceivingPackage();
+			return basicGetReceivingPackage();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -313,22 +285,20 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE_MERGE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PACKAGE_MERGE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE :
-				setMergedPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE :
-				setReceivingPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
+		case UMLPackage.PACKAGE_MERGE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PACKAGE_MERGE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE:
+			setMergedPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE:
+			setReceivingPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -341,18 +311,18 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE_MERGE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PACKAGE_MERGE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE :
-				setMergedPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE :
-				setReceivingPackage((org.eclipse.uml2.uml.Package) null);
-				return;
+		case UMLPackage.PACKAGE_MERGE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PACKAGE_MERGE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE:
+			setMergedPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE:
+			setReceivingPackage((org.eclipse.uml2.uml.Package) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -365,24 +335,24 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PACKAGE_MERGE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PACKAGE_MERGE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PACKAGE_MERGE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PACKAGE_MERGE__OWNER :
-				return isSetOwner();
-			case UMLPackage.PACKAGE_MERGE__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.PACKAGE_MERGE__SOURCE :
-				return isSetSources();
-			case UMLPackage.PACKAGE_MERGE__TARGET :
-				return isSetTargets();
-			case UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE :
-				return basicGetMergedPackage() != null;
-			case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE :
-				return basicGetReceivingPackage() != null;
+		case UMLPackage.PACKAGE_MERGE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PACKAGE_MERGE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PACKAGE_MERGE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PACKAGE_MERGE__OWNER:
+			return isSetOwner();
+		case UMLPackage.PACKAGE_MERGE__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.PACKAGE_MERGE__SOURCE:
+			return isSetSources();
+		case UMLPackage.PACKAGE_MERGE__TARGET:
+			return isSetTargets();
+		case UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE:
+			return basicGetMergedPackage() != null;
+		case UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE:
+			return basicGetReceivingPackage() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -395,8 +365,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] TARGET_ESUBSETS = new int[]{
-		UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE};
+	protected static final int[] TARGET_ESUBSETS = new int[] { UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -406,7 +375,7 @@
 	@Override
 	public boolean isSetTargets() {
 		return super.isSetTargets()
-			|| eIsSet(UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE);
+				|| eIsSet(UMLPackage.PACKAGE_MERGE__MERGED_PACKAGE);
 	}
 
 	/**
@@ -417,8 +386,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SOURCE_ESUBSETS = new int[]{
-		UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE};
+	protected static final int[] SOURCE_ESUBSETS = new int[] { UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -428,9 +396,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -441,7 +407,7 @@
 	@Override
 	public boolean isSetSources() {
 		return super.isSetSources()
-			|| eIsSet(UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE);
+				|| eIsSet(UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE);
 	}
 
 	/**
@@ -466,7 +432,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE);
+				|| eIsSet(UMLPackage.PACKAGE_MERGE__RECEIVING_PACKAGE);
 	}
 
 } //PackageMergeImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageableElementImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageableElementImpl.java
index 22313c0..7d09201 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageableElementImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PackageableElementImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 454400, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -25,8 +26,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Comment;
@@ -91,9 +95,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -102,11 +104,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true,
-			true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -115,11 +113,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -129,13 +123,11 @@
 	 */
 	public NotificationChain basicSetTemplateParameter(
 			TemplateParameter newTemplateParameter, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter,
-			UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter, UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			TemplateParameter owningTemplateParameter = basicGetOwningTemplateParameter();
-			if (owningTemplateParameter != null
-				&& owningTemplateParameter != newTemplateParameter) {
+			if (owningTemplateParameter != null && owningTemplateParameter != newTemplateParameter) {
 				setOwningTemplateParameter(null);
 			}
 		}
@@ -148,16 +140,11 @@
 	 * @generated
 	 */
 	public void setTemplateParameter(TemplateParameter newTemplateParameter) {
-		eDynamicSet(
-			UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			newTemplateParameter);
+		eDynamicSet(UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, newTemplateParameter);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			TemplateParameter owningTemplateParameter = basicGetOwningTemplateParameter();
-			if (owningTemplateParameter != null
-				&& owningTemplateParameter != newTemplateParameter) {
+			if (owningTemplateParameter != null && owningTemplateParameter != newTemplateParameter) {
 				setOwningTemplateParameter(null);
 			}
 		}
@@ -169,11 +156,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			true, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -182,11 +165,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -197,8 +176,7 @@
 	public NotificationChain basicSetOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter,
-			UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter, UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -217,11 +195,7 @@
 	 */
 	public void setOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter) {
-		eDynamicSet(
-			UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			newOwningTemplateParameter);
+		eDynamicSet(UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, newOwningTemplateParameter);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -239,9 +213,7 @@
 	 */
 	@Override
 	public VisibilityKind getVisibility() {
-		return (VisibilityKind) eDynamicGet(
-			UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, true, true);
+		return (VisibilityKind) eDynamicGet(UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, true, true);
 	}
 
 	/**
@@ -251,9 +223,7 @@
 	 */
 	@Override
 	public void setVisibility(VisibilityKind newVisibility) {
-		eDynamicSet(
-			UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, newVisibility);
+		eDynamicSet(UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, newVisibility);
 	}
 
 	/**
@@ -263,9 +233,7 @@
 	 */
 	@Override
 	public void unsetVisibility() {
-		eDynamicUnset(
-			UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
+		eDynamicUnset(UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
 	}
 
 	/**
@@ -275,9 +243,7 @@
 	 */
 	@Override
 	public boolean isSetVisibility() {
-		return eDynamicIsSet(
-			UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
+		return eDynamicIsSet(UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY);
 	}
 
 	/**
@@ -305,8 +271,7 @@
 	 */
 	public boolean validateNamespaceNeedsVisibility(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PackageableElementOperations
-			.validateNamespaceNeedsVisibility(this, diagnostics, context);
+		return PackageableElementOperations.validateNamespaceNeedsVisibility(this, diagnostics, context);
 	}
 
 	/**
@@ -319,23 +284,17 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
+		case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -349,18 +308,16 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PACKAGEABLE_ELEMENT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PACKAGEABLE_ELEMENT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -374,10 +331,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -390,40 +345,40 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PACKAGEABLE_ELEMENT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.PACKAGEABLE_ELEMENT__NAME :
-				return getName();
-			case UMLPackage.PACKAGEABLE_ELEMENT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.PACKAGEABLE_ELEMENT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.PACKAGEABLE_ELEMENT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
+		case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PACKAGEABLE_ELEMENT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.PACKAGEABLE_ELEMENT__NAME:
+			return getName();
+		case UMLPackage.PACKAGEABLE_ELEMENT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.PACKAGEABLE_ELEMENT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.PACKAGEABLE_ELEMENT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -437,31 +392,29 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PACKAGEABLE_ELEMENT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.PACKAGEABLE_ELEMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
+		case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PACKAGEABLE_ELEMENT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.PACKAGEABLE_ELEMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -474,27 +427,27 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PACKAGEABLE_ELEMENT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.PACKAGEABLE_ELEMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
+		case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PACKAGEABLE_ELEMENT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.PACKAGEABLE_ELEMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -507,32 +460,30 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.PACKAGEABLE_ELEMENT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.PACKAGEABLE_ELEMENT__NAME :
-				return isSetName();
-			case UMLPackage.PACKAGEABLE_ELEMENT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.PACKAGEABLE_ELEMENT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.PACKAGEABLE_ELEMENT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
+		case UMLPackage.PACKAGEABLE_ELEMENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.PACKAGEABLE_ELEMENT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.PACKAGEABLE_ELEMENT__NAME:
+			return isSetName();
+		case UMLPackage.PACKAGEABLE_ELEMENT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.PACKAGEABLE_ELEMENT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.PACKAGEABLE_ELEMENT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.PACKAGEABLE_ELEMENT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -547,12 +498,12 @@
 			Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-					return UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
-				case UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER :
-					return UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+				return UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
+			case UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER:
+				return UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -568,12 +519,12 @@
 			Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-					return UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
-				case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER :
-					return UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+				return UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
+			case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER:
+				return UMLPackage.PACKAGEABLE_ELEMENT__TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -588,12 +539,12 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-					return UMLPackage.PACKAGEABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT;
-				case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER :
-					return UMLPackage.PACKAGEABLE_ELEMENT___IS_TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+				return UMLPackage.PACKAGEABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT;
+			case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER:
+				return UMLPackage.PACKAGEABLE_ELEMENT___IS_TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -609,134 +560,116 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGEABLE_ELEMENT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_MODEL :
-				return getModel();
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PACKAGEABLE_ELEMENT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PACKAGEABLE_ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.PACKAGEABLE_ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.PACKAGEABLE_ELEMENT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PACKAGEABLE_ELEMENT___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_LABEL :
-				return getLabel();
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.PACKAGEABLE_ELEMENT___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.PACKAGEABLE_ELEMENT___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.PACKAGEABLE_ELEMENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PACKAGEABLE_ELEMENT___SEPARATOR :
-				return separator();
-			case UMLPackage.PACKAGEABLE_ELEMENT___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.PACKAGEABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.PACKAGEABLE_ELEMENT___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGEABLE_ELEMENT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_MODEL:
+			return getModel();
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PACKAGEABLE_ELEMENT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PACKAGEABLE_ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.PACKAGEABLE_ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.PACKAGEABLE_ELEMENT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PACKAGEABLE_ELEMENT___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_LABEL:
+			return getLabel();
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.PACKAGEABLE_ELEMENT___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.PACKAGEABLE_ELEMENT___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.PACKAGEABLE_ELEMENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PACKAGEABLE_ELEMENT___SEPARATOR:
+			return separator();
+		case UMLPackage.PACKAGEABLE_ELEMENT___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.PACKAGEABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.PACKAGEABLE_ELEMENT___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.PACKAGEABLE_ELEMENT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -762,8 +695,8 @@
 	 */
 	@Override
 	public boolean isSetOwner() {
-		return super.isSetOwner() || eIsSet(
-			UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER);
+		return super.isSetOwner()
+				|| eIsSet(UMLPackage.PACKAGEABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER);
 	}
 
 } //PackageableElementImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ParameterImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ParameterImpl.java
index cc3e12c..a6b16b1 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ParameterImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ParameterImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -33,6 +33,7 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
@@ -213,20 +214,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.PARAMETER__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PARAMETER__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.PARAMETER__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PARAMETER__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -235,9 +229,7 @@
 	 * @generated
 	 */
 	public boolean isOrdered() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.PARAMETER__IS_ORDERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.PARAMETER__IS_ORDERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, true, true);
 	}
 
 	/**
@@ -246,8 +238,7 @@
 	 * @generated
 	 */
 	public void setIsOrdered(boolean newIsOrdered) {
-		eDynamicSet(UMLPackage.PARAMETER__IS_ORDERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, newIsOrdered);
+		eDynamicSet(UMLPackage.PARAMETER__IS_ORDERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, newIsOrdered);
 	}
 
 	/**
@@ -256,9 +247,7 @@
 	 * @generated
 	 */
 	public boolean isUnique() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.PARAMETER__IS_UNIQUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.PARAMETER__IS_UNIQUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, true, true);
 	}
 
 	/**
@@ -267,8 +256,7 @@
 	 * @generated
 	 */
 	public void setIsUnique(boolean newIsUnique) {
-		eDynamicSet(UMLPackage.PARAMETER__IS_UNIQUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, newIsUnique);
+		eDynamicSet(UMLPackage.PARAMETER__IS_UNIQUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, newIsUnique);
 	}
 
 	/**
@@ -313,9 +301,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getUpperValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.PARAMETER__UPPER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.PARAMETER__UPPER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, true, true);
 	}
 
 	/**
@@ -324,9 +310,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetUpperValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.PARAMETER__UPPER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.PARAMETER__UPPER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, false, true);
 	}
 
 	/**
@@ -336,8 +320,7 @@
 	 */
 	public NotificationChain basicSetUpperValue(
 			ValueSpecification newUpperValue, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newUpperValue,
-			UMLPackage.PARAMETER__UPPER_VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newUpperValue, UMLPackage.PARAMETER__UPPER_VALUE, msgs);
 		return msgs;
 	}
 
@@ -347,9 +330,7 @@
 	 * @generated
 	 */
 	public void setUpperValue(ValueSpecification newUpperValue) {
-		eDynamicSet(UMLPackage.PARAMETER__UPPER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE,
-			newUpperValue);
+		eDynamicSet(UMLPackage.PARAMETER__UPPER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, newUpperValue);
 	}
 
 	/**
@@ -376,9 +357,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -401,9 +380,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getLowerValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.PARAMETER__LOWER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.PARAMETER__LOWER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, true, true);
 	}
 
 	/**
@@ -412,9 +389,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetLowerValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.PARAMETER__LOWER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.PARAMETER__LOWER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, false, true);
 	}
 
 	/**
@@ -424,8 +399,7 @@
 	 */
 	public NotificationChain basicSetLowerValue(
 			ValueSpecification newLowerValue, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newLowerValue,
-			UMLPackage.PARAMETER__LOWER_VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newLowerValue, UMLPackage.PARAMETER__LOWER_VALUE, msgs);
 		return msgs;
 	}
 
@@ -435,9 +409,7 @@
 	 * @generated
 	 */
 	public void setLowerValue(ValueSpecification newLowerValue) {
-		eDynamicSet(UMLPackage.PARAMETER__LOWER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE,
-			newLowerValue);
+		eDynamicSet(UMLPackage.PARAMETER__LOWER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, newLowerValue);
 	}
 
 	/**
@@ -463,9 +435,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ParameterSet> getParameterSets() {
-		return (EList<ParameterSet>) eDynamicGet(
-			UMLPackage.PARAMETER__PARAMETER_SET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER__PARAMETER_SET, true, true);
+		return (EList<ParameterSet>) eDynamicGet(UMLPackage.PARAMETER__PARAMETER_SET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER__PARAMETER_SET, true, true);
 	}
 
 	/**
@@ -483,10 +453,8 @@
 	 * @generated
 	 */
 	public ParameterSet getParameterSet(String name, boolean ignoreCase) {
-		parameterSetLoop : for (ParameterSet parameterSet : getParameterSets()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(parameterSet.getName())
-				: name.equals(parameterSet.getName())))
+		parameterSetLoop: for (ParameterSet parameterSet : getParameterSets()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(parameterSet.getName()) : name.equals(parameterSet.getName())))
 				continue parameterSetLoop;
 			return parameterSet;
 		}
@@ -500,9 +468,7 @@
 	 */
 	public Operation getOperation() {
 		Operation operation = basicGetOperation();
-		return operation != null && operation.eIsProxy()
-			? (Operation) eResolveProxy((InternalEObject) operation)
-			: operation;
+		return operation != null && operation.eIsProxy() ? (Operation) eResolveProxy((InternalEObject) operation) : operation;
 	}
 
 	/**
@@ -513,8 +479,8 @@
 	public Operation basicGetOperation() {
 		InternalEObject eInternalContainer = eInternalContainer();
 		return eInternalContainer instanceof Operation
-			? (Operation) eInternalContainer
-			: null;
+				? (Operation) eInternalContainer
+				: null;
 	}
 
 	/**
@@ -526,22 +492,22 @@
 		if (newOperation != eInternalContainer()) {
 			if (EcoreUtil.isAncestor(this, newOperation))
 				throw new IllegalArgumentException(
-					"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
+						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
 			NotificationChain msgs = null;
 			if (eInternalContainer() != null)
 				msgs = eBasicRemoveFromContainer(msgs);
 			if (newOperation != null)
 				msgs = ((InternalEList<Parameter>) newOperation
-					.getOwnedParameters()).basicAdd(this, msgs);
+						.getOwnedParameters()).basicAdd(this, msgs);
 			msgs = eBasicSetContainer((InternalEObject) newOperation,
-				InternalEObject.EOPPOSITE_FEATURE_BASE
-					- UMLPackage.OPERATION__OWNED_PARAMETER,
-				msgs);
+					InternalEObject.EOPPOSITE_FEATURE_BASE
+							- UMLPackage.OPERATION__OWNED_PARAMETER,
+					msgs);
 			if (msgs != null)
 				msgs.dispatch();
 		} else if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET,
-				UMLPackage.PARAMETER__OPERATION, newOperation, newOperation));
+					UMLPackage.PARAMETER__OPERATION, newOperation, newOperation));
 	}
 
 	/**
@@ -550,9 +516,7 @@
 	 * @generated
 	 */
 	public ParameterDirectionKind getDirection() {
-		return (ParameterDirectionKind) eDynamicGet(
-			UMLPackage.PARAMETER__DIRECTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER__DIRECTION, true, true);
+		return (ParameterDirectionKind) eDynamicGet(UMLPackage.PARAMETER__DIRECTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER__DIRECTION, true, true);
 	}
 
 	/**
@@ -561,8 +525,7 @@
 	 * @generated
 	 */
 	public void setDirection(ParameterDirectionKind newDirection) {
-		eDynamicSet(UMLPackage.PARAMETER__DIRECTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER__DIRECTION, newDirection);
+		eDynamicSet(UMLPackage.PARAMETER__DIRECTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER__DIRECTION, newDirection);
 	}
 
 	/**
@@ -607,9 +570,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getDefaultValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.PARAMETER__DEFAULT_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER__DEFAULT_VALUE, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.PARAMETER__DEFAULT_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER__DEFAULT_VALUE, true, true);
 	}
 
 	/**
@@ -618,9 +579,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetDefaultValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.PARAMETER__DEFAULT_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER__DEFAULT_VALUE, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.PARAMETER__DEFAULT_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER__DEFAULT_VALUE, false, true);
 	}
 
 	/**
@@ -630,8 +589,7 @@
 	 */
 	public NotificationChain basicSetDefaultValue(
 			ValueSpecification newDefaultValue, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newDefaultValue,
-			UMLPackage.PARAMETER__DEFAULT_VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newDefaultValue, UMLPackage.PARAMETER__DEFAULT_VALUE, msgs);
 		return msgs;
 	}
 
@@ -641,8 +599,7 @@
 	 * @generated
 	 */
 	public void setDefaultValue(ValueSpecification newDefaultValue) {
-		eDynamicSet(UMLPackage.PARAMETER__DEFAULT_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER__DEFAULT_VALUE, newDefaultValue);
+		eDynamicSet(UMLPackage.PARAMETER__DEFAULT_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER__DEFAULT_VALUE, newDefaultValue);
 	}
 
 	/**
@@ -652,8 +609,7 @@
 	 */
 	public ValueSpecification createDefaultValue(String name, Type type,
 			EClass eClass) {
-		ValueSpecification newDefaultValue = (ValueSpecification) create(
-			eClass);
+		ValueSpecification newDefaultValue = (ValueSpecification) create(eClass);
 		setDefaultValue(newDefaultValue);
 		if (name != null)
 			newDefaultValue.setName(name);
@@ -668,9 +624,7 @@
 	 * @generated
 	 */
 	public boolean isException() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.PARAMETER__IS_EXCEPTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER__IS_EXCEPTION, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.PARAMETER__IS_EXCEPTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER__IS_EXCEPTION, true, true);
 	}
 
 	/**
@@ -679,8 +633,7 @@
 	 * @generated
 	 */
 	public void setIsException(boolean newIsException) {
-		eDynamicSet(UMLPackage.PARAMETER__IS_EXCEPTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER__IS_EXCEPTION, newIsException);
+		eDynamicSet(UMLPackage.PARAMETER__IS_EXCEPTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER__IS_EXCEPTION, newIsException);
 	}
 
 	/**
@@ -689,9 +642,7 @@
 	 * @generated
 	 */
 	public boolean isStream() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.PARAMETER__IS_STREAM - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER__IS_STREAM, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.PARAMETER__IS_STREAM - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER__IS_STREAM, true, true);
 	}
 
 	/**
@@ -700,8 +651,7 @@
 	 * @generated
 	 */
 	public void setIsStream(boolean newIsStream) {
-		eDynamicSet(UMLPackage.PARAMETER__IS_STREAM - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER__IS_STREAM, newIsStream);
+		eDynamicSet(UMLPackage.PARAMETER__IS_STREAM - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER__IS_STREAM, newIsStream);
 	}
 
 	/**
@@ -710,9 +660,7 @@
 	 * @generated
 	 */
 	public ParameterEffectKind getEffect() {
-		return (ParameterEffectKind) eDynamicGet(
-			UMLPackage.PARAMETER__EFFECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER__EFFECT, true, true);
+		return (ParameterEffectKind) eDynamicGet(UMLPackage.PARAMETER__EFFECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER__EFFECT, true, true);
 	}
 
 	/**
@@ -721,8 +669,7 @@
 	 * @generated
 	 */
 	public void setEffect(ParameterEffectKind newEffect) {
-		eDynamicSet(UMLPackage.PARAMETER__EFFECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER__EFFECT, newEffect);
+		eDynamicSet(UMLPackage.PARAMETER__EFFECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER__EFFECT, newEffect);
 	}
 
 	/**
@@ -731,8 +678,7 @@
 	 * @generated
 	 */
 	public void unsetEffect() {
-		eDynamicUnset(UMLPackage.PARAMETER__EFFECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER__EFFECT);
+		eDynamicUnset(UMLPackage.PARAMETER__EFFECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER__EFFECT);
 	}
 
 	/**
@@ -741,9 +687,7 @@
 	 * @generated
 	 */
 	public boolean isSetEffect() {
-		return eDynamicIsSet(
-			UMLPackage.PARAMETER__EFFECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER__EFFECT);
+		return eDynamicIsSet(UMLPackage.PARAMETER__EFFECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER__EFFECT);
 	}
 
 	/**
@@ -753,8 +697,7 @@
 	 */
 	public boolean validateLowerGe0(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations.validateLowerGe0(this, diagnostics,
-			context);
+		return MultiplicityElementOperations.validateLowerGe0(this, diagnostics, context);
 	}
 
 	/**
@@ -764,8 +707,7 @@
 	 */
 	public boolean validateUpperGeLower(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations.validateUpperGeLower(this,
-			diagnostics, context);
+		return MultiplicityElementOperations.validateUpperGeLower(this, diagnostics, context);
 	}
 
 	/**
@@ -775,9 +717,7 @@
 	 */
 	public boolean validateValueSpecificationNoSideEffects(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return MultiplicityElementOperations
-			.validateValueSpecificationNoSideEffects(this, diagnostics,
-				context);
+		return MultiplicityElementOperations.validateValueSpecificationNoSideEffects(this, diagnostics, context);
 	}
 
 	/**
@@ -787,8 +727,7 @@
 	 */
 	public boolean validateValueSpecificationConstant(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return MultiplicityElementOperations
-			.validateValueSpecificationConstant(this, diagnostics, context);
+		return MultiplicityElementOperations.validateValueSpecificationConstant(this, diagnostics, context);
 	}
 
 	/**
@@ -798,8 +737,7 @@
 	 */
 	public boolean validateLowerIsInteger(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations.validateLowerIsInteger(this,
-			diagnostics, context);
+		return MultiplicityElementOperations.validateLowerIsInteger(this, diagnostics, context);
 	}
 
 	/**
@@ -809,8 +747,7 @@
 	 */
 	public boolean validateUpperIsUnlimitedNatural(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations
-			.validateUpperIsUnlimitedNatural(this, diagnostics, context);
+		return MultiplicityElementOperations.validateUpperIsUnlimitedNatural(this, diagnostics, context);
 	}
 
 	/**
@@ -874,8 +811,7 @@
 	 */
 	public boolean validateConnectorEnd(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ParameterOperations.validateConnectorEnd(this, diagnostics,
-			context);
+		return ParameterOperations.validateConnectorEnd(this, diagnostics, context);
 	}
 
 	/**
@@ -885,8 +821,7 @@
 	 */
 	public boolean validateStreamAndException(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ParameterOperations.validateStreamAndException(this, diagnostics,
-			context);
+		return ParameterOperations.validateStreamAndException(this, diagnostics, context);
 	}
 
 	/**
@@ -896,8 +831,7 @@
 	 */
 	public boolean validateObjectEffect(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ParameterOperations.validateObjectEffect(this, diagnostics,
-			context);
+		return ParameterOperations.validateObjectEffect(this, diagnostics, context);
 	}
 
 	/**
@@ -907,8 +841,7 @@
 	 */
 	public boolean validateNotException(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ParameterOperations.validateNotException(this, diagnostics,
-			context);
+		return ParameterOperations.validateNotException(this, diagnostics, context);
 	}
 
 	/**
@@ -918,8 +851,7 @@
 	 */
 	public boolean validateReentrantBehaviors(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ParameterOperations.validateReentrantBehaviors(this, diagnostics,
-			context);
+		return ParameterOperations.validateReentrantBehaviors(this, diagnostics, context);
 	}
 
 	/**
@@ -996,26 +928,19 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PARAMETER__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PARAMETER__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.PARAMETER__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.PARAMETER__PARAMETER_SET :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getParameterSets())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.PARAMETER__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PARAMETER__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.PARAMETER__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.PARAMETER__PARAMETER_SET:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getParameterSets()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -1029,27 +954,24 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PARAMETER__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PARAMETER__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PARAMETER__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.PARAMETER__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.PARAMETER__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.PARAMETER__LOWER_VALUE :
-				return basicSetLowerValue(null, msgs);
-			case UMLPackage.PARAMETER__UPPER_VALUE :
-				return basicSetUpperValue(null, msgs);
-			case UMLPackage.PARAMETER__DEFAULT_VALUE :
-				return basicSetDefaultValue(null, msgs);
-			case UMLPackage.PARAMETER__PARAMETER_SET :
-				return ((InternalEList<?>) getParameterSets())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.PARAMETER__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PARAMETER__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PARAMETER__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.PARAMETER__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.PARAMETER__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.PARAMETER__LOWER_VALUE:
+			return basicSetLowerValue(null, msgs);
+		case UMLPackage.PARAMETER__UPPER_VALUE:
+			return basicSetUpperValue(null, msgs);
+		case UMLPackage.PARAMETER__DEFAULT_VALUE:
+			return basicSetDefaultValue(null, msgs);
+		case UMLPackage.PARAMETER__PARAMETER_SET:
+			return ((InternalEList<?>) getParameterSets()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -1062,82 +984,82 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PARAMETER__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PARAMETER__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PARAMETER__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PARAMETER__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PARAMETER__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.PARAMETER__NAME :
-				return getName();
-			case UMLPackage.PARAMETER__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.PARAMETER__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.PARAMETER__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PARAMETER__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.PARAMETER__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.PARAMETER__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.PARAMETER__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.PARAMETER__END :
-				return getEnds();
-			case UMLPackage.PARAMETER__IS_ORDERED :
-				return isOrdered();
-			case UMLPackage.PARAMETER__IS_UNIQUE :
-				return isUnique();
-			case UMLPackage.PARAMETER__LOWER :
-				return getLower();
-			case UMLPackage.PARAMETER__LOWER_VALUE :
-				if (resolve)
-					return getLowerValue();
-				return basicGetLowerValue();
-			case UMLPackage.PARAMETER__UPPER :
-				return getUpper();
-			case UMLPackage.PARAMETER__UPPER_VALUE :
-				if (resolve)
-					return getUpperValue();
-				return basicGetUpperValue();
-			case UMLPackage.PARAMETER__DEFAULT :
-				return getDefault();
-			case UMLPackage.PARAMETER__DEFAULT_VALUE :
-				if (resolve)
-					return getDefaultValue();
-				return basicGetDefaultValue();
-			case UMLPackage.PARAMETER__DIRECTION :
-				return getDirection();
-			case UMLPackage.PARAMETER__EFFECT :
-				return getEffect();
-			case UMLPackage.PARAMETER__IS_EXCEPTION :
-				return isException();
-			case UMLPackage.PARAMETER__IS_STREAM :
-				return isStream();
-			case UMLPackage.PARAMETER__OPERATION :
-				if (resolve)
-					return getOperation();
-				return basicGetOperation();
-			case UMLPackage.PARAMETER__PARAMETER_SET :
-				return getParameterSets();
+		case UMLPackage.PARAMETER__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PARAMETER__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PARAMETER__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PARAMETER__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PARAMETER__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.PARAMETER__NAME:
+			return getName();
+		case UMLPackage.PARAMETER__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.PARAMETER__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.PARAMETER__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PARAMETER__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.PARAMETER__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.PARAMETER__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.PARAMETER__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.PARAMETER__END:
+			return getEnds();
+		case UMLPackage.PARAMETER__IS_ORDERED:
+			return isOrdered();
+		case UMLPackage.PARAMETER__IS_UNIQUE:
+			return isUnique();
+		case UMLPackage.PARAMETER__LOWER:
+			return getLower();
+		case UMLPackage.PARAMETER__LOWER_VALUE:
+			if (resolve)
+				return getLowerValue();
+			return basicGetLowerValue();
+		case UMLPackage.PARAMETER__UPPER:
+			return getUpper();
+		case UMLPackage.PARAMETER__UPPER_VALUE:
+			if (resolve)
+				return getUpperValue();
+			return basicGetUpperValue();
+		case UMLPackage.PARAMETER__DEFAULT:
+			return getDefault();
+		case UMLPackage.PARAMETER__DEFAULT_VALUE:
+			if (resolve)
+				return getDefaultValue();
+			return basicGetDefaultValue();
+		case UMLPackage.PARAMETER__DIRECTION:
+			return getDirection();
+		case UMLPackage.PARAMETER__EFFECT:
+			return getEffect();
+		case UMLPackage.PARAMETER__IS_EXCEPTION:
+			return isException();
+		case UMLPackage.PARAMETER__IS_STREAM:
+			return isStream();
+		case UMLPackage.PARAMETER__OPERATION:
+			if (resolve)
+				return getOperation();
+			return basicGetOperation();
+		case UMLPackage.PARAMETER__PARAMETER_SET:
+			return getParameterSets();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -1151,75 +1073,72 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PARAMETER__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PARAMETER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PARAMETER__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.PARAMETER__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.PARAMETER__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.PARAMETER__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.PARAMETER__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.PARAMETER__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.PARAMETER__IS_ORDERED :
-				setIsOrdered((Boolean) newValue);
-				return;
-			case UMLPackage.PARAMETER__IS_UNIQUE :
-				setIsUnique((Boolean) newValue);
-				return;
-			case UMLPackage.PARAMETER__LOWER :
-				setLower((Integer) newValue);
-				return;
-			case UMLPackage.PARAMETER__LOWER_VALUE :
-				setLowerValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.PARAMETER__UPPER :
-				setUpper((Integer) newValue);
-				return;
-			case UMLPackage.PARAMETER__UPPER_VALUE :
-				setUpperValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.PARAMETER__DEFAULT :
-				setDefault((String) newValue);
-				return;
-			case UMLPackage.PARAMETER__DEFAULT_VALUE :
-				setDefaultValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.PARAMETER__DIRECTION :
-				setDirection((ParameterDirectionKind) newValue);
-				return;
-			case UMLPackage.PARAMETER__EFFECT :
-				setEffect((ParameterEffectKind) newValue);
-				return;
-			case UMLPackage.PARAMETER__IS_EXCEPTION :
-				setIsException((Boolean) newValue);
-				return;
-			case UMLPackage.PARAMETER__IS_STREAM :
-				setIsStream((Boolean) newValue);
-				return;
-			case UMLPackage.PARAMETER__PARAMETER_SET :
-				getParameterSets().clear();
-				getParameterSets()
-					.addAll((Collection<? extends ParameterSet>) newValue);
-				return;
+		case UMLPackage.PARAMETER__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PARAMETER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PARAMETER__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.PARAMETER__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.PARAMETER__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.PARAMETER__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.PARAMETER__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.PARAMETER__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.PARAMETER__IS_ORDERED:
+			setIsOrdered((Boolean) newValue);
+			return;
+		case UMLPackage.PARAMETER__IS_UNIQUE:
+			setIsUnique((Boolean) newValue);
+			return;
+		case UMLPackage.PARAMETER__LOWER:
+			setLower((Integer) newValue);
+			return;
+		case UMLPackage.PARAMETER__LOWER_VALUE:
+			setLowerValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.PARAMETER__UPPER:
+			setUpper((Integer) newValue);
+			return;
+		case UMLPackage.PARAMETER__UPPER_VALUE:
+			setUpperValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.PARAMETER__DEFAULT:
+			setDefault((String) newValue);
+			return;
+		case UMLPackage.PARAMETER__DEFAULT_VALUE:
+			setDefaultValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.PARAMETER__DIRECTION:
+			setDirection((ParameterDirectionKind) newValue);
+			return;
+		case UMLPackage.PARAMETER__EFFECT:
+			setEffect((ParameterEffectKind) newValue);
+			return;
+		case UMLPackage.PARAMETER__IS_EXCEPTION:
+			setIsException((Boolean) newValue);
+			return;
+		case UMLPackage.PARAMETER__IS_STREAM:
+			setIsStream((Boolean) newValue);
+			return;
+		case UMLPackage.PARAMETER__PARAMETER_SET:
+			getParameterSets().clear();
+			getParameterSets().addAll((Collection<? extends ParameterSet>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -1243,69 +1162,69 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PARAMETER__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PARAMETER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PARAMETER__NAME :
-				unsetName();
-				return;
-			case UMLPackage.PARAMETER__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.PARAMETER__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.PARAMETER__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.PARAMETER__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.PARAMETER__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.PARAMETER__IS_ORDERED :
-				setIsOrdered(IS_ORDERED_EDEFAULT);
-				return;
-			case UMLPackage.PARAMETER__IS_UNIQUE :
-				setIsUnique(IS_UNIQUE_EDEFAULT);
-				return;
-			case UMLPackage.PARAMETER__LOWER :
-				setLower(LOWER_EDEFAULT);
-				return;
-			case UMLPackage.PARAMETER__LOWER_VALUE :
-				setLowerValue((ValueSpecification) null);
-				return;
-			case UMLPackage.PARAMETER__UPPER :
-				setUpper(UPPER_EDEFAULT);
-				return;
-			case UMLPackage.PARAMETER__UPPER_VALUE :
-				setUpperValue((ValueSpecification) null);
-				return;
-			case UMLPackage.PARAMETER__DEFAULT :
-				unsetDefault();
-				return;
-			case UMLPackage.PARAMETER__DEFAULT_VALUE :
-				setDefaultValue((ValueSpecification) null);
-				return;
-			case UMLPackage.PARAMETER__DIRECTION :
-				setDirection(DIRECTION_EDEFAULT);
-				return;
-			case UMLPackage.PARAMETER__EFFECT :
-				unsetEffect();
-				return;
-			case UMLPackage.PARAMETER__IS_EXCEPTION :
-				setIsException(IS_EXCEPTION_EDEFAULT);
-				return;
-			case UMLPackage.PARAMETER__IS_STREAM :
-				setIsStream(IS_STREAM_EDEFAULT);
-				return;
-			case UMLPackage.PARAMETER__PARAMETER_SET :
-				getParameterSets().clear();
-				return;
+		case UMLPackage.PARAMETER__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PARAMETER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PARAMETER__NAME:
+			unsetName();
+			return;
+		case UMLPackage.PARAMETER__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.PARAMETER__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.PARAMETER__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.PARAMETER__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.PARAMETER__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.PARAMETER__IS_ORDERED:
+			setIsOrdered(IS_ORDERED_EDEFAULT);
+			return;
+		case UMLPackage.PARAMETER__IS_UNIQUE:
+			setIsUnique(IS_UNIQUE_EDEFAULT);
+			return;
+		case UMLPackage.PARAMETER__LOWER:
+			setLower(LOWER_EDEFAULT);
+			return;
+		case UMLPackage.PARAMETER__LOWER_VALUE:
+			setLowerValue((ValueSpecification) null);
+			return;
+		case UMLPackage.PARAMETER__UPPER:
+			setUpper(UPPER_EDEFAULT);
+			return;
+		case UMLPackage.PARAMETER__UPPER_VALUE:
+			setUpperValue((ValueSpecification) null);
+			return;
+		case UMLPackage.PARAMETER__DEFAULT:
+			unsetDefault();
+			return;
+		case UMLPackage.PARAMETER__DEFAULT_VALUE:
+			setDefaultValue((ValueSpecification) null);
+			return;
+		case UMLPackage.PARAMETER__DIRECTION:
+			setDirection(DIRECTION_EDEFAULT);
+			return;
+		case UMLPackage.PARAMETER__EFFECT:
+			unsetEffect();
+			return;
+		case UMLPackage.PARAMETER__IS_EXCEPTION:
+			setIsException(IS_EXCEPTION_EDEFAULT);
+			return;
+		case UMLPackage.PARAMETER__IS_STREAM:
+			setIsStream(IS_STREAM_EDEFAULT);
+			return;
+		case UMLPackage.PARAMETER__PARAMETER_SET:
+			getParameterSets().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1318,64 +1237,62 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PARAMETER__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PARAMETER__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PARAMETER__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PARAMETER__OWNER :
-				return isSetOwner();
-			case UMLPackage.PARAMETER__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.PARAMETER__NAME :
-				return isSetName();
-			case UMLPackage.PARAMETER__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.PARAMETER__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.PARAMETER__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.PARAMETER__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.PARAMETER__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.PARAMETER__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.PARAMETER__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.PARAMETER__END :
-				return !getEnds().isEmpty();
-			case UMLPackage.PARAMETER__IS_ORDERED :
-				return isOrdered() != IS_ORDERED_EDEFAULT;
-			case UMLPackage.PARAMETER__IS_UNIQUE :
-				return isUnique() != IS_UNIQUE_EDEFAULT;
-			case UMLPackage.PARAMETER__LOWER :
-				return getLower() != LOWER_EDEFAULT;
-			case UMLPackage.PARAMETER__LOWER_VALUE :
-				return basicGetLowerValue() != null;
-			case UMLPackage.PARAMETER__UPPER :
-				return getUpper() != UPPER_EDEFAULT;
-			case UMLPackage.PARAMETER__UPPER_VALUE :
-				return basicGetUpperValue() != null;
-			case UMLPackage.PARAMETER__DEFAULT :
-				return isSetDefault();
-			case UMLPackage.PARAMETER__DEFAULT_VALUE :
-				return basicGetDefaultValue() != null;
-			case UMLPackage.PARAMETER__DIRECTION :
-				return getDirection() != DIRECTION_EDEFAULT;
-			case UMLPackage.PARAMETER__EFFECT :
-				return isSetEffect();
-			case UMLPackage.PARAMETER__IS_EXCEPTION :
-				return isException() != IS_EXCEPTION_EDEFAULT;
-			case UMLPackage.PARAMETER__IS_STREAM :
-				return isStream() != IS_STREAM_EDEFAULT;
-			case UMLPackage.PARAMETER__OPERATION :
-				return basicGetOperation() != null;
-			case UMLPackage.PARAMETER__PARAMETER_SET :
-				return !getParameterSets().isEmpty();
+		case UMLPackage.PARAMETER__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PARAMETER__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PARAMETER__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PARAMETER__OWNER:
+			return isSetOwner();
+		case UMLPackage.PARAMETER__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.PARAMETER__NAME:
+			return isSetName();
+		case UMLPackage.PARAMETER__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.PARAMETER__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.PARAMETER__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.PARAMETER__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.PARAMETER__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.PARAMETER__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.PARAMETER__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.PARAMETER__END:
+			return !getEnds().isEmpty();
+		case UMLPackage.PARAMETER__IS_ORDERED:
+			return isOrdered() != IS_ORDERED_EDEFAULT;
+		case UMLPackage.PARAMETER__IS_UNIQUE:
+			return isUnique() != IS_UNIQUE_EDEFAULT;
+		case UMLPackage.PARAMETER__LOWER:
+			return getLower() != LOWER_EDEFAULT;
+		case UMLPackage.PARAMETER__LOWER_VALUE:
+			return basicGetLowerValue() != null;
+		case UMLPackage.PARAMETER__UPPER:
+			return getUpper() != UPPER_EDEFAULT;
+		case UMLPackage.PARAMETER__UPPER_VALUE:
+			return basicGetUpperValue() != null;
+		case UMLPackage.PARAMETER__DEFAULT:
+			return isSetDefault();
+		case UMLPackage.PARAMETER__DEFAULT_VALUE:
+			return basicGetDefaultValue() != null;
+		case UMLPackage.PARAMETER__DIRECTION:
+			return getDirection() != DIRECTION_EDEFAULT;
+		case UMLPackage.PARAMETER__EFFECT:
+			return isSetEffect();
+		case UMLPackage.PARAMETER__IS_EXCEPTION:
+			return isException() != IS_EXCEPTION_EDEFAULT;
+		case UMLPackage.PARAMETER__IS_STREAM:
+			return isStream() != IS_STREAM_EDEFAULT;
+		case UMLPackage.PARAMETER__OPERATION:
+			return basicGetOperation() != null;
+		case UMLPackage.PARAMETER__PARAMETER_SET:
+			return !getParameterSets().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1390,20 +1307,20 @@
 			Class<?> baseClass) {
 		if (baseClass == MultiplicityElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.PARAMETER__IS_ORDERED :
-					return UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED;
-				case UMLPackage.PARAMETER__IS_UNIQUE :
-					return UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE;
-				case UMLPackage.PARAMETER__LOWER :
-					return UMLPackage.MULTIPLICITY_ELEMENT__LOWER;
-				case UMLPackage.PARAMETER__LOWER_VALUE :
-					return UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE;
-				case UMLPackage.PARAMETER__UPPER :
-					return UMLPackage.MULTIPLICITY_ELEMENT__UPPER;
-				case UMLPackage.PARAMETER__UPPER_VALUE :
-					return UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE;
-				default :
-					return -1;
+			case UMLPackage.PARAMETER__IS_ORDERED:
+				return UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED;
+			case UMLPackage.PARAMETER__IS_UNIQUE:
+				return UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE;
+			case UMLPackage.PARAMETER__LOWER:
+				return UMLPackage.MULTIPLICITY_ELEMENT__LOWER;
+			case UMLPackage.PARAMETER__LOWER_VALUE:
+				return UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE;
+			case UMLPackage.PARAMETER__UPPER:
+				return UMLPackage.MULTIPLICITY_ELEMENT__UPPER;
+			case UMLPackage.PARAMETER__UPPER_VALUE:
+				return UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -1419,20 +1336,20 @@
 			Class<?> baseClass) {
 		if (baseClass == MultiplicityElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED :
-					return UMLPackage.PARAMETER__IS_ORDERED;
-				case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE :
-					return UMLPackage.PARAMETER__IS_UNIQUE;
-				case UMLPackage.MULTIPLICITY_ELEMENT__LOWER :
-					return UMLPackage.PARAMETER__LOWER;
-				case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE :
-					return UMLPackage.PARAMETER__LOWER_VALUE;
-				case UMLPackage.MULTIPLICITY_ELEMENT__UPPER :
-					return UMLPackage.PARAMETER__UPPER;
-				case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE :
-					return UMLPackage.PARAMETER__UPPER_VALUE;
-				default :
-					return -1;
+			case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED:
+				return UMLPackage.PARAMETER__IS_ORDERED;
+			case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE:
+				return UMLPackage.PARAMETER__IS_UNIQUE;
+			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER:
+				return UMLPackage.PARAMETER__LOWER;
+			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE:
+				return UMLPackage.PARAMETER__LOWER_VALUE;
+			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER:
+				return UMLPackage.PARAMETER__UPPER;
+			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE:
+				return UMLPackage.PARAMETER__UPPER_VALUE;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1447,40 +1364,40 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == MultiplicityElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.PARAMETER___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.PARAMETER___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.PARAMETER___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.PARAMETER___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.PARAMETER___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.PARAMETER___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___SET_LOWER__INT :
-					return UMLPackage.PARAMETER___SET_LOWER__INT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___SET_UPPER__INT :
-					return UMLPackage.PARAMETER___SET_UPPER__INT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-					return UMLPackage.PARAMETER___COMPATIBLE_WITH__MULTIPLICITYELEMENT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-					return UMLPackage.PARAMETER___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___IS__INT_INT :
-					return UMLPackage.PARAMETER___IS__INT_INT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___IS_MULTIVALUED :
-					return UMLPackage.PARAMETER___IS_MULTIVALUED;
-				case UMLPackage.MULTIPLICITY_ELEMENT___GET_LOWER :
-					return UMLPackage.PARAMETER___GET_LOWER;
-				case UMLPackage.MULTIPLICITY_ELEMENT___LOWER_BOUND :
-					return UMLPackage.PARAMETER___LOWER_BOUND;
-				case UMLPackage.MULTIPLICITY_ELEMENT___GET_UPPER :
-					return UMLPackage.PARAMETER___GET_UPPER;
-				case UMLPackage.MULTIPLICITY_ELEMENT___UPPER_BOUND :
-					return UMLPackage.PARAMETER___UPPER_BOUND;
-				default :
-					return -1;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.PARAMETER___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.PARAMETER___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.PARAMETER___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.PARAMETER___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.PARAMETER___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.PARAMETER___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___SET_LOWER__INT:
+				return UMLPackage.PARAMETER___SET_LOWER__INT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___SET_UPPER__INT:
+				return UMLPackage.PARAMETER___SET_UPPER__INT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+				return UMLPackage.PARAMETER___COMPATIBLE_WITH__MULTIPLICITYELEMENT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+				return UMLPackage.PARAMETER___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___IS__INT_INT:
+				return UMLPackage.PARAMETER___IS__INT_INT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___IS_MULTIVALUED:
+				return UMLPackage.PARAMETER___IS_MULTIVALUED;
+			case UMLPackage.MULTIPLICITY_ELEMENT___GET_LOWER:
+				return UMLPackage.PARAMETER___GET_LOWER;
+			case UMLPackage.MULTIPLICITY_ELEMENT___LOWER_BOUND:
+				return UMLPackage.PARAMETER___LOWER_BOUND;
+			case UMLPackage.MULTIPLICITY_ELEMENT___GET_UPPER:
+				return UMLPackage.PARAMETER___GET_UPPER;
+			case UMLPackage.MULTIPLICITY_ELEMENT___UPPER_BOUND:
+				return UMLPackage.PARAMETER___UPPER_BOUND;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -1496,226 +1413,190 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.PARAMETER___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.PARAMETER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.PARAMETER___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETER___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.PARAMETER___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.PARAMETER___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.PARAMETER___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.PARAMETER___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.PARAMETER___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.PARAMETER___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.PARAMETER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PARAMETER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETER___GET_MODEL :
-				return getModel();
-			case UMLPackage.PARAMETER___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.PARAMETER___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.PARAMETER___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.PARAMETER___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.PARAMETER___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PARAMETER___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETER___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PARAMETER___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PARAMETER___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.PARAMETER___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PARAMETER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETER___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETER___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETER___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.PARAMETER___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.PARAMETER___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETER___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.PARAMETER___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.PARAMETER___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.PARAMETER___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.PARAMETER___GET_LABEL :
-				return getLabel();
-			case UMLPackage.PARAMETER___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.PARAMETER___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.PARAMETER___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.PARAMETER___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.PARAMETER___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.PARAMETER___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PARAMETER___SEPARATOR :
-				return separator();
-			case UMLPackage.PARAMETER___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.PARAMETER___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.PARAMETER___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.PARAMETER___GET_ENDS :
-				return getEnds();
-			case UMLPackage.PARAMETER___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-				return validateUpperGeLower((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-				return validateLowerGe0((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationNoSideEffects(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationConstant(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-				return validateLowerIsInteger(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-				return validateUpperIsUnlimitedNatural(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___SET_LOWER__INT :
-				setLower((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.PARAMETER___SET_UPPER__INT :
-				setUpper((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.PARAMETER___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-				return compatibleWith((MultiplicityElement) arguments.get(0));
-			case UMLPackage.PARAMETER___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-				return includesMultiplicity(
-					(MultiplicityElement) arguments.get(0));
-			case UMLPackage.PARAMETER___IS__INT_INT :
-				return is((Integer) arguments.get(0),
-					(Integer) arguments.get(1));
-			case UMLPackage.PARAMETER___IS_MULTIVALUED :
-				return isMultivalued();
-			case UMLPackage.PARAMETER___GET_LOWER :
-				return getLower();
-			case UMLPackage.PARAMETER___LOWER_BOUND :
-				return lowerBound();
-			case UMLPackage.PARAMETER___GET_UPPER :
-				return getUpper();
-			case UMLPackage.PARAMETER___UPPER_BOUND :
-				return upperBound();
-			case UMLPackage.PARAMETER___VALIDATE_IN_AND_OUT__DIAGNOSTICCHAIN_MAP :
-				return validateInAndOut((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___VALIDATE_NOT_EXCEPTION__DIAGNOSTICCHAIN_MAP :
-				return validateNotException((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___VALIDATE_CONNECTOR_END__DIAGNOSTICCHAIN_MAP :
-				return validateConnectorEnd((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___VALIDATE_REENTRANT_BEHAVIORS__DIAGNOSTICCHAIN_MAP :
-				return validateReentrantBehaviors(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___VALIDATE_STREAM_AND_EXCEPTION__DIAGNOSTICCHAIN_MAP :
-				return validateStreamAndException(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___VALIDATE_OBJECT_EFFECT__DIAGNOSTICCHAIN_MAP :
-				return validateObjectEffect((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER___IS_SET_DEFAULT :
-				return isSetDefault();
-			case UMLPackage.PARAMETER___SET_BOOLEAN_DEFAULT_VALUE__BOOLEAN :
-				setBooleanDefaultValue((Boolean) arguments.get(0));
-				return null;
-			case UMLPackage.PARAMETER___SET_DEFAULT__STRING :
-				setDefault((String) arguments.get(0));
-				return null;
-			case UMLPackage.PARAMETER___SET_INTEGER_DEFAULT_VALUE__INT :
-				setIntegerDefaultValue((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.PARAMETER___SET_NULL_DEFAULT_VALUE :
-				setNullDefaultValue();
-				return null;
-			case UMLPackage.PARAMETER___SET_REAL_DEFAULT_VALUE__DOUBLE :
-				setRealDefaultValue((Double) arguments.get(0));
-				return null;
-			case UMLPackage.PARAMETER___SET_STRING_DEFAULT_VALUE__STRING :
-				setStringDefaultValue((String) arguments.get(0));
-				return null;
-			case UMLPackage.PARAMETER___SET_UNLIMITED_NATURAL_DEFAULT_VALUE__INT :
-				setUnlimitedNaturalDefaultValue((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.PARAMETER___UNSET_DEFAULT :
-				unsetDefault();
-				return null;
-			case UMLPackage.PARAMETER___GET_DEFAULT :
-				return getDefault();
+		case UMLPackage.PARAMETER___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.PARAMETER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.PARAMETER___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETER___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.PARAMETER___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.PARAMETER___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.PARAMETER___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.PARAMETER___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.PARAMETER___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.PARAMETER___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.PARAMETER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PARAMETER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETER___GET_MODEL:
+			return getModel();
+		case UMLPackage.PARAMETER___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.PARAMETER___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.PARAMETER___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.PARAMETER___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.PARAMETER___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PARAMETER___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETER___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PARAMETER___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PARAMETER___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.PARAMETER___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PARAMETER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETER___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETER___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETER___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.PARAMETER___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.PARAMETER___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETER___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.PARAMETER___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.PARAMETER___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.PARAMETER___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.PARAMETER___GET_LABEL:
+			return getLabel();
+		case UMLPackage.PARAMETER___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.PARAMETER___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.PARAMETER___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.PARAMETER___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.PARAMETER___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.PARAMETER___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PARAMETER___SEPARATOR:
+			return separator();
+		case UMLPackage.PARAMETER___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.PARAMETER___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.PARAMETER___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.PARAMETER___GET_ENDS:
+			return getEnds();
+		case UMLPackage.PARAMETER___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+			return validateUpperGeLower((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+			return validateLowerGe0((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationConstant((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+			return validateLowerIsInteger((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+			return validateUpperIsUnlimitedNatural((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___SET_LOWER__INT:
+			setLower((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.PARAMETER___SET_UPPER__INT:
+			setUpper((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.PARAMETER___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+			return compatibleWith((MultiplicityElement) arguments.get(0));
+		case UMLPackage.PARAMETER___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+			return includesMultiplicity((MultiplicityElement) arguments.get(0));
+		case UMLPackage.PARAMETER___IS__INT_INT:
+			return is((Integer) arguments.get(0), (Integer) arguments.get(1));
+		case UMLPackage.PARAMETER___IS_MULTIVALUED:
+			return isMultivalued();
+		case UMLPackage.PARAMETER___GET_LOWER:
+			return getLower();
+		case UMLPackage.PARAMETER___LOWER_BOUND:
+			return lowerBound();
+		case UMLPackage.PARAMETER___GET_UPPER:
+			return getUpper();
+		case UMLPackage.PARAMETER___UPPER_BOUND:
+			return upperBound();
+		case UMLPackage.PARAMETER___VALIDATE_IN_AND_OUT__DIAGNOSTICCHAIN_MAP:
+			return validateInAndOut((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___VALIDATE_NOT_EXCEPTION__DIAGNOSTICCHAIN_MAP:
+			return validateNotException((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___VALIDATE_CONNECTOR_END__DIAGNOSTICCHAIN_MAP:
+			return validateConnectorEnd((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___VALIDATE_REENTRANT_BEHAVIORS__DIAGNOSTICCHAIN_MAP:
+			return validateReentrantBehaviors((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___VALIDATE_STREAM_AND_EXCEPTION__DIAGNOSTICCHAIN_MAP:
+			return validateStreamAndException((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___VALIDATE_OBJECT_EFFECT__DIAGNOSTICCHAIN_MAP:
+			return validateObjectEffect((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER___IS_SET_DEFAULT:
+			return isSetDefault();
+		case UMLPackage.PARAMETER___SET_BOOLEAN_DEFAULT_VALUE__BOOLEAN:
+			setBooleanDefaultValue((Boolean) arguments.get(0));
+			return null;
+		case UMLPackage.PARAMETER___SET_DEFAULT__STRING:
+			setDefault((String) arguments.get(0));
+			return null;
+		case UMLPackage.PARAMETER___SET_INTEGER_DEFAULT_VALUE__INT:
+			setIntegerDefaultValue((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.PARAMETER___SET_NULL_DEFAULT_VALUE:
+			setNullDefaultValue();
+			return null;
+		case UMLPackage.PARAMETER___SET_REAL_DEFAULT_VALUE__DOUBLE:
+			setRealDefaultValue((Double) arguments.get(0));
+			return null;
+		case UMLPackage.PARAMETER___SET_STRING_DEFAULT_VALUE__STRING:
+			setStringDefaultValue((String) arguments.get(0));
+			return null;
+		case UMLPackage.PARAMETER___SET_UNLIMITED_NATURAL_DEFAULT_VALUE__INT:
+			setUnlimitedNaturalDefaultValue((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.PARAMETER___UNSET_DEFAULT:
+			unsetDefault();
+			return null;
+		case UMLPackage.PARAMETER___GET_DEFAULT:
+			return getDefault();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1728,11 +1609,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.PARAMETER__OWNED_COMMENT,
-		UMLPackage.PARAMETER__NAME_EXPRESSION,
-		UMLPackage.PARAMETER__LOWER_VALUE, UMLPackage.PARAMETER__UPPER_VALUE,
-		UMLPackage.PARAMETER__DEFAULT_VALUE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.PARAMETER__OWNED_COMMENT, UMLPackage.PARAMETER__NAME_EXPRESSION, UMLPackage.PARAMETER__LOWER_VALUE, UMLPackage.PARAMETER__UPPER_VALUE, UMLPackage.PARAMETER__DEFAULT_VALUE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1742,9 +1619,9 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.PARAMETER__LOWER_VALUE)
-			|| eIsSet(UMLPackage.PARAMETER__UPPER_VALUE)
-			|| eIsSet(UMLPackage.PARAMETER__DEFAULT_VALUE);
+				|| eIsSet(UMLPackage.PARAMETER__LOWER_VALUE)
+				|| eIsSet(UMLPackage.PARAMETER__UPPER_VALUE)
+				|| eIsSet(UMLPackage.PARAMETER__DEFAULT_VALUE);
 	}
 
 	/**
@@ -1755,7 +1632,7 @@
 	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
-			|| eIsSet(UMLPackage.PARAMETER__OPERATION);
+				|| eIsSet(UMLPackage.PARAMETER__OPERATION);
 	}
 
 } //ParameterImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ParameterSetImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ParameterSetImpl.java
index a47c1c8..901a636 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ParameterSetImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ParameterSetImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -29,6 +29,8 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -98,20 +100,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.PARAMETER_SET__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PARAMETER_SET__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.PARAMETER_SET__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PARAMETER_SET__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -121,9 +116,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Parameter> getParameters() {
-		return (EList<Parameter>) eDynamicGet(
-			UMLPackage.PARAMETER_SET__PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER_SET__PARAMETER, true, true);
+		return (EList<Parameter>) eDynamicGet(UMLPackage.PARAMETER_SET__PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER_SET__PARAMETER, true, true);
 	}
 
 	/**
@@ -141,10 +134,8 @@
 	 * @generated
 	 */
 	public Parameter getParameter(String name, Type type, boolean ignoreCase) {
-		parameterLoop : for (Parameter parameter : getParameters()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(parameter.getName())
-				: name.equals(parameter.getName())))
+		parameterLoop: for (Parameter parameter : getParameters()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(parameter.getName()) : name.equals(parameter.getName())))
 				continue parameterLoop;
 			if (type != null && !type.equals(parameter.getType()))
 				continue parameterLoop;
@@ -160,9 +151,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Constraint> getConditions() {
-		return (EList<Constraint>) eDynamicGet(
-			UMLPackage.PARAMETER_SET__CONDITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETER_SET__CONDITION, true, true);
+		return (EList<Constraint>) eDynamicGet(UMLPackage.PARAMETER_SET__CONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETER_SET__CONDITION, true, true);
 	}
 
 	/**
@@ -203,18 +192,14 @@
 	 */
 	public Constraint getCondition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		conditionLoop : for (Constraint condition : getConditions()) {
+		conditionLoop: for (Constraint condition : getConditions()) {
 			if (eClass != null && !eClass.isInstance(condition))
 				continue conditionLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(condition.getName())
-				: name.equals(condition.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(condition.getName()) : name.equals(condition.getName())))
 				continue conditionLoop;
 			return condition;
 		}
-		return createOnDemand && eClass != null
-			? createCondition(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createCondition(name, eClass) : null;
 	}
 
 	/**
@@ -224,8 +209,7 @@
 	 */
 	public boolean validateSameParameterizedEntity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ParameterSetOperations.validateSameParameterizedEntity(this,
-			diagnostics, context);
+		return ParameterSetOperations.validateSameParameterizedEntity(this, diagnostics, context);
 	}
 
 	/**
@@ -245,8 +229,7 @@
 	 */
 	public boolean validateTwoParameterSets(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ParameterSetOperations.validateTwoParameterSets(this,
-			diagnostics, context);
+		return ParameterSetOperations.validateTwoParameterSets(this, diagnostics, context);
 	}
 
 	/**
@@ -259,12 +242,10 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PARAMETER_SET__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PARAMETER_SET__PARAMETER :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getParameters())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.PARAMETER_SET__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PARAMETER_SET__PARAMETER:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getParameters()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -278,20 +259,16 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PARAMETER_SET__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PARAMETER_SET__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PARAMETER_SET__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.PARAMETER_SET__CONDITION :
-				return ((InternalEList<?>) getConditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PARAMETER_SET__PARAMETER :
-				return ((InternalEList<?>) getParameters())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.PARAMETER_SET__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PARAMETER_SET__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PARAMETER_SET__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.PARAMETER_SET__CONDITION:
+			return ((InternalEList<?>) getConditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PARAMETER_SET__PARAMETER:
+			return ((InternalEList<?>) getParameters()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -304,36 +281,36 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PARAMETER_SET__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PARAMETER_SET__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PARAMETER_SET__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PARAMETER_SET__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PARAMETER_SET__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.PARAMETER_SET__NAME :
-				return getName();
-			case UMLPackage.PARAMETER_SET__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.PARAMETER_SET__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.PARAMETER_SET__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PARAMETER_SET__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.PARAMETER_SET__CONDITION :
-				return getConditions();
-			case UMLPackage.PARAMETER_SET__PARAMETER :
-				return getParameters();
+		case UMLPackage.PARAMETER_SET__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PARAMETER_SET__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PARAMETER_SET__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PARAMETER_SET__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PARAMETER_SET__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.PARAMETER_SET__NAME:
+			return getName();
+		case UMLPackage.PARAMETER_SET__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.PARAMETER_SET__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.PARAMETER_SET__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PARAMETER_SET__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.PARAMETER_SET__CONDITION:
+			return getConditions();
+		case UMLPackage.PARAMETER_SET__PARAMETER:
+			return getParameters();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -347,35 +324,31 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PARAMETER_SET__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PARAMETER_SET__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PARAMETER_SET__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.PARAMETER_SET__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.PARAMETER_SET__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.PARAMETER_SET__CONDITION :
-				getConditions().clear();
-				getConditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.PARAMETER_SET__PARAMETER :
-				getParameters().clear();
-				getParameters()
-					.addAll((Collection<? extends Parameter>) newValue);
-				return;
+		case UMLPackage.PARAMETER_SET__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PARAMETER_SET__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PARAMETER_SET__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.PARAMETER_SET__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.PARAMETER_SET__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.PARAMETER_SET__CONDITION:
+			getConditions().clear();
+			getConditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.PARAMETER_SET__PARAMETER:
+			getParameters().clear();
+			getParameters().addAll((Collection<? extends Parameter>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -388,27 +361,27 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PARAMETER_SET__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PARAMETER_SET__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PARAMETER_SET__NAME :
-				unsetName();
-				return;
-			case UMLPackage.PARAMETER_SET__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.PARAMETER_SET__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.PARAMETER_SET__CONDITION :
-				getConditions().clear();
-				return;
-			case UMLPackage.PARAMETER_SET__PARAMETER :
-				getParameters().clear();
-				return;
+		case UMLPackage.PARAMETER_SET__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PARAMETER_SET__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PARAMETER_SET__NAME:
+			unsetName();
+			return;
+		case UMLPackage.PARAMETER_SET__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.PARAMETER_SET__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.PARAMETER_SET__CONDITION:
+			getConditions().clear();
+			return;
+		case UMLPackage.PARAMETER_SET__PARAMETER:
+			getParameters().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -421,32 +394,30 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PARAMETER_SET__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PARAMETER_SET__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PARAMETER_SET__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PARAMETER_SET__OWNER :
-				return isSetOwner();
-			case UMLPackage.PARAMETER_SET__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.PARAMETER_SET__NAME :
-				return isSetName();
-			case UMLPackage.PARAMETER_SET__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.PARAMETER_SET__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.PARAMETER_SET__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.PARAMETER_SET__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.PARAMETER_SET__CONDITION :
-				return !getConditions().isEmpty();
-			case UMLPackage.PARAMETER_SET__PARAMETER :
-				return !getParameters().isEmpty();
+		case UMLPackage.PARAMETER_SET__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PARAMETER_SET__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PARAMETER_SET__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PARAMETER_SET__OWNER:
+			return isSetOwner();
+		case UMLPackage.PARAMETER_SET__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.PARAMETER_SET__NAME:
+			return isSetName();
+		case UMLPackage.PARAMETER_SET__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.PARAMETER_SET__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.PARAMETER_SET__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.PARAMETER_SET__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.PARAMETER_SET__CONDITION:
+			return !getConditions().isEmpty();
+		case UMLPackage.PARAMETER_SET__PARAMETER:
+			return !getParameters().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -461,136 +432,116 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.PARAMETER_SET___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER_SET___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER_SET___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.PARAMETER_SET___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.PARAMETER_SET___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.PARAMETER_SET___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.PARAMETER_SET___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PARAMETER_SET___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___GET_MODEL :
-				return getModel();
-			case UMLPackage.PARAMETER_SET___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.PARAMETER_SET___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.PARAMETER_SET___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.PARAMETER_SET___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.PARAMETER_SET___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.PARAMETER_SET___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.PARAMETER_SET___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PARAMETER_SET___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PARAMETER_SET___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.PARAMETER_SET___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.PARAMETER_SET___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.PARAMETER_SET___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER_SET___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER_SET___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER_SET___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___GET_LABEL :
-				return getLabel();
-			case UMLPackage.PARAMETER_SET___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.PARAMETER_SET___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.PARAMETER_SET___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.PARAMETER_SET___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.PARAMETER_SET___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.PARAMETER_SET___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PARAMETER_SET___SEPARATOR :
-				return separator();
-			case UMLPackage.PARAMETER_SET___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.PARAMETER_SET___VALIDATE_SAME_PARAMETERIZED_ENTITY__DIAGNOSTICCHAIN_MAP :
-				return validateSameParameterizedEntity(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER_SET___VALIDATE_INPUT__DIAGNOSTICCHAIN_MAP :
-				return validateInput((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETER_SET___VALIDATE_TWO_PARAMETER_SETS__DIAGNOSTICCHAIN_MAP :
-				return validateTwoParameterSets(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER_SET___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER_SET___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER_SET___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.PARAMETER_SET___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.PARAMETER_SET___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.PARAMETER_SET___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.PARAMETER_SET___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PARAMETER_SET___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___GET_MODEL:
+			return getModel();
+		case UMLPackage.PARAMETER_SET___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.PARAMETER_SET___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.PARAMETER_SET___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.PARAMETER_SET___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.PARAMETER_SET___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.PARAMETER_SET___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.PARAMETER_SET___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PARAMETER_SET___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PARAMETER_SET___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.PARAMETER_SET___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.PARAMETER_SET___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.PARAMETER_SET___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER_SET___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER_SET___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER_SET___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___GET_LABEL:
+			return getLabel();
+		case UMLPackage.PARAMETER_SET___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.PARAMETER_SET___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.PARAMETER_SET___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.PARAMETER_SET___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.PARAMETER_SET___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.PARAMETER_SET___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PARAMETER_SET___SEPARATOR:
+			return separator();
+		case UMLPackage.PARAMETER_SET___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.PARAMETER_SET___VALIDATE_SAME_PARAMETERIZED_ENTITY__DIAGNOSTICCHAIN_MAP:
+			return validateSameParameterizedEntity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER_SET___VALIDATE_INPUT__DIAGNOSTICCHAIN_MAP:
+			return validateInput((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETER_SET___VALIDATE_TWO_PARAMETER_SETS__DIAGNOSTICCHAIN_MAP:
+			return validateTwoParameterSets((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -603,10 +554,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.PARAMETER_SET__OWNED_COMMENT,
-		UMLPackage.PARAMETER_SET__NAME_EXPRESSION,
-		UMLPackage.PARAMETER_SET__CONDITION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.PARAMETER_SET__OWNED_COMMENT, UMLPackage.PARAMETER_SET__NAME_EXPRESSION, UMLPackage.PARAMETER_SET__CONDITION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -616,7 +564,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.PARAMETER_SET__CONDITION);
+				|| eIsSet(UMLPackage.PARAMETER_SET__CONDITION);
 	}
 
 } //ParameterSetImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ParameterableElementImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ParameterableElementImpl.java
index 1446d3f..bf362c0 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ParameterableElementImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ParameterableElementImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 451350, 485756
  *
  */
@@ -16,6 +16,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -24,8 +25,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Comment;
@@ -83,9 +87,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -94,11 +96,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true,
-			true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -107,11 +105,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -121,13 +115,11 @@
 	 */
 	public NotificationChain basicSetTemplateParameter(
 			TemplateParameter newTemplateParameter, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter,
-			UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter, UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			TemplateParameter owningTemplateParameter = basicGetOwningTemplateParameter();
-			if (owningTemplateParameter != null
-				&& owningTemplateParameter != newTemplateParameter) {
+			if (owningTemplateParameter != null && owningTemplateParameter != newTemplateParameter) {
 				setOwningTemplateParameter(null);
 			}
 		}
@@ -140,16 +132,11 @@
 	 * @generated
 	 */
 	public void setTemplateParameter(TemplateParameter newTemplateParameter) {
-		eDynamicSet(
-			UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			newTemplateParameter);
+		eDynamicSet(UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, newTemplateParameter);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			TemplateParameter owningTemplateParameter = basicGetOwningTemplateParameter();
-			if (owningTemplateParameter != null
-				&& owningTemplateParameter != newTemplateParameter) {
+			if (owningTemplateParameter != null && owningTemplateParameter != newTemplateParameter) {
 				setOwningTemplateParameter(null);
 			}
 		}
@@ -161,11 +148,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			true, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -174,11 +157,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -189,8 +168,7 @@
 	public NotificationChain basicSetOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter,
-			UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter, UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -209,11 +187,7 @@
 	 */
 	public void setOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter) {
-		eDynamicSet(
-			UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			newOwningTemplateParameter);
+		eDynamicSet(UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, newOwningTemplateParameter);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -252,23 +226,17 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
+		case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -282,16 +250,14 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -305,10 +271,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -321,24 +285,24 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
+		case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -352,22 +316,20 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
+		case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -380,18 +342,18 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
+		case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -404,18 +366,18 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
+		case UMLPackage.PARAMETERABLE_ELEMENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -430,95 +392,86 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETERABLE_ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PARAMETERABLE_ELEMENT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_MODEL :
-				return getModel();
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PARAMETERABLE_ELEMENT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PARAMETERABLE_ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.PARAMETERABLE_ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.PARAMETERABLE_ELEMENT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETERABLE_ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PARAMETERABLE_ELEMENT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_MODEL:
+			return getModel();
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PARAMETERABLE_ELEMENT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PARAMETERABLE_ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.PARAMETERABLE_ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.PARAMETERABLE_ELEMENT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -544,8 +497,8 @@
 	 */
 	@Override
 	public boolean isSetOwner() {
-		return super.isSetOwner() || eIsSet(
-			UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER);
+		return super.isSetOwner()
+				|| eIsSet(UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER);
 	}
 
 } //ParameterableElementImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PartDecompositionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PartDecompositionImpl.java
index 01e2b66..788de33 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PartDecompositionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PartDecompositionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -66,8 +66,7 @@
 	 */
 	public boolean validatePartsOfInternalStructures(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return PartDecompositionOperations
-			.validatePartsOfInternalStructures(this, diagnostics, context);
+		return PartDecompositionOperations.validatePartsOfInternalStructures(this, diagnostics, context);
 	}
 
 	/**
@@ -77,8 +76,7 @@
 	 */
 	public boolean validateAssume(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PartDecompositionOperations.validateAssume(this, diagnostics,
-			context);
+		return PartDecompositionOperations.validateAssume(this, diagnostics, context);
 	}
 
 	/**
@@ -88,8 +86,7 @@
 	 */
 	public boolean validateCommutativityOfDecomposition(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return PartDecompositionOperations
-			.validateCommutativityOfDecomposition(this, diagnostics, context);
+		return PartDecompositionOperations.validateCommutativityOfDecomposition(this, diagnostics, context);
 	}
 
 	/**
@@ -102,158 +99,128 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.PART_DECOMPOSITION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.PART_DECOMPOSITION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.PART_DECOMPOSITION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.PART_DECOMPOSITION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.PART_DECOMPOSITION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___GET_MODEL :
-				return getModel();
-			case UMLPackage.PART_DECOMPOSITION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.PART_DECOMPOSITION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.PART_DECOMPOSITION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.PART_DECOMPOSITION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.PART_DECOMPOSITION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.PART_DECOMPOSITION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.PART_DECOMPOSITION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.PART_DECOMPOSITION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.PART_DECOMPOSITION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.PART_DECOMPOSITION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.PART_DECOMPOSITION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.PART_DECOMPOSITION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.PART_DECOMPOSITION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.PART_DECOMPOSITION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.PART_DECOMPOSITION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PART_DECOMPOSITION___SEPARATOR :
-				return separator();
-			case UMLPackage.PART_DECOMPOSITION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.PART_DECOMPOSITION___VALIDATE_GATES_MATCH__DIAGNOSTICCHAIN_MAP :
-				return validateGatesMatch((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___VALIDATE_ARGUMENTS_ARE_CONSTANTS__DIAGNOSTICCHAIN_MAP :
-				return validateArgumentsAreConstants(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___VALIDATE_RETURN_VALUE_RECIPIENT_COVERAGE__DIAGNOSTICCHAIN_MAP :
-				return validateReturnValueRecipientCoverage(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___VALIDATE_ARGUMENTS_CORRESPOND_TO_PARAMETERS__DIAGNOSTICCHAIN_MAP :
-				return validateArgumentsCorrespondToParameters(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___VALIDATE_RETURN_VALUE_TYPE_RECIPIENT_CORRESPONDENCE__DIAGNOSTICCHAIN_MAP :
-				return validateReturnValueTypeRecipientCorrespondence(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___VALIDATE_ALL_LIFELINES__DIAGNOSTICCHAIN_MAP :
-				return validateAllLifelines((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___VALIDATE_COMMUTATIVITY_OF_DECOMPOSITION__DIAGNOSTICCHAIN_MAP :
-				return validateCommutativityOfDecomposition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___VALIDATE_ASSUME__DIAGNOSTICCHAIN_MAP :
-				return validateAssume((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PART_DECOMPOSITION___VALIDATE_PARTS_OF_INTERNAL_STRUCTURES__DIAGNOSTICCHAIN_MAP :
-				return validatePartsOfInternalStructures(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.PART_DECOMPOSITION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.PART_DECOMPOSITION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.PART_DECOMPOSITION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.PART_DECOMPOSITION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___GET_MODEL:
+			return getModel();
+		case UMLPackage.PART_DECOMPOSITION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.PART_DECOMPOSITION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.PART_DECOMPOSITION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.PART_DECOMPOSITION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.PART_DECOMPOSITION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.PART_DECOMPOSITION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.PART_DECOMPOSITION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.PART_DECOMPOSITION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.PART_DECOMPOSITION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.PART_DECOMPOSITION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.PART_DECOMPOSITION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.PART_DECOMPOSITION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.PART_DECOMPOSITION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.PART_DECOMPOSITION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.PART_DECOMPOSITION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PART_DECOMPOSITION___SEPARATOR:
+			return separator();
+		case UMLPackage.PART_DECOMPOSITION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.PART_DECOMPOSITION___VALIDATE_GATES_MATCH__DIAGNOSTICCHAIN_MAP:
+			return validateGatesMatch((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___VALIDATE_ARGUMENTS_ARE_CONSTANTS__DIAGNOSTICCHAIN_MAP:
+			return validateArgumentsAreConstants((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___VALIDATE_RETURN_VALUE_RECIPIENT_COVERAGE__DIAGNOSTICCHAIN_MAP:
+			return validateReturnValueRecipientCoverage((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___VALIDATE_ARGUMENTS_CORRESPOND_TO_PARAMETERS__DIAGNOSTICCHAIN_MAP:
+			return validateArgumentsCorrespondToParameters((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___VALIDATE_RETURN_VALUE_TYPE_RECIPIENT_CORRESPONDENCE__DIAGNOSTICCHAIN_MAP:
+			return validateReturnValueTypeRecipientCorrespondence((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___VALIDATE_ALL_LIFELINES__DIAGNOSTICCHAIN_MAP:
+			return validateAllLifelines((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___VALIDATE_COMMUTATIVITY_OF_DECOMPOSITION__DIAGNOSTICCHAIN_MAP:
+			return validateCommutativityOfDecomposition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___VALIDATE_ASSUME__DIAGNOSTICCHAIN_MAP:
+			return validateAssume((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PART_DECOMPOSITION___VALIDATE_PARTS_OF_INTERNAL_STRUCTURES__DIAGNOSTICCHAIN_MAP:
+			return validatePartsOfInternalStructures((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PinImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PinImpl.java
index 1ba2963..9d86e4d 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PinImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PinImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,8 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,6 +30,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -165,19 +169,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.PIN__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PIN__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.PIN__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PIN__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -186,9 +184,7 @@
 	 * @generated
 	 */
 	public boolean isOrdered() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.PIN__IS_ORDERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.PIN__IS_ORDERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, true, true);
 	}
 
 	/**
@@ -197,8 +193,7 @@
 	 * @generated
 	 */
 	public void setIsOrdered(boolean newIsOrdered) {
-		eDynamicSet(UMLPackage.PIN__IS_ORDERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, newIsOrdered);
+		eDynamicSet(UMLPackage.PIN__IS_ORDERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, newIsOrdered);
 	}
 
 	/**
@@ -207,9 +202,7 @@
 	 * @generated
 	 */
 	public boolean isUnique() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.PIN__IS_UNIQUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.PIN__IS_UNIQUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, true, true);
 	}
 
 	/**
@@ -218,8 +211,7 @@
 	 * @generated
 	 */
 	public void setIsUnique(boolean newIsUnique) {
-		eDynamicSet(UMLPackage.PIN__IS_UNIQUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, newIsUnique);
+		eDynamicSet(UMLPackage.PIN__IS_UNIQUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, newIsUnique);
 	}
 
 	/**
@@ -264,9 +256,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getUpperValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.PIN__UPPER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.PIN__UPPER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, true, true);
 	}
 
 	/**
@@ -275,9 +265,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetUpperValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.PIN__UPPER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.PIN__UPPER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, false, true);
 	}
 
 	/**
@@ -287,8 +275,7 @@
 	 */
 	public NotificationChain basicSetUpperValue(
 			ValueSpecification newUpperValue, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newUpperValue,
-			UMLPackage.PIN__UPPER_VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newUpperValue, UMLPackage.PIN__UPPER_VALUE, msgs);
 		return msgs;
 	}
 
@@ -298,9 +285,7 @@
 	 * @generated
 	 */
 	public void setUpperValue(ValueSpecification newUpperValue) {
-		eDynamicSet(UMLPackage.PIN__UPPER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE,
-			newUpperValue);
+		eDynamicSet(UMLPackage.PIN__UPPER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, newUpperValue);
 	}
 
 	/**
@@ -325,9 +310,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getLowerValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.PIN__LOWER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.PIN__LOWER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, true, true);
 	}
 
 	/**
@@ -336,9 +319,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetLowerValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.PIN__LOWER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.PIN__LOWER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, false, true);
 	}
 
 	/**
@@ -348,8 +329,7 @@
 	 */
 	public NotificationChain basicSetLowerValue(
 			ValueSpecification newLowerValue, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newLowerValue,
-			UMLPackage.PIN__LOWER_VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newLowerValue, UMLPackage.PIN__LOWER_VALUE, msgs);
 		return msgs;
 	}
 
@@ -359,9 +339,7 @@
 	 * @generated
 	 */
 	public void setLowerValue(ValueSpecification newLowerValue) {
-		eDynamicSet(UMLPackage.PIN__LOWER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE,
-			newLowerValue);
+		eDynamicSet(UMLPackage.PIN__LOWER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, newLowerValue);
 	}
 
 	/**
@@ -386,9 +364,7 @@
 	 * @generated
 	 */
 	public boolean isControl() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.PIN__IS_CONTROL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PIN__IS_CONTROL, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.PIN__IS_CONTROL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PIN__IS_CONTROL, true, true);
 	}
 
 	/**
@@ -397,8 +373,7 @@
 	 * @generated
 	 */
 	public void setIsControl(boolean newIsControl) {
-		eDynamicSet(UMLPackage.PIN__IS_CONTROL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PIN__IS_CONTROL, newIsControl);
+		eDynamicSet(UMLPackage.PIN__IS_CONTROL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PIN__IS_CONTROL, newIsControl);
 	}
 
 	/**
@@ -408,8 +383,7 @@
 	 */
 	public boolean validateLowerGe0(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations.validateLowerGe0(this, diagnostics,
-			context);
+		return MultiplicityElementOperations.validateLowerGe0(this, diagnostics, context);
 	}
 
 	/**
@@ -419,8 +393,7 @@
 	 */
 	public boolean validateUpperGeLower(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations.validateUpperGeLower(this,
-			diagnostics, context);
+		return MultiplicityElementOperations.validateUpperGeLower(this, diagnostics, context);
 	}
 
 	/**
@@ -430,9 +403,7 @@
 	 */
 	public boolean validateValueSpecificationNoSideEffects(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return MultiplicityElementOperations
-			.validateValueSpecificationNoSideEffects(this, diagnostics,
-				context);
+		return MultiplicityElementOperations.validateValueSpecificationNoSideEffects(this, diagnostics, context);
 	}
 
 	/**
@@ -442,8 +413,7 @@
 	 */
 	public boolean validateValueSpecificationConstant(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return MultiplicityElementOperations
-			.validateValueSpecificationConstant(this, diagnostics, context);
+		return MultiplicityElementOperations.validateValueSpecificationConstant(this, diagnostics, context);
 	}
 
 	/**
@@ -453,8 +423,7 @@
 	 */
 	public boolean validateLowerIsInteger(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations.validateLowerIsInteger(this,
-			diagnostics, context);
+		return MultiplicityElementOperations.validateLowerIsInteger(this, diagnostics, context);
 	}
 
 	/**
@@ -464,8 +433,7 @@
 	 */
 	public boolean validateUpperIsUnlimitedNatural(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations
-			.validateUpperIsUnlimitedNatural(this, diagnostics, context);
+		return MultiplicityElementOperations.validateUpperIsUnlimitedNatural(this, diagnostics, context);
 	}
 
 	/**
@@ -551,34 +519,28 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PIN__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PIN__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PIN__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.PIN__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PIN__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.PIN__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.PIN__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.PIN__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PIN__UPPER_BOUND :
-				return basicSetUpperBound(null, msgs);
-			case UMLPackage.PIN__LOWER_VALUE :
-				return basicSetLowerValue(null, msgs);
-			case UMLPackage.PIN__UPPER_VALUE :
-				return basicSetUpperValue(null, msgs);
+		case UMLPackage.PIN__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PIN__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PIN__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.PIN__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PIN__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.PIN__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PIN__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PIN__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PIN__UPPER_BOUND:
+			return basicSetUpperBound(null, msgs);
+		case UMLPackage.PIN__LOWER_VALUE:
+			return basicSetLowerValue(null, msgs);
+		case UMLPackage.PIN__UPPER_VALUE:
+			return basicSetUpperValue(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -591,94 +553,94 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PIN__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PIN__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PIN__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PIN__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PIN__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.PIN__NAME :
-				return getName();
-			case UMLPackage.PIN__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.PIN__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.PIN__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PIN__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.PIN__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.PIN__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.PIN__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.PIN__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.PIN__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.PIN__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.PIN__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.PIN__INCOMING :
-				return getIncomings();
-			case UMLPackage.PIN__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.PIN__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.PIN__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.PIN__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.PIN__IN_STATE :
-				return getInStates();
-			case UMLPackage.PIN__IS_CONTROL_TYPE :
-				return isControlType();
-			case UMLPackage.PIN__ORDERING :
-				return getOrdering();
-			case UMLPackage.PIN__SELECTION :
-				if (resolve)
-					return getSelection();
-				return basicGetSelection();
-			case UMLPackage.PIN__UPPER_BOUND :
-				if (resolve)
-					return getUpperBound();
-				return basicGetUpperBound();
-			case UMLPackage.PIN__IS_ORDERED :
-				return isOrdered();
-			case UMLPackage.PIN__IS_UNIQUE :
-				return isUnique();
-			case UMLPackage.PIN__LOWER :
-				return getLower();
-			case UMLPackage.PIN__LOWER_VALUE :
-				if (resolve)
-					return getLowerValue();
-				return basicGetLowerValue();
-			case UMLPackage.PIN__UPPER :
-				return getUpper();
-			case UMLPackage.PIN__UPPER_VALUE :
-				if (resolve)
-					return getUpperValue();
-				return basicGetUpperValue();
-			case UMLPackage.PIN__IS_CONTROL :
-				return isControl();
+		case UMLPackage.PIN__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PIN__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PIN__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PIN__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PIN__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.PIN__NAME:
+			return getName();
+		case UMLPackage.PIN__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.PIN__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.PIN__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PIN__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.PIN__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.PIN__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.PIN__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.PIN__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.PIN__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.PIN__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.PIN__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.PIN__INCOMING:
+			return getIncomings();
+		case UMLPackage.PIN__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.PIN__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.PIN__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.PIN__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.PIN__IN_STATE:
+			return getInStates();
+		case UMLPackage.PIN__IS_CONTROL_TYPE:
+			return isControlType();
+		case UMLPackage.PIN__ORDERING:
+			return getOrdering();
+		case UMLPackage.PIN__SELECTION:
+			if (resolve)
+				return getSelection();
+			return basicGetSelection();
+		case UMLPackage.PIN__UPPER_BOUND:
+			if (resolve)
+				return getUpperBound();
+			return basicGetUpperBound();
+		case UMLPackage.PIN__IS_ORDERED:
+			return isOrdered();
+		case UMLPackage.PIN__IS_UNIQUE:
+			return isUnique();
+		case UMLPackage.PIN__LOWER:
+			return getLower();
+		case UMLPackage.PIN__LOWER_VALUE:
+			if (resolve)
+				return getLowerValue();
+			return basicGetLowerValue();
+		case UMLPackage.PIN__UPPER:
+			return getUpper();
+		case UMLPackage.PIN__UPPER_VALUE:
+			if (resolve)
+				return getUpperValue();
+			return basicGetUpperValue();
+		case UMLPackage.PIN__IS_CONTROL:
+			return isControl();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -692,99 +654,92 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PIN__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PIN__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PIN__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.PIN__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.PIN__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.PIN__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.PIN__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.PIN__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.PIN__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.PIN__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.PIN__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.PIN__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.PIN__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.PIN__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.PIN__IN_STATE :
-				getInStates().clear();
-				getInStates().addAll((Collection<? extends State>) newValue);
-				return;
-			case UMLPackage.PIN__IS_CONTROL_TYPE :
-				setIsControlType((Boolean) newValue);
-				return;
-			case UMLPackage.PIN__ORDERING :
-				setOrdering((ObjectNodeOrderingKind) newValue);
-				return;
-			case UMLPackage.PIN__SELECTION :
-				setSelection((Behavior) newValue);
-				return;
-			case UMLPackage.PIN__UPPER_BOUND :
-				setUpperBound((ValueSpecification) newValue);
-				return;
-			case UMLPackage.PIN__IS_ORDERED :
-				setIsOrdered((Boolean) newValue);
-				return;
-			case UMLPackage.PIN__IS_UNIQUE :
-				setIsUnique((Boolean) newValue);
-				return;
-			case UMLPackage.PIN__LOWER :
-				setLower((Integer) newValue);
-				return;
-			case UMLPackage.PIN__LOWER_VALUE :
-				setLowerValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.PIN__UPPER :
-				setUpper((Integer) newValue);
-				return;
-			case UMLPackage.PIN__UPPER_VALUE :
-				setUpperValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.PIN__IS_CONTROL :
-				setIsControl((Boolean) newValue);
-				return;
+		case UMLPackage.PIN__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PIN__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PIN__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.PIN__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.PIN__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.PIN__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.PIN__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.PIN__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.PIN__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.PIN__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.PIN__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.PIN__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.PIN__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.PIN__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.PIN__IN_STATE:
+			getInStates().clear();
+			getInStates().addAll((Collection<? extends State>) newValue);
+			return;
+		case UMLPackage.PIN__IS_CONTROL_TYPE:
+			setIsControlType((Boolean) newValue);
+			return;
+		case UMLPackage.PIN__ORDERING:
+			setOrdering((ObjectNodeOrderingKind) newValue);
+			return;
+		case UMLPackage.PIN__SELECTION:
+			setSelection((Behavior) newValue);
+			return;
+		case UMLPackage.PIN__UPPER_BOUND:
+			setUpperBound((ValueSpecification) newValue);
+			return;
+		case UMLPackage.PIN__IS_ORDERED:
+			setIsOrdered((Boolean) newValue);
+			return;
+		case UMLPackage.PIN__IS_UNIQUE:
+			setIsUnique((Boolean) newValue);
+			return;
+		case UMLPackage.PIN__LOWER:
+			setLower((Integer) newValue);
+			return;
+		case UMLPackage.PIN__LOWER_VALUE:
+			setLowerValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.PIN__UPPER:
+			setUpper((Integer) newValue);
+			return;
+		case UMLPackage.PIN__UPPER_VALUE:
+			setUpperValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.PIN__IS_CONTROL:
+			setIsControl((Boolean) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -797,84 +752,84 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PIN__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PIN__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PIN__NAME :
-				unsetName();
-				return;
-			case UMLPackage.PIN__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.PIN__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.PIN__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.PIN__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.PIN__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.PIN__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.PIN__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.PIN__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.PIN__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.PIN__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.PIN__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.PIN__IN_STATE :
-				getInStates().clear();
-				return;
-			case UMLPackage.PIN__IS_CONTROL_TYPE :
-				setIsControlType(IS_CONTROL_TYPE_EDEFAULT);
-				return;
-			case UMLPackage.PIN__ORDERING :
-				setOrdering(ORDERING_EDEFAULT);
-				return;
-			case UMLPackage.PIN__SELECTION :
-				setSelection((Behavior) null);
-				return;
-			case UMLPackage.PIN__UPPER_BOUND :
-				setUpperBound((ValueSpecification) null);
-				return;
-			case UMLPackage.PIN__IS_ORDERED :
-				setIsOrdered(IS_ORDERED_EDEFAULT);
-				return;
-			case UMLPackage.PIN__IS_UNIQUE :
-				setIsUnique(IS_UNIQUE_EDEFAULT);
-				return;
-			case UMLPackage.PIN__LOWER :
-				setLower(LOWER_EDEFAULT);
-				return;
-			case UMLPackage.PIN__LOWER_VALUE :
-				setLowerValue((ValueSpecification) null);
-				return;
-			case UMLPackage.PIN__UPPER :
-				setUpper(UPPER_EDEFAULT);
-				return;
-			case UMLPackage.PIN__UPPER_VALUE :
-				setUpperValue((ValueSpecification) null);
-				return;
-			case UMLPackage.PIN__IS_CONTROL :
-				setIsControl(IS_CONTROL_EDEFAULT);
-				return;
+		case UMLPackage.PIN__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PIN__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PIN__NAME:
+			unsetName();
+			return;
+		case UMLPackage.PIN__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.PIN__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.PIN__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.PIN__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.PIN__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.PIN__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.PIN__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.PIN__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.PIN__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.PIN__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.PIN__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.PIN__IN_STATE:
+			getInStates().clear();
+			return;
+		case UMLPackage.PIN__IS_CONTROL_TYPE:
+			setIsControlType(IS_CONTROL_TYPE_EDEFAULT);
+			return;
+		case UMLPackage.PIN__ORDERING:
+			setOrdering(ORDERING_EDEFAULT);
+			return;
+		case UMLPackage.PIN__SELECTION:
+			setSelection((Behavior) null);
+			return;
+		case UMLPackage.PIN__UPPER_BOUND:
+			setUpperBound((ValueSpecification) null);
+			return;
+		case UMLPackage.PIN__IS_ORDERED:
+			setIsOrdered(IS_ORDERED_EDEFAULT);
+			return;
+		case UMLPackage.PIN__IS_UNIQUE:
+			setIsUnique(IS_UNIQUE_EDEFAULT);
+			return;
+		case UMLPackage.PIN__LOWER:
+			setLower(LOWER_EDEFAULT);
+			return;
+		case UMLPackage.PIN__LOWER_VALUE:
+			setLowerValue((ValueSpecification) null);
+			return;
+		case UMLPackage.PIN__UPPER:
+			setUpper(UPPER_EDEFAULT);
+			return;
+		case UMLPackage.PIN__UPPER_VALUE:
+			setUpperValue((ValueSpecification) null);
+			return;
+		case UMLPackage.PIN__IS_CONTROL:
+			setIsControl(IS_CONTROL_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -887,76 +842,74 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PIN__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PIN__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PIN__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PIN__OWNER :
-				return isSetOwner();
-			case UMLPackage.PIN__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.PIN__NAME :
-				return isSetName();
-			case UMLPackage.PIN__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.PIN__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.PIN__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.PIN__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.PIN__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.PIN__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.PIN__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.PIN__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.PIN__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.PIN__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.PIN__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.PIN__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.PIN__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.PIN__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.PIN__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.PIN__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.PIN__IN_STATE :
-				return !getInStates().isEmpty();
-			case UMLPackage.PIN__IS_CONTROL_TYPE :
-				return isControlType() != IS_CONTROL_TYPE_EDEFAULT;
-			case UMLPackage.PIN__ORDERING :
-				return getOrdering() != ORDERING_EDEFAULT;
-			case UMLPackage.PIN__SELECTION :
-				return basicGetSelection() != null;
-			case UMLPackage.PIN__UPPER_BOUND :
-				return basicGetUpperBound() != null;
-			case UMLPackage.PIN__IS_ORDERED :
-				return isOrdered() != IS_ORDERED_EDEFAULT;
-			case UMLPackage.PIN__IS_UNIQUE :
-				return isUnique() != IS_UNIQUE_EDEFAULT;
-			case UMLPackage.PIN__LOWER :
-				return getLower() != LOWER_EDEFAULT;
-			case UMLPackage.PIN__LOWER_VALUE :
-				return basicGetLowerValue() != null;
-			case UMLPackage.PIN__UPPER :
-				return getUpper() != UPPER_EDEFAULT;
-			case UMLPackage.PIN__UPPER_VALUE :
-				return basicGetUpperValue() != null;
-			case UMLPackage.PIN__IS_CONTROL :
-				return isControl() != IS_CONTROL_EDEFAULT;
+		case UMLPackage.PIN__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PIN__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PIN__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PIN__OWNER:
+			return isSetOwner();
+		case UMLPackage.PIN__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.PIN__NAME:
+			return isSetName();
+		case UMLPackage.PIN__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.PIN__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.PIN__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.PIN__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.PIN__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.PIN__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.PIN__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.PIN__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.PIN__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.PIN__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.PIN__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.PIN__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.PIN__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.PIN__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.PIN__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.PIN__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.PIN__IN_STATE:
+			return !getInStates().isEmpty();
+		case UMLPackage.PIN__IS_CONTROL_TYPE:
+			return isControlType() != IS_CONTROL_TYPE_EDEFAULT;
+		case UMLPackage.PIN__ORDERING:
+			return getOrdering() != ORDERING_EDEFAULT;
+		case UMLPackage.PIN__SELECTION:
+			return basicGetSelection() != null;
+		case UMLPackage.PIN__UPPER_BOUND:
+			return basicGetUpperBound() != null;
+		case UMLPackage.PIN__IS_ORDERED:
+			return isOrdered() != IS_ORDERED_EDEFAULT;
+		case UMLPackage.PIN__IS_UNIQUE:
+			return isUnique() != IS_UNIQUE_EDEFAULT;
+		case UMLPackage.PIN__LOWER:
+			return getLower() != LOWER_EDEFAULT;
+		case UMLPackage.PIN__LOWER_VALUE:
+			return basicGetLowerValue() != null;
+		case UMLPackage.PIN__UPPER:
+			return getUpper() != UPPER_EDEFAULT;
+		case UMLPackage.PIN__UPPER_VALUE:
+			return basicGetUpperValue() != null;
+		case UMLPackage.PIN__IS_CONTROL:
+			return isControl() != IS_CONTROL_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -971,20 +924,20 @@
 			Class<?> baseClass) {
 		if (baseClass == MultiplicityElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.PIN__IS_ORDERED :
-					return UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED;
-				case UMLPackage.PIN__IS_UNIQUE :
-					return UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE;
-				case UMLPackage.PIN__LOWER :
-					return UMLPackage.MULTIPLICITY_ELEMENT__LOWER;
-				case UMLPackage.PIN__LOWER_VALUE :
-					return UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE;
-				case UMLPackage.PIN__UPPER :
-					return UMLPackage.MULTIPLICITY_ELEMENT__UPPER;
-				case UMLPackage.PIN__UPPER_VALUE :
-					return UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE;
-				default :
-					return -1;
+			case UMLPackage.PIN__IS_ORDERED:
+				return UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED;
+			case UMLPackage.PIN__IS_UNIQUE:
+				return UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE;
+			case UMLPackage.PIN__LOWER:
+				return UMLPackage.MULTIPLICITY_ELEMENT__LOWER;
+			case UMLPackage.PIN__LOWER_VALUE:
+				return UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE;
+			case UMLPackage.PIN__UPPER:
+				return UMLPackage.MULTIPLICITY_ELEMENT__UPPER;
+			case UMLPackage.PIN__UPPER_VALUE:
+				return UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -1000,20 +953,20 @@
 			Class<?> baseClass) {
 		if (baseClass == MultiplicityElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED :
-					return UMLPackage.PIN__IS_ORDERED;
-				case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE :
-					return UMLPackage.PIN__IS_UNIQUE;
-				case UMLPackage.MULTIPLICITY_ELEMENT__LOWER :
-					return UMLPackage.PIN__LOWER;
-				case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE :
-					return UMLPackage.PIN__LOWER_VALUE;
-				case UMLPackage.MULTIPLICITY_ELEMENT__UPPER :
-					return UMLPackage.PIN__UPPER;
-				case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE :
-					return UMLPackage.PIN__UPPER_VALUE;
-				default :
-					return -1;
+			case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED:
+				return UMLPackage.PIN__IS_ORDERED;
+			case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE:
+				return UMLPackage.PIN__IS_UNIQUE;
+			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER:
+				return UMLPackage.PIN__LOWER;
+			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE:
+				return UMLPackage.PIN__LOWER_VALUE;
+			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER:
+				return UMLPackage.PIN__UPPER;
+			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE:
+				return UMLPackage.PIN__UPPER_VALUE;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1028,40 +981,40 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == MultiplicityElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.PIN___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.PIN___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.PIN___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.PIN___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.PIN___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.PIN___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___SET_LOWER__INT :
-					return UMLPackage.PIN___SET_LOWER__INT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___SET_UPPER__INT :
-					return UMLPackage.PIN___SET_UPPER__INT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-					return UMLPackage.PIN___COMPATIBLE_WITH__MULTIPLICITYELEMENT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-					return UMLPackage.PIN___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___IS__INT_INT :
-					return UMLPackage.PIN___IS__INT_INT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___IS_MULTIVALUED :
-					return UMLPackage.PIN___IS_MULTIVALUED;
-				case UMLPackage.MULTIPLICITY_ELEMENT___GET_LOWER :
-					return UMLPackage.PIN___GET_LOWER;
-				case UMLPackage.MULTIPLICITY_ELEMENT___LOWER_BOUND :
-					return UMLPackage.PIN___LOWER_BOUND;
-				case UMLPackage.MULTIPLICITY_ELEMENT___GET_UPPER :
-					return UMLPackage.PIN___GET_UPPER;
-				case UMLPackage.MULTIPLICITY_ELEMENT___UPPER_BOUND :
-					return UMLPackage.PIN___UPPER_BOUND;
-				default :
-					return -1;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.PIN___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.PIN___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.PIN___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.PIN___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.PIN___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.PIN___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___SET_LOWER__INT:
+				return UMLPackage.PIN___SET_LOWER__INT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___SET_UPPER__INT:
+				return UMLPackage.PIN___SET_UPPER__INT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+				return UMLPackage.PIN___COMPATIBLE_WITH__MULTIPLICITYELEMENT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+				return UMLPackage.PIN___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___IS__INT_INT:
+				return UMLPackage.PIN___IS__INT_INT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___IS_MULTIVALUED:
+				return UMLPackage.PIN___IS_MULTIVALUED;
+			case UMLPackage.MULTIPLICITY_ELEMENT___GET_LOWER:
+				return UMLPackage.PIN___GET_LOWER;
+			case UMLPackage.MULTIPLICITY_ELEMENT___LOWER_BOUND:
+				return UMLPackage.PIN___LOWER_BOUND;
+			case UMLPackage.MULTIPLICITY_ELEMENT___GET_UPPER:
+				return UMLPackage.PIN___GET_UPPER;
+			case UMLPackage.MULTIPLICITY_ELEMENT___UPPER_BOUND:
+				return UMLPackage.PIN___UPPER_BOUND;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -1077,208 +1030,166 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.PIN___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.PIN___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.PIN___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PIN___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.PIN___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.PIN___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.PIN___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.PIN___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.PIN___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.PIN___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.PIN___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PIN___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.PIN___GET_MODEL :
-				return getModel();
-			case UMLPackage.PIN___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.PIN___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.PIN___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.PIN___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.PIN___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PIN___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.PIN___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.PIN___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.PIN___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PIN___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PIN___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.PIN___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PIN___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.PIN___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.PIN___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.PIN___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.PIN___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.PIN___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PIN___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.PIN___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.PIN___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.PIN___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.PIN___GET_LABEL :
-				return getLabel();
-			case UMLPackage.PIN___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.PIN___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.PIN___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.PIN___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.PIN___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.PIN___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PIN___SEPARATOR :
-				return separator();
-			case UMLPackage.PIN___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.PIN___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.PIN___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.PIN___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.PIN___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP :
-				return validateInputOutputParameter(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateSelectionBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateObjectFlowEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-				return validateUpperGeLower((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-				return validateLowerGe0((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationNoSideEffects(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationConstant(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-				return validateLowerIsInteger(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-				return validateUpperIsUnlimitedNatural(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___SET_LOWER__INT :
-				setLower((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.PIN___SET_UPPER__INT :
-				setUpper((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.PIN___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-				return compatibleWith((MultiplicityElement) arguments.get(0));
-			case UMLPackage.PIN___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-				return includesMultiplicity(
-					(MultiplicityElement) arguments.get(0));
-			case UMLPackage.PIN___IS__INT_INT :
-				return is((Integer) arguments.get(0),
-					(Integer) arguments.get(1));
-			case UMLPackage.PIN___IS_MULTIVALUED :
-				return isMultivalued();
-			case UMLPackage.PIN___GET_LOWER :
-				return getLower();
-			case UMLPackage.PIN___LOWER_BOUND :
-				return lowerBound();
-			case UMLPackage.PIN___GET_UPPER :
-				return getUpper();
-			case UMLPackage.PIN___UPPER_BOUND :
-				return upperBound();
-			case UMLPackage.PIN___VALIDATE_CONTROL_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateControlPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PIN___VALIDATE_NOT_UNIQUE__DIAGNOSTICCHAIN_MAP :
-				return validateNotUnique((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.PIN___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.PIN___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PIN___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.PIN___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.PIN___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.PIN___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.PIN___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.PIN___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.PIN___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.PIN___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PIN___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.PIN___GET_MODEL:
+			return getModel();
+		case UMLPackage.PIN___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.PIN___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.PIN___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.PIN___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.PIN___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PIN___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.PIN___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.PIN___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.PIN___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PIN___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PIN___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.PIN___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PIN___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.PIN___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.PIN___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.PIN___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.PIN___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.PIN___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PIN___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.PIN___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.PIN___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.PIN___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.PIN___GET_LABEL:
+			return getLabel();
+		case UMLPackage.PIN___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.PIN___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.PIN___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.PIN___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.PIN___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.PIN___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PIN___SEPARATOR:
+			return separator();
+		case UMLPackage.PIN___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.PIN___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.PIN___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.PIN___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.PIN___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP:
+			return validateInputOutputParameter((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateSelectionBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateObjectFlowEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+			return validateUpperGeLower((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+			return validateLowerGe0((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationConstant((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+			return validateLowerIsInteger((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+			return validateUpperIsUnlimitedNatural((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___SET_LOWER__INT:
+			setLower((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.PIN___SET_UPPER__INT:
+			setUpper((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.PIN___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+			return compatibleWith((MultiplicityElement) arguments.get(0));
+		case UMLPackage.PIN___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+			return includesMultiplicity((MultiplicityElement) arguments.get(0));
+		case UMLPackage.PIN___IS__INT_INT:
+			return is((Integer) arguments.get(0), (Integer) arguments.get(1));
+		case UMLPackage.PIN___IS_MULTIVALUED:
+			return isMultivalued();
+		case UMLPackage.PIN___GET_LOWER:
+			return getLower();
+		case UMLPackage.PIN___LOWER_BOUND:
+			return lowerBound();
+		case UMLPackage.PIN___GET_UPPER:
+			return getUpper();
+		case UMLPackage.PIN___UPPER_BOUND:
+			return upperBound();
+		case UMLPackage.PIN___VALIDATE_CONTROL_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateControlPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PIN___VALIDATE_NOT_UNIQUE__DIAGNOSTICCHAIN_MAP:
+			return validateNotUnique((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1291,10 +1202,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.PIN__OWNED_COMMENT, UMLPackage.PIN__NAME_EXPRESSION,
-		UMLPackage.PIN__UPPER_BOUND, UMLPackage.PIN__LOWER_VALUE,
-		UMLPackage.PIN__UPPER_VALUE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.PIN__OWNED_COMMENT, UMLPackage.PIN__NAME_EXPRESSION, UMLPackage.PIN__UPPER_BOUND, UMLPackage.PIN__LOWER_VALUE, UMLPackage.PIN__UPPER_VALUE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1303,8 +1211,9 @@
 	 */
 	@Override
 	public boolean isSetOwnedElements() {
-		return super.isSetOwnedElements() || eIsSet(UMLPackage.PIN__LOWER_VALUE)
-			|| eIsSet(UMLPackage.PIN__UPPER_VALUE);
+		return super.isSetOwnedElements()
+				|| eIsSet(UMLPackage.PIN__LOWER_VALUE)
+				|| eIsSet(UMLPackage.PIN__UPPER_VALUE);
 	}
 
 } //PinImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PortImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PortImpl.java
index b36a2d3..116c378 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PortImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PortImpl.java
@@ -1,30 +1,40 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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.EStructuralFeature;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectResolvingEList;
+
 import org.eclipse.uml2.uml.AggregationKind;
 import org.eclipse.uml2.uml.Association;
 import org.eclipse.uml2.uml.Comment;
@@ -46,6 +56,7 @@
 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.PortOperations;
 
 /**
@@ -121,17 +132,9 @@
 		return UMLPackage.Literals.PORT;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.PORT__REDEFINED_PORT) {
 			return createRedefinedPortsList();
 		}
@@ -151,15 +154,13 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Property> getRedefinedProperties() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.PORT__REDEFINED_PROPERTY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__REDEFINED_PROPERTY, true, true);
+		return (EList<Property>) eDynamicGet(UMLPackage.PORT__REDEFINED_PROPERTY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__REDEFINED_PROPERTY, true, true);
 	}
 
 	private EList<Property> createRedefinedPropertiesList() {
 		return new SubsetSupersetEObjectResolvingEList<Property>(Property.class,
-			this, UMLPackage.PORT__REDEFINED_PROPERTY, null,
-			REDEFINED_PROPERTY_ESUBSETS);
+				this, UMLPackage.PORT__REDEFINED_PROPERTY, null,
+				REDEFINED_PROPERTY_ESUBSETS);
 	}
 
 	/**
@@ -170,8 +171,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_PROPERTY_ESUBSETS = new int[]{
-		UMLPackage.PORT__REDEFINED_PORT};
+	protected static final int[] REDEFINED_PROPERTY_ESUBSETS = new int[] { UMLPackage.PORT__REDEFINED_PORT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -179,9 +179,7 @@
 	 * @generated
 	 */
 	public boolean isBehavior() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.PORT__IS_BEHAVIOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PORT__IS_BEHAVIOR, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.PORT__IS_BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PORT__IS_BEHAVIOR, true, true);
 	}
 
 	/**
@@ -190,8 +188,7 @@
 	 * @generated
 	 */
 	public void setIsBehavior(boolean newIsBehavior) {
-		eDynamicSet(UMLPackage.PORT__IS_BEHAVIOR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PORT__IS_BEHAVIOR, newIsBehavior);
+		eDynamicSet(UMLPackage.PORT__IS_BEHAVIOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PORT__IS_BEHAVIOR, newIsBehavior);
 	}
 
 	/**
@@ -200,9 +197,7 @@
 	 * @generated
 	 */
 	public boolean isConjugated() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.PORT__IS_CONJUGATED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PORT__IS_CONJUGATED, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.PORT__IS_CONJUGATED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PORT__IS_CONJUGATED, true, true);
 	}
 
 	/**
@@ -211,8 +206,7 @@
 	 * @generated
 	 */
 	public void setIsConjugated(boolean newIsConjugated) {
-		eDynamicSet(UMLPackage.PORT__IS_CONJUGATED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PORT__IS_CONJUGATED, newIsConjugated);
+		eDynamicSet(UMLPackage.PORT__IS_CONJUGATED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PORT__IS_CONJUGATED, newIsConjugated);
 	}
 
 	/**
@@ -221,9 +215,7 @@
 	 * @generated
 	 */
 	public boolean isService() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.PORT__IS_SERVICE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PORT__IS_SERVICE, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.PORT__IS_SERVICE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PORT__IS_SERVICE, true, true);
 	}
 
 	/**
@@ -232,8 +224,7 @@
 	 * @generated
 	 */
 	public void setIsService(boolean newIsService) {
-		eDynamicSet(UMLPackage.PORT__IS_SERVICE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PORT__IS_SERVICE, newIsService);
+		eDynamicSet(UMLPackage.PORT__IS_SERVICE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PORT__IS_SERVICE, newIsService);
 	}
 
 	/**
@@ -245,11 +236,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.PORT__REQUIRED);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.PORT__REQUIRED);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.PORT__REQUIRED,
-					result = PortOperations.getRequireds(this));
+				cache.put(this, UMLPackage.Literals.PORT__REQUIRED, result = PortOperations.getRequireds(this));
 			}
 			return result;
 		}
@@ -271,10 +260,8 @@
 	 * @generated
 	 */
 	public Interface getRequired(String name, boolean ignoreCase) {
-		requiredLoop : for (Interface required : getRequireds()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(required.getName())
-				: name.equals(required.getName())))
+		requiredLoop: for (Interface required : getRequireds()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(required.getName()) : name.equals(required.getName())))
 				continue requiredLoop;
 			return required;
 		}
@@ -288,14 +275,12 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Port> getRedefinedPorts() {
-		return (EList<Port>) eDynamicGet(
-			UMLPackage.PORT__REDEFINED_PORT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PORT__REDEFINED_PORT, true, true);
+		return (EList<Port>) eDynamicGet(UMLPackage.PORT__REDEFINED_PORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PORT__REDEFINED_PORT, true, true);
 	}
 
 	private EList<Port> createRedefinedPortsList() {
 		return new SubsetSupersetEObjectResolvingEList<Port>(Port.class, this,
-			UMLPackage.PORT__REDEFINED_PORT, REDEFINED_PORT_ESUPERSETS, null);
+				UMLPackage.PORT__REDEFINED_PORT, REDEFINED_PORT_ESUPERSETS, null);
 	}
 
 	/**
@@ -306,8 +291,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_PORT_ESUPERSETS = new int[]{
-		UMLPackage.PORT__REDEFINED_PROPERTY};
+	protected static final int[] REDEFINED_PORT_ESUPERSETS = new int[] { UMLPackage.PORT__REDEFINED_PROPERTY };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -324,10 +308,8 @@
 	 * @generated
 	 */
 	public Port getRedefinedPort(String name, Type type, boolean ignoreCase) {
-		redefinedPortLoop : for (Port redefinedPort : getRedefinedPorts()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinedPort.getName())
-				: name.equals(redefinedPort.getName())))
+		redefinedPortLoop: for (Port redefinedPort : getRedefinedPorts()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinedPort.getName()) : name.equals(redefinedPort.getName())))
 				continue redefinedPortLoop;
 			if (type != null && !type.equals(redefinedPort.getType()))
 				continue redefinedPortLoop;
@@ -345,11 +327,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.PORT__PROVIDED);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.PORT__PROVIDED);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.PORT__PROVIDED,
-					result = PortOperations.getProvideds(this));
+				cache.put(this, UMLPackage.Literals.PORT__PROVIDED, result = PortOperations.getProvideds(this));
 			}
 			return result;
 		}
@@ -371,10 +351,8 @@
 	 * @generated
 	 */
 	public Interface getProvided(String name, boolean ignoreCase) {
-		providedLoop : for (Interface provided : getProvideds()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(provided.getName())
-				: name.equals(provided.getName())))
+		providedLoop: for (Interface provided : getProvideds()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(provided.getName()) : name.equals(provided.getName())))
 				continue providedLoop;
 			return provided;
 		}
@@ -387,9 +365,7 @@
 	 * @generated
 	 */
 	public ProtocolStateMachine getProtocol() {
-		return (ProtocolStateMachine) eDynamicGet(
-			UMLPackage.PORT__PROTOCOL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PORT__PROTOCOL, true, true);
+		return (ProtocolStateMachine) eDynamicGet(UMLPackage.PORT__PROTOCOL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PORT__PROTOCOL, true, true);
 	}
 
 	/**
@@ -398,9 +374,7 @@
 	 * @generated
 	 */
 	public ProtocolStateMachine basicGetProtocol() {
-		return (ProtocolStateMachine) eDynamicGet(
-			UMLPackage.PORT__PROTOCOL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PORT__PROTOCOL, false, true);
+		return (ProtocolStateMachine) eDynamicGet(UMLPackage.PORT__PROTOCOL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PORT__PROTOCOL, false, true);
 	}
 
 	/**
@@ -409,8 +383,7 @@
 	 * @generated
 	 */
 	public void setProtocol(ProtocolStateMachine newProtocol) {
-		eDynamicSet(UMLPackage.PORT__PROTOCOL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PORT__PROTOCOL, newProtocol);
+		eDynamicSet(UMLPackage.PORT__PROTOCOL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PORT__PROTOCOL, newProtocol);
 	}
 
 	/**
@@ -420,8 +393,7 @@
 	 */
 	public boolean validatePortAggregation(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PortOperations.validatePortAggregation(this, diagnostics,
-			context);
+		return PortOperations.validatePortAggregation(this, diagnostics, context);
 	}
 
 	/**
@@ -441,8 +413,7 @@
 	 */
 	public boolean validateEncapsulatedOwner(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PortOperations.validateEncapsulatedOwner(this, diagnostics,
-			context);
+		return PortOperations.validateEncapsulatedOwner(this, diagnostics, context);
 	}
 
 	/**
@@ -454,11 +425,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.PORT___BASIC_PROVIDED);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.PORT___BASIC_PROVIDED);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.PORT___BASIC_PROVIDED,
-					result = PortOperations.basicProvided(this));
+				cache.put(this, UMLPackage.Literals.PORT___BASIC_PROVIDED, result = PortOperations.basicProvided(this));
 			}
 			return result;
 		}
@@ -474,11 +443,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Interface> result = (EList<Interface>) cache.get(this,
-				UMLPackage.Literals.PORT___BASIC_REQUIRED);
+			EList<Interface> result = (EList<Interface>) cache.get(this, UMLPackage.Literals.PORT___BASIC_REQUIRED);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.PORT___BASIC_REQUIRED,
-					result = PortOperations.basicRequired(this));
+				cache.put(this, UMLPackage.Literals.PORT___BASIC_REQUIRED, result = PortOperations.basicRequired(this));
 			}
 			return result;
 		}
@@ -493,144 +460,144 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PORT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PORT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PORT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PORT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PORT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.PORT__NAME :
-				return getName();
-			case UMLPackage.PORT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.PORT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.PORT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PORT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.PORT__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.PORT__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.PORT__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.PORT__FEATURING_CLASSIFIER :
-				return getFeaturingClassifiers();
-			case UMLPackage.PORT__IS_STATIC :
-				return isStatic();
-			case UMLPackage.PORT__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.PORT__IS_ORDERED :
-				return isOrdered();
-			case UMLPackage.PORT__IS_UNIQUE :
-				return isUnique();
-			case UMLPackage.PORT__LOWER :
-				return getLower();
-			case UMLPackage.PORT__LOWER_VALUE :
-				if (resolve)
-					return getLowerValue();
-				return basicGetLowerValue();
-			case UMLPackage.PORT__UPPER :
-				return getUpper();
-			case UMLPackage.PORT__UPPER_VALUE :
-				if (resolve)
-					return getUpperValue();
-				return basicGetUpperValue();
-			case UMLPackage.PORT__IS_READ_ONLY :
-				return isReadOnly();
-			case UMLPackage.PORT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.PORT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.PORT__END :
-				return getEnds();
-			case UMLPackage.PORT__DEPLOYED_ELEMENT :
-				return getDeployedElements();
-			case UMLPackage.PORT__DEPLOYMENT :
-				return getDeployments();
-			case UMLPackage.PORT__DATATYPE :
-				if (resolve)
-					return getDatatype();
-				return basicGetDatatype();
-			case UMLPackage.PORT__INTERFACE :
-				if (resolve)
-					return getInterface();
-				return basicGetInterface();
-			case UMLPackage.PORT__DEFAULT :
-				return getDefault();
-			case UMLPackage.PORT__AGGREGATION :
-				return getAggregation();
-			case UMLPackage.PORT__ASSOCIATION_END :
-				if (resolve)
-					return getAssociationEnd();
-				return basicGetAssociationEnd();
-			case UMLPackage.PORT__QUALIFIER :
-				return getQualifiers();
-			case UMLPackage.PORT__CLASS :
-				if (resolve)
-					return getClass_();
-				return basicGetClass_();
-			case UMLPackage.PORT__DEFAULT_VALUE :
-				if (resolve)
-					return getDefaultValue();
-				return basicGetDefaultValue();
-			case UMLPackage.PORT__IS_COMPOSITE :
-				return isComposite();
-			case UMLPackage.PORT__IS_DERIVED :
-				return isDerived();
-			case UMLPackage.PORT__IS_DERIVED_UNION :
-				return isDerivedUnion();
-			case UMLPackage.PORT__IS_ID :
-				return isID();
-			case UMLPackage.PORT__OPPOSITE :
-				if (resolve)
-					return getOpposite();
-				return basicGetOpposite();
-			case UMLPackage.PORT__OWNING_ASSOCIATION :
-				if (resolve)
-					return getOwningAssociation();
-				return basicGetOwningAssociation();
-			case UMLPackage.PORT__REDEFINED_PROPERTY :
-				return getRedefinedProperties();
-			case UMLPackage.PORT__SUBSETTED_PROPERTY :
-				return getSubsettedProperties();
-			case UMLPackage.PORT__ASSOCIATION :
-				if (resolve)
-					return getAssociation();
-				return basicGetAssociation();
-			case UMLPackage.PORT__IS_BEHAVIOR :
-				return isBehavior();
-			case UMLPackage.PORT__IS_CONJUGATED :
-				return isConjugated();
-			case UMLPackage.PORT__IS_SERVICE :
-				return isService();
-			case UMLPackage.PORT__PROTOCOL :
-				if (resolve)
-					return getProtocol();
-				return basicGetProtocol();
-			case UMLPackage.PORT__PROVIDED :
-				return getProvideds();
-			case UMLPackage.PORT__REDEFINED_PORT :
-				return getRedefinedPorts();
-			case UMLPackage.PORT__REQUIRED :
-				return getRequireds();
+		case UMLPackage.PORT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PORT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PORT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PORT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PORT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.PORT__NAME:
+			return getName();
+		case UMLPackage.PORT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.PORT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.PORT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PORT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.PORT__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.PORT__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.PORT__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.PORT__FEATURING_CLASSIFIER:
+			return getFeaturingClassifiers();
+		case UMLPackage.PORT__IS_STATIC:
+			return isStatic();
+		case UMLPackage.PORT__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.PORT__IS_ORDERED:
+			return isOrdered();
+		case UMLPackage.PORT__IS_UNIQUE:
+			return isUnique();
+		case UMLPackage.PORT__LOWER:
+			return getLower();
+		case UMLPackage.PORT__LOWER_VALUE:
+			if (resolve)
+				return getLowerValue();
+			return basicGetLowerValue();
+		case UMLPackage.PORT__UPPER:
+			return getUpper();
+		case UMLPackage.PORT__UPPER_VALUE:
+			if (resolve)
+				return getUpperValue();
+			return basicGetUpperValue();
+		case UMLPackage.PORT__IS_READ_ONLY:
+			return isReadOnly();
+		case UMLPackage.PORT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.PORT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.PORT__END:
+			return getEnds();
+		case UMLPackage.PORT__DEPLOYED_ELEMENT:
+			return getDeployedElements();
+		case UMLPackage.PORT__DEPLOYMENT:
+			return getDeployments();
+		case UMLPackage.PORT__DATATYPE:
+			if (resolve)
+				return getDatatype();
+			return basicGetDatatype();
+		case UMLPackage.PORT__INTERFACE:
+			if (resolve)
+				return getInterface();
+			return basicGetInterface();
+		case UMLPackage.PORT__DEFAULT:
+			return getDefault();
+		case UMLPackage.PORT__AGGREGATION:
+			return getAggregation();
+		case UMLPackage.PORT__ASSOCIATION_END:
+			if (resolve)
+				return getAssociationEnd();
+			return basicGetAssociationEnd();
+		case UMLPackage.PORT__QUALIFIER:
+			return getQualifiers();
+		case UMLPackage.PORT__CLASS:
+			if (resolve)
+				return getClass_();
+			return basicGetClass_();
+		case UMLPackage.PORT__DEFAULT_VALUE:
+			if (resolve)
+				return getDefaultValue();
+			return basicGetDefaultValue();
+		case UMLPackage.PORT__IS_COMPOSITE:
+			return isComposite();
+		case UMLPackage.PORT__IS_DERIVED:
+			return isDerived();
+		case UMLPackage.PORT__IS_DERIVED_UNION:
+			return isDerivedUnion();
+		case UMLPackage.PORT__IS_ID:
+			return isID();
+		case UMLPackage.PORT__OPPOSITE:
+			if (resolve)
+				return getOpposite();
+			return basicGetOpposite();
+		case UMLPackage.PORT__OWNING_ASSOCIATION:
+			if (resolve)
+				return getOwningAssociation();
+			return basicGetOwningAssociation();
+		case UMLPackage.PORT__REDEFINED_PROPERTY:
+			return getRedefinedProperties();
+		case UMLPackage.PORT__SUBSETTED_PROPERTY:
+			return getSubsettedProperties();
+		case UMLPackage.PORT__ASSOCIATION:
+			if (resolve)
+				return getAssociation();
+			return basicGetAssociation();
+		case UMLPackage.PORT__IS_BEHAVIOR:
+			return isBehavior();
+		case UMLPackage.PORT__IS_CONJUGATED:
+			return isConjugated();
+		case UMLPackage.PORT__IS_SERVICE:
+			return isService();
+		case UMLPackage.PORT__PROTOCOL:
+			if (resolve)
+				return getProtocol();
+			return basicGetProtocol();
+		case UMLPackage.PORT__PROVIDED:
+			return getProvideds();
+		case UMLPackage.PORT__REDEFINED_PORT:
+			return getRedefinedPorts();
+		case UMLPackage.PORT__REQUIRED:
+			return getRequireds();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -644,137 +611,130 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PORT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PORT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PORT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.PORT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.PORT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.PORT__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.PORT__IS_STATIC :
-				setIsStatic((Boolean) newValue);
-				return;
-			case UMLPackage.PORT__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.PORT__IS_ORDERED :
-				setIsOrdered((Boolean) newValue);
-				return;
-			case UMLPackage.PORT__IS_UNIQUE :
-				setIsUnique((Boolean) newValue);
-				return;
-			case UMLPackage.PORT__LOWER :
-				setLower((Integer) newValue);
-				return;
-			case UMLPackage.PORT__LOWER_VALUE :
-				setLowerValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.PORT__UPPER :
-				setUpper((Integer) newValue);
-				return;
-			case UMLPackage.PORT__UPPER_VALUE :
-				setUpperValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.PORT__IS_READ_ONLY :
-				setIsReadOnly((Boolean) newValue);
-				return;
-			case UMLPackage.PORT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.PORT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.PORT__DEPLOYMENT :
-				getDeployments().clear();
-				getDeployments()
-					.addAll((Collection<? extends Deployment>) newValue);
-				return;
-			case UMLPackage.PORT__DATATYPE :
-				setDatatype((DataType) newValue);
-				return;
-			case UMLPackage.PORT__INTERFACE :
-				setInterface((Interface) newValue);
-				return;
-			case UMLPackage.PORT__DEFAULT :
-				setDefault((String) newValue);
-				return;
-			case UMLPackage.PORT__AGGREGATION :
-				setAggregation((AggregationKind) newValue);
-				return;
-			case UMLPackage.PORT__ASSOCIATION_END :
-				setAssociationEnd((Property) newValue);
-				return;
-			case UMLPackage.PORT__QUALIFIER :
-				getQualifiers().clear();
-				getQualifiers()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.PORT__DEFAULT_VALUE :
-				setDefaultValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.PORT__IS_COMPOSITE :
-				setIsComposite((Boolean) newValue);
-				return;
-			case UMLPackage.PORT__IS_DERIVED :
-				setIsDerived((Boolean) newValue);
-				return;
-			case UMLPackage.PORT__IS_DERIVED_UNION :
-				setIsDerivedUnion((Boolean) newValue);
-				return;
-			case UMLPackage.PORT__IS_ID :
-				setIsID((Boolean) newValue);
-				return;
-			case UMLPackage.PORT__OPPOSITE :
-				setOpposite((Property) newValue);
-				return;
-			case UMLPackage.PORT__OWNING_ASSOCIATION :
-				setOwningAssociation((Association) newValue);
-				return;
-			case UMLPackage.PORT__REDEFINED_PROPERTY :
-				getRedefinedProperties().clear();
-				getRedefinedProperties()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.PORT__SUBSETTED_PROPERTY :
-				getSubsettedProperties().clear();
-				getSubsettedProperties()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.PORT__ASSOCIATION :
-				setAssociation((Association) newValue);
-				return;
-			case UMLPackage.PORT__IS_BEHAVIOR :
-				setIsBehavior((Boolean) newValue);
-				return;
-			case UMLPackage.PORT__IS_CONJUGATED :
-				setIsConjugated((Boolean) newValue);
-				return;
-			case UMLPackage.PORT__IS_SERVICE :
-				setIsService((Boolean) newValue);
-				return;
-			case UMLPackage.PORT__PROTOCOL :
-				setProtocol((ProtocolStateMachine) newValue);
-				return;
-			case UMLPackage.PORT__REDEFINED_PORT :
-				getRedefinedPorts().clear();
-				getRedefinedPorts()
-					.addAll((Collection<? extends Port>) newValue);
-				return;
+		case UMLPackage.PORT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PORT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PORT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.PORT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.PORT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.PORT__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.PORT__IS_STATIC:
+			setIsStatic((Boolean) newValue);
+			return;
+		case UMLPackage.PORT__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.PORT__IS_ORDERED:
+			setIsOrdered((Boolean) newValue);
+			return;
+		case UMLPackage.PORT__IS_UNIQUE:
+			setIsUnique((Boolean) newValue);
+			return;
+		case UMLPackage.PORT__LOWER:
+			setLower((Integer) newValue);
+			return;
+		case UMLPackage.PORT__LOWER_VALUE:
+			setLowerValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.PORT__UPPER:
+			setUpper((Integer) newValue);
+			return;
+		case UMLPackage.PORT__UPPER_VALUE:
+			setUpperValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.PORT__IS_READ_ONLY:
+			setIsReadOnly((Boolean) newValue);
+			return;
+		case UMLPackage.PORT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.PORT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.PORT__DEPLOYMENT:
+			getDeployments().clear();
+			getDeployments().addAll((Collection<? extends Deployment>) newValue);
+			return;
+		case UMLPackage.PORT__DATATYPE:
+			setDatatype((DataType) newValue);
+			return;
+		case UMLPackage.PORT__INTERFACE:
+			setInterface((Interface) newValue);
+			return;
+		case UMLPackage.PORT__DEFAULT:
+			setDefault((String) newValue);
+			return;
+		case UMLPackage.PORT__AGGREGATION:
+			setAggregation((AggregationKind) newValue);
+			return;
+		case UMLPackage.PORT__ASSOCIATION_END:
+			setAssociationEnd((Property) newValue);
+			return;
+		case UMLPackage.PORT__QUALIFIER:
+			getQualifiers().clear();
+			getQualifiers().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.PORT__DEFAULT_VALUE:
+			setDefaultValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.PORT__IS_COMPOSITE:
+			setIsComposite((Boolean) newValue);
+			return;
+		case UMLPackage.PORT__IS_DERIVED:
+			setIsDerived((Boolean) newValue);
+			return;
+		case UMLPackage.PORT__IS_DERIVED_UNION:
+			setIsDerivedUnion((Boolean) newValue);
+			return;
+		case UMLPackage.PORT__IS_ID:
+			setIsID((Boolean) newValue);
+			return;
+		case UMLPackage.PORT__OPPOSITE:
+			setOpposite((Property) newValue);
+			return;
+		case UMLPackage.PORT__OWNING_ASSOCIATION:
+			setOwningAssociation((Association) newValue);
+			return;
+		case UMLPackage.PORT__REDEFINED_PROPERTY:
+			getRedefinedProperties().clear();
+			getRedefinedProperties().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.PORT__SUBSETTED_PROPERTY:
+			getSubsettedProperties().clear();
+			getSubsettedProperties().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.PORT__ASSOCIATION:
+			setAssociation((Association) newValue);
+			return;
+		case UMLPackage.PORT__IS_BEHAVIOR:
+			setIsBehavior((Boolean) newValue);
+			return;
+		case UMLPackage.PORT__IS_CONJUGATED:
+			setIsConjugated((Boolean) newValue);
+			return;
+		case UMLPackage.PORT__IS_SERVICE:
+			setIsService((Boolean) newValue);
+			return;
+		case UMLPackage.PORT__PROTOCOL:
+			setProtocol((ProtocolStateMachine) newValue);
+			return;
+		case UMLPackage.PORT__REDEFINED_PORT:
+			getRedefinedPorts().clear();
+			getRedefinedPorts().addAll((Collection<? extends Port>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -798,123 +758,123 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PORT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PORT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PORT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.PORT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.PORT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.PORT__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.PORT__IS_STATIC :
-				setIsStatic(IS_STATIC_EDEFAULT);
-				return;
-			case UMLPackage.PORT__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.PORT__IS_ORDERED :
-				setIsOrdered(IS_ORDERED_EDEFAULT);
-				return;
-			case UMLPackage.PORT__IS_UNIQUE :
-				setIsUnique(IS_UNIQUE_EDEFAULT);
-				return;
-			case UMLPackage.PORT__LOWER :
-				setLower(LOWER_EDEFAULT);
-				return;
-			case UMLPackage.PORT__LOWER_VALUE :
-				setLowerValue((ValueSpecification) null);
-				return;
-			case UMLPackage.PORT__UPPER :
-				setUpper(UPPER_EDEFAULT);
-				return;
-			case UMLPackage.PORT__UPPER_VALUE :
-				setUpperValue((ValueSpecification) null);
-				return;
-			case UMLPackage.PORT__IS_READ_ONLY :
-				setIsReadOnly(IS_READ_ONLY_EDEFAULT);
-				return;
-			case UMLPackage.PORT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.PORT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.PORT__DEPLOYMENT :
-				getDeployments().clear();
-				return;
-			case UMLPackage.PORT__DATATYPE :
-				setDatatype((DataType) null);
-				return;
-			case UMLPackage.PORT__INTERFACE :
-				setInterface((Interface) null);
-				return;
-			case UMLPackage.PORT__DEFAULT :
-				unsetDefault();
-				return;
-			case UMLPackage.PORT__AGGREGATION :
-				setAggregation(AGGREGATION_EDEFAULT);
-				return;
-			case UMLPackage.PORT__ASSOCIATION_END :
-				setAssociationEnd((Property) null);
-				return;
-			case UMLPackage.PORT__QUALIFIER :
-				getQualifiers().clear();
-				return;
-			case UMLPackage.PORT__DEFAULT_VALUE :
-				setDefaultValue((ValueSpecification) null);
-				return;
-			case UMLPackage.PORT__IS_COMPOSITE :
-				setIsComposite(IS_COMPOSITE_EDEFAULT);
-				return;
-			case UMLPackage.PORT__IS_DERIVED :
-				setIsDerived(IS_DERIVED_EDEFAULT);
-				return;
-			case UMLPackage.PORT__IS_DERIVED_UNION :
-				setIsDerivedUnion(IS_DERIVED_UNION_EDEFAULT);
-				return;
-			case UMLPackage.PORT__IS_ID :
-				setIsID(IS_ID_EDEFAULT);
-				return;
-			case UMLPackage.PORT__OPPOSITE :
-				setOpposite((Property) null);
-				return;
-			case UMLPackage.PORT__OWNING_ASSOCIATION :
-				setOwningAssociation((Association) null);
-				return;
-			case UMLPackage.PORT__REDEFINED_PROPERTY :
-				getRedefinedProperties().clear();
-				return;
-			case UMLPackage.PORT__SUBSETTED_PROPERTY :
-				getSubsettedProperties().clear();
-				return;
-			case UMLPackage.PORT__ASSOCIATION :
-				setAssociation((Association) null);
-				return;
-			case UMLPackage.PORT__IS_BEHAVIOR :
-				setIsBehavior(IS_BEHAVIOR_EDEFAULT);
-				return;
-			case UMLPackage.PORT__IS_CONJUGATED :
-				setIsConjugated(IS_CONJUGATED_EDEFAULT);
-				return;
-			case UMLPackage.PORT__IS_SERVICE :
-				setIsService(IS_SERVICE_EDEFAULT);
-				return;
-			case UMLPackage.PORT__PROTOCOL :
-				setProtocol((ProtocolStateMachine) null);
-				return;
-			case UMLPackage.PORT__REDEFINED_PORT :
-				getRedefinedPorts().clear();
-				return;
+		case UMLPackage.PORT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PORT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PORT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.PORT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.PORT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.PORT__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.PORT__IS_STATIC:
+			setIsStatic(IS_STATIC_EDEFAULT);
+			return;
+		case UMLPackage.PORT__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.PORT__IS_ORDERED:
+			setIsOrdered(IS_ORDERED_EDEFAULT);
+			return;
+		case UMLPackage.PORT__IS_UNIQUE:
+			setIsUnique(IS_UNIQUE_EDEFAULT);
+			return;
+		case UMLPackage.PORT__LOWER:
+			setLower(LOWER_EDEFAULT);
+			return;
+		case UMLPackage.PORT__LOWER_VALUE:
+			setLowerValue((ValueSpecification) null);
+			return;
+		case UMLPackage.PORT__UPPER:
+			setUpper(UPPER_EDEFAULT);
+			return;
+		case UMLPackage.PORT__UPPER_VALUE:
+			setUpperValue((ValueSpecification) null);
+			return;
+		case UMLPackage.PORT__IS_READ_ONLY:
+			setIsReadOnly(IS_READ_ONLY_EDEFAULT);
+			return;
+		case UMLPackage.PORT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.PORT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.PORT__DEPLOYMENT:
+			getDeployments().clear();
+			return;
+		case UMLPackage.PORT__DATATYPE:
+			setDatatype((DataType) null);
+			return;
+		case UMLPackage.PORT__INTERFACE:
+			setInterface((Interface) null);
+			return;
+		case UMLPackage.PORT__DEFAULT:
+			unsetDefault();
+			return;
+		case UMLPackage.PORT__AGGREGATION:
+			setAggregation(AGGREGATION_EDEFAULT);
+			return;
+		case UMLPackage.PORT__ASSOCIATION_END:
+			setAssociationEnd((Property) null);
+			return;
+		case UMLPackage.PORT__QUALIFIER:
+			getQualifiers().clear();
+			return;
+		case UMLPackage.PORT__DEFAULT_VALUE:
+			setDefaultValue((ValueSpecification) null);
+			return;
+		case UMLPackage.PORT__IS_COMPOSITE:
+			setIsComposite(IS_COMPOSITE_EDEFAULT);
+			return;
+		case UMLPackage.PORT__IS_DERIVED:
+			setIsDerived(IS_DERIVED_EDEFAULT);
+			return;
+		case UMLPackage.PORT__IS_DERIVED_UNION:
+			setIsDerivedUnion(IS_DERIVED_UNION_EDEFAULT);
+			return;
+		case UMLPackage.PORT__IS_ID:
+			setIsID(IS_ID_EDEFAULT);
+			return;
+		case UMLPackage.PORT__OPPOSITE:
+			setOpposite((Property) null);
+			return;
+		case UMLPackage.PORT__OWNING_ASSOCIATION:
+			setOwningAssociation((Association) null);
+			return;
+		case UMLPackage.PORT__REDEFINED_PROPERTY:
+			getRedefinedProperties().clear();
+			return;
+		case UMLPackage.PORT__SUBSETTED_PROPERTY:
+			getSubsettedProperties().clear();
+			return;
+		case UMLPackage.PORT__ASSOCIATION:
+			setAssociation((Association) null);
+			return;
+		case UMLPackage.PORT__IS_BEHAVIOR:
+			setIsBehavior(IS_BEHAVIOR_EDEFAULT);
+			return;
+		case UMLPackage.PORT__IS_CONJUGATED:
+			setIsConjugated(IS_CONJUGATED_EDEFAULT);
+			return;
+		case UMLPackage.PORT__IS_SERVICE:
+			setIsService(IS_SERVICE_EDEFAULT);
+			return;
+		case UMLPackage.PORT__PROTOCOL:
+			setProtocol((ProtocolStateMachine) null);
+			return;
+		case UMLPackage.PORT__REDEFINED_PORT:
+			getRedefinedPorts().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -927,112 +887,110 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PORT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PORT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PORT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PORT__OWNER :
-				return isSetOwner();
-			case UMLPackage.PORT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.PORT__NAME :
-				return isSetName();
-			case UMLPackage.PORT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.PORT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.PORT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.PORT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.PORT__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.PORT__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.PORT__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.PORT__FEATURING_CLASSIFIER :
-				return isSetFeaturingClassifiers();
-			case UMLPackage.PORT__IS_STATIC :
-				return isStatic() != IS_STATIC_EDEFAULT;
-			case UMLPackage.PORT__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.PORT__IS_ORDERED :
-				return isOrdered() != IS_ORDERED_EDEFAULT;
-			case UMLPackage.PORT__IS_UNIQUE :
-				return isUnique() != IS_UNIQUE_EDEFAULT;
-			case UMLPackage.PORT__LOWER :
-				return getLower() != LOWER_EDEFAULT;
-			case UMLPackage.PORT__LOWER_VALUE :
-				return basicGetLowerValue() != null;
-			case UMLPackage.PORT__UPPER :
-				return getUpper() != UPPER_EDEFAULT;
-			case UMLPackage.PORT__UPPER_VALUE :
-				return basicGetUpperValue() != null;
-			case UMLPackage.PORT__IS_READ_ONLY :
-				return isReadOnly() != IS_READ_ONLY_EDEFAULT;
-			case UMLPackage.PORT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.PORT__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.PORT__END :
-				return !getEnds().isEmpty();
-			case UMLPackage.PORT__DEPLOYED_ELEMENT :
-				return !getDeployedElements().isEmpty();
-			case UMLPackage.PORT__DEPLOYMENT :
-				return !getDeployments().isEmpty();
-			case UMLPackage.PORT__DATATYPE :
-				return basicGetDatatype() != null;
-			case UMLPackage.PORT__INTERFACE :
-				return basicGetInterface() != null;
-			case UMLPackage.PORT__DEFAULT :
-				return isSetDefault();
-			case UMLPackage.PORT__AGGREGATION :
-				return getAggregation() != AGGREGATION_EDEFAULT;
-			case UMLPackage.PORT__ASSOCIATION_END :
-				return basicGetAssociationEnd() != null;
-			case UMLPackage.PORT__QUALIFIER :
-				return !getQualifiers().isEmpty();
-			case UMLPackage.PORT__CLASS :
-				return basicGetClass_() != null;
-			case UMLPackage.PORT__DEFAULT_VALUE :
-				return basicGetDefaultValue() != null;
-			case UMLPackage.PORT__IS_COMPOSITE :
-				return isComposite() != IS_COMPOSITE_EDEFAULT;
-			case UMLPackage.PORT__IS_DERIVED :
-				return isDerived() != IS_DERIVED_EDEFAULT;
-			case UMLPackage.PORT__IS_DERIVED_UNION :
-				return isDerivedUnion() != IS_DERIVED_UNION_EDEFAULT;
-			case UMLPackage.PORT__IS_ID :
-				return isID() != IS_ID_EDEFAULT;
-			case UMLPackage.PORT__OPPOSITE :
-				return basicGetOpposite() != null;
-			case UMLPackage.PORT__OWNING_ASSOCIATION :
-				return basicGetOwningAssociation() != null;
-			case UMLPackage.PORT__REDEFINED_PROPERTY :
-				return !getRedefinedProperties().isEmpty();
-			case UMLPackage.PORT__SUBSETTED_PROPERTY :
-				return !getSubsettedProperties().isEmpty();
-			case UMLPackage.PORT__ASSOCIATION :
-				return basicGetAssociation() != null;
-			case UMLPackage.PORT__IS_BEHAVIOR :
-				return isBehavior() != IS_BEHAVIOR_EDEFAULT;
-			case UMLPackage.PORT__IS_CONJUGATED :
-				return isConjugated() != IS_CONJUGATED_EDEFAULT;
-			case UMLPackage.PORT__IS_SERVICE :
-				return isService() != IS_SERVICE_EDEFAULT;
-			case UMLPackage.PORT__PROTOCOL :
-				return basicGetProtocol() != null;
-			case UMLPackage.PORT__PROVIDED :
-				return !getProvideds().isEmpty();
-			case UMLPackage.PORT__REDEFINED_PORT :
-				return !getRedefinedPorts().isEmpty();
-			case UMLPackage.PORT__REQUIRED :
-				return !getRequireds().isEmpty();
+		case UMLPackage.PORT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PORT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PORT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PORT__OWNER:
+			return isSetOwner();
+		case UMLPackage.PORT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.PORT__NAME:
+			return isSetName();
+		case UMLPackage.PORT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.PORT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.PORT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.PORT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.PORT__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.PORT__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.PORT__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.PORT__FEATURING_CLASSIFIER:
+			return isSetFeaturingClassifiers();
+		case UMLPackage.PORT__IS_STATIC:
+			return isStatic() != IS_STATIC_EDEFAULT;
+		case UMLPackage.PORT__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.PORT__IS_ORDERED:
+			return isOrdered() != IS_ORDERED_EDEFAULT;
+		case UMLPackage.PORT__IS_UNIQUE:
+			return isUnique() != IS_UNIQUE_EDEFAULT;
+		case UMLPackage.PORT__LOWER:
+			return getLower() != LOWER_EDEFAULT;
+		case UMLPackage.PORT__LOWER_VALUE:
+			return basicGetLowerValue() != null;
+		case UMLPackage.PORT__UPPER:
+			return getUpper() != UPPER_EDEFAULT;
+		case UMLPackage.PORT__UPPER_VALUE:
+			return basicGetUpperValue() != null;
+		case UMLPackage.PORT__IS_READ_ONLY:
+			return isReadOnly() != IS_READ_ONLY_EDEFAULT;
+		case UMLPackage.PORT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.PORT__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.PORT__END:
+			return !getEnds().isEmpty();
+		case UMLPackage.PORT__DEPLOYED_ELEMENT:
+			return !getDeployedElements().isEmpty();
+		case UMLPackage.PORT__DEPLOYMENT:
+			return !getDeployments().isEmpty();
+		case UMLPackage.PORT__DATATYPE:
+			return basicGetDatatype() != null;
+		case UMLPackage.PORT__INTERFACE:
+			return basicGetInterface() != null;
+		case UMLPackage.PORT__DEFAULT:
+			return isSetDefault();
+		case UMLPackage.PORT__AGGREGATION:
+			return getAggregation() != AGGREGATION_EDEFAULT;
+		case UMLPackage.PORT__ASSOCIATION_END:
+			return basicGetAssociationEnd() != null;
+		case UMLPackage.PORT__QUALIFIER:
+			return !getQualifiers().isEmpty();
+		case UMLPackage.PORT__CLASS:
+			return basicGetClass_() != null;
+		case UMLPackage.PORT__DEFAULT_VALUE:
+			return basicGetDefaultValue() != null;
+		case UMLPackage.PORT__IS_COMPOSITE:
+			return isComposite() != IS_COMPOSITE_EDEFAULT;
+		case UMLPackage.PORT__IS_DERIVED:
+			return isDerived() != IS_DERIVED_EDEFAULT;
+		case UMLPackage.PORT__IS_DERIVED_UNION:
+			return isDerivedUnion() != IS_DERIVED_UNION_EDEFAULT;
+		case UMLPackage.PORT__IS_ID:
+			return isID() != IS_ID_EDEFAULT;
+		case UMLPackage.PORT__OPPOSITE:
+			return basicGetOpposite() != null;
+		case UMLPackage.PORT__OWNING_ASSOCIATION:
+			return basicGetOwningAssociation() != null;
+		case UMLPackage.PORT__REDEFINED_PROPERTY:
+			return !getRedefinedProperties().isEmpty();
+		case UMLPackage.PORT__SUBSETTED_PROPERTY:
+			return !getSubsettedProperties().isEmpty();
+		case UMLPackage.PORT__ASSOCIATION:
+			return basicGetAssociation() != null;
+		case UMLPackage.PORT__IS_BEHAVIOR:
+			return isBehavior() != IS_BEHAVIOR_EDEFAULT;
+		case UMLPackage.PORT__IS_CONJUGATED:
+			return isConjugated() != IS_CONJUGATED_EDEFAULT;
+		case UMLPackage.PORT__IS_SERVICE:
+			return isService() != IS_SERVICE_EDEFAULT;
+		case UMLPackage.PORT__PROTOCOL:
+			return basicGetProtocol() != null;
+		case UMLPackage.PORT__PROVIDED:
+			return !getProvideds().isEmpty();
+		case UMLPackage.PORT__REDEFINED_PORT:
+			return !getRedefinedPorts().isEmpty();
+		case UMLPackage.PORT__REQUIRED:
+			return !getRequireds().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1047,309 +1005,247 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.PORT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.PORT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.PORT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PORT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.PORT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.PORT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.PORT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.PORT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.PORT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.PORT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.PORT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PORT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.PORT___GET_MODEL :
-				return getModel();
-			case UMLPackage.PORT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.PORT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.PORT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.PORT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.PORT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.PORT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.PORT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PORT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.PORT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.PORT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.PORT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PORT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PORT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.PORT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PORT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.PORT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.PORT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.PORT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.PORT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.PORT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PORT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.PORT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.PORT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.PORT___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.PORT___GET_LABEL :
-				return getLabel();
-			case UMLPackage.PORT___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.PORT___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.PORT___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.PORT___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.PORT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.PORT___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PORT___SEPARATOR :
-				return separator();
-			case UMLPackage.PORT___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.PORT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.PORT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.PORT___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-				return validateUpperGeLower((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-				return validateLowerGe0((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationNoSideEffects(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationConstant(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-				return validateLowerIsInteger(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-				return validateUpperIsUnlimitedNatural(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___SET_LOWER__INT :
-				setLower((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.PORT___SET_UPPER__INT :
-				setUpper((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.PORT___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-				return compatibleWith((MultiplicityElement) arguments.get(0));
-			case UMLPackage.PORT___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-				return includesMultiplicity(
-					(MultiplicityElement) arguments.get(0));
-			case UMLPackage.PORT___IS__INT_INT :
-				return is((Integer) arguments.get(0),
-					(Integer) arguments.get(1));
-			case UMLPackage.PORT___IS_MULTIVALUED :
-				return isMultivalued();
-			case UMLPackage.PORT___GET_LOWER :
-				return getLower();
-			case UMLPackage.PORT___LOWER_BOUND :
-				return lowerBound();
-			case UMLPackage.PORT___GET_UPPER :
-				return getUpper();
-			case UMLPackage.PORT___UPPER_BOUND :
-				return upperBound();
-			case UMLPackage.PORT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.PORT___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.PORT___GET_ENDS :
-				return getEnds();
-			case UMLPackage.PORT___GET_DEPLOYED_ELEMENTS :
-				return getDeployedElements();
-			case UMLPackage.PORT___VALIDATE_SUBSETTING_CONTEXT_CONFORMS__DIAGNOSTICCHAIN_MAP :
-				return validateSubsettingContextConforms(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_DERIVED_UNION_IS_READ_ONLY__DIAGNOSTICCHAIN_MAP :
-				return validateDerivedUnionIsReadOnly(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_MULTIPLICITY_OF_COMPOSITE__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfComposite(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_REDEFINED_PROPERTY_INHERITED__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinedPropertyInherited(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_SUBSETTING_RULES__DIAGNOSTICCHAIN_MAP :
-				return validateSubsettingRules(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_BINDING_TO_ATTRIBUTE__DIAGNOSTICCHAIN_MAP :
-				return validateBindingToAttribute(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_DERIVED_UNION_IS_DERIVED__DIAGNOSTICCHAIN_MAP :
-				return validateDerivedUnionIsDerived(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_DEPLOYMENT_TARGET__DIAGNOSTICCHAIN_MAP :
-				return validateDeploymentTarget(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_SUBSETTED_PROPERTY_NAMES__DIAGNOSTICCHAIN_MAP :
-				return validateSubsettedPropertyNames(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_TYPE_OF_OPPOSITE_END__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfOppositeEnd(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_QUALIFIED_IS_ASSOCIATION_END__DIAGNOSTICCHAIN_MAP :
-				return validateQualifiedIsAssociationEnd(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___GET_DEFAULT :
-				return getDefault();
-			case UMLPackage.PORT___GET_OTHER_END :
-				return getOtherEnd();
-			case UMLPackage.PORT___IS_SET_DEFAULT :
-				return isSetDefault();
-			case UMLPackage.PORT___SET_BOOLEAN_DEFAULT_VALUE__BOOLEAN :
-				setBooleanDefaultValue((Boolean) arguments.get(0));
-				return null;
-			case UMLPackage.PORT___SET_DEFAULT__STRING :
-				setDefault((String) arguments.get(0));
-				return null;
-			case UMLPackage.PORT___SET_INTEGER_DEFAULT_VALUE__INT :
-				setIntegerDefaultValue((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.PORT___SET_IS_COMPOSITE__BOOLEAN :
-				setIsComposite((Boolean) arguments.get(0));
-				return null;
-			case UMLPackage.PORT___SET_IS_NAVIGABLE__BOOLEAN :
-				setIsNavigable((Boolean) arguments.get(0));
-				return null;
-			case UMLPackage.PORT___SET_NULL_DEFAULT_VALUE :
-				setNullDefaultValue();
-				return null;
-			case UMLPackage.PORT___SET_OPPOSITE__PROPERTY :
-				setOpposite((Property) arguments.get(0));
-				return null;
-			case UMLPackage.PORT___SET_REAL_DEFAULT_VALUE__DOUBLE :
-				setRealDefaultValue((Double) arguments.get(0));
-				return null;
-			case UMLPackage.PORT___SET_STRING_DEFAULT_VALUE__STRING :
-				setStringDefaultValue((String) arguments.get(0));
-				return null;
-			case UMLPackage.PORT___SET_UNLIMITED_NATURAL_DEFAULT_VALUE__INT :
-				setUnlimitedNaturalDefaultValue((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.PORT___UNSET_DEFAULT :
-				unsetDefault();
-				return null;
-			case UMLPackage.PORT___IS_ATTRIBUTE :
-				return isAttribute();
-			case UMLPackage.PORT___IS_COMPOSITE :
-				return isComposite();
-			case UMLPackage.PORT___IS_NAVIGABLE :
-				return isNavigable();
-			case UMLPackage.PORT___GET_OPPOSITE :
-				return getOpposite();
-			case UMLPackage.PORT___SUBSETTING_CONTEXT :
-				return subsettingContext();
-			case UMLPackage.PORT___VALIDATE_PORT_AGGREGATION__DIAGNOSTICCHAIN_MAP :
-				return validatePortAggregation(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_DEFAULT_VALUE__DIAGNOSTICCHAIN_MAP :
-				return validateDefaultValue((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___VALIDATE_ENCAPSULATED_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateEncapsulatedOwner(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PORT___GET_PROVIDEDS :
-				return getProvideds();
-			case UMLPackage.PORT___GET_REQUIREDS :
-				return getRequireds();
-			case UMLPackage.PORT___BASIC_PROVIDED :
-				return basicProvided();
-			case UMLPackage.PORT___BASIC_REQUIRED :
-				return basicRequired();
+		case UMLPackage.PORT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.PORT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.PORT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PORT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.PORT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.PORT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.PORT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.PORT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.PORT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.PORT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.PORT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PORT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.PORT___GET_MODEL:
+			return getModel();
+		case UMLPackage.PORT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.PORT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.PORT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.PORT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.PORT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.PORT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.PORT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PORT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.PORT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.PORT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.PORT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PORT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PORT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.PORT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PORT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.PORT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.PORT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.PORT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.PORT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.PORT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PORT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.PORT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.PORT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.PORT___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.PORT___GET_LABEL:
+			return getLabel();
+		case UMLPackage.PORT___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.PORT___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.PORT___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.PORT___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.PORT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.PORT___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PORT___SEPARATOR:
+			return separator();
+		case UMLPackage.PORT___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.PORT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.PORT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.PORT___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+			return validateUpperGeLower((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+			return validateLowerGe0((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationConstant((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+			return validateLowerIsInteger((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+			return validateUpperIsUnlimitedNatural((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___SET_LOWER__INT:
+			setLower((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.PORT___SET_UPPER__INT:
+			setUpper((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.PORT___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+			return compatibleWith((MultiplicityElement) arguments.get(0));
+		case UMLPackage.PORT___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+			return includesMultiplicity((MultiplicityElement) arguments.get(0));
+		case UMLPackage.PORT___IS__INT_INT:
+			return is((Integer) arguments.get(0), (Integer) arguments.get(1));
+		case UMLPackage.PORT___IS_MULTIVALUED:
+			return isMultivalued();
+		case UMLPackage.PORT___GET_LOWER:
+			return getLower();
+		case UMLPackage.PORT___LOWER_BOUND:
+			return lowerBound();
+		case UMLPackage.PORT___GET_UPPER:
+			return getUpper();
+		case UMLPackage.PORT___UPPER_BOUND:
+			return upperBound();
+		case UMLPackage.PORT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.PORT___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.PORT___GET_ENDS:
+			return getEnds();
+		case UMLPackage.PORT___GET_DEPLOYED_ELEMENTS:
+			return getDeployedElements();
+		case UMLPackage.PORT___VALIDATE_SUBSETTING_CONTEXT_CONFORMS__DIAGNOSTICCHAIN_MAP:
+			return validateSubsettingContextConforms((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_DERIVED_UNION_IS_READ_ONLY__DIAGNOSTICCHAIN_MAP:
+			return validateDerivedUnionIsReadOnly((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_MULTIPLICITY_OF_COMPOSITE__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfComposite((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_REDEFINED_PROPERTY_INHERITED__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinedPropertyInherited((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_SUBSETTING_RULES__DIAGNOSTICCHAIN_MAP:
+			return validateSubsettingRules((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_BINDING_TO_ATTRIBUTE__DIAGNOSTICCHAIN_MAP:
+			return validateBindingToAttribute((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_DERIVED_UNION_IS_DERIVED__DIAGNOSTICCHAIN_MAP:
+			return validateDerivedUnionIsDerived((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_DEPLOYMENT_TARGET__DIAGNOSTICCHAIN_MAP:
+			return validateDeploymentTarget((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_SUBSETTED_PROPERTY_NAMES__DIAGNOSTICCHAIN_MAP:
+			return validateSubsettedPropertyNames((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_TYPE_OF_OPPOSITE_END__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfOppositeEnd((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_QUALIFIED_IS_ASSOCIATION_END__DIAGNOSTICCHAIN_MAP:
+			return validateQualifiedIsAssociationEnd((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___GET_DEFAULT:
+			return getDefault();
+		case UMLPackage.PORT___GET_OTHER_END:
+			return getOtherEnd();
+		case UMLPackage.PORT___IS_SET_DEFAULT:
+			return isSetDefault();
+		case UMLPackage.PORT___SET_BOOLEAN_DEFAULT_VALUE__BOOLEAN:
+			setBooleanDefaultValue((Boolean) arguments.get(0));
+			return null;
+		case UMLPackage.PORT___SET_DEFAULT__STRING:
+			setDefault((String) arguments.get(0));
+			return null;
+		case UMLPackage.PORT___SET_INTEGER_DEFAULT_VALUE__INT:
+			setIntegerDefaultValue((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.PORT___SET_IS_COMPOSITE__BOOLEAN:
+			setIsComposite((Boolean) arguments.get(0));
+			return null;
+		case UMLPackage.PORT___SET_IS_NAVIGABLE__BOOLEAN:
+			setIsNavigable((Boolean) arguments.get(0));
+			return null;
+		case UMLPackage.PORT___SET_NULL_DEFAULT_VALUE:
+			setNullDefaultValue();
+			return null;
+		case UMLPackage.PORT___SET_OPPOSITE__PROPERTY:
+			setOpposite((Property) arguments.get(0));
+			return null;
+		case UMLPackage.PORT___SET_REAL_DEFAULT_VALUE__DOUBLE:
+			setRealDefaultValue((Double) arguments.get(0));
+			return null;
+		case UMLPackage.PORT___SET_STRING_DEFAULT_VALUE__STRING:
+			setStringDefaultValue((String) arguments.get(0));
+			return null;
+		case UMLPackage.PORT___SET_UNLIMITED_NATURAL_DEFAULT_VALUE__INT:
+			setUnlimitedNaturalDefaultValue((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.PORT___UNSET_DEFAULT:
+			unsetDefault();
+			return null;
+		case UMLPackage.PORT___IS_ATTRIBUTE:
+			return isAttribute();
+		case UMLPackage.PORT___IS_COMPOSITE:
+			return isComposite();
+		case UMLPackage.PORT___IS_NAVIGABLE:
+			return isNavigable();
+		case UMLPackage.PORT___GET_OPPOSITE:
+			return getOpposite();
+		case UMLPackage.PORT___SUBSETTING_CONTEXT:
+			return subsettingContext();
+		case UMLPackage.PORT___VALIDATE_PORT_AGGREGATION__DIAGNOSTICCHAIN_MAP:
+			return validatePortAggregation((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_DEFAULT_VALUE__DIAGNOSTICCHAIN_MAP:
+			return validateDefaultValue((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___VALIDATE_ENCAPSULATED_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateEncapsulatedOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PORT___GET_PROVIDEDS:
+			return getProvideds();
+		case UMLPackage.PORT___GET_REQUIREDS:
+			return getRequireds();
+		case UMLPackage.PORT___BASIC_PROVIDED:
+			return basicProvided();
+		case UMLPackage.PORT___BASIC_REQUIRED:
+			return basicRequired();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PrimitiveTypeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PrimitiveTypeImpl.java
index 568430e..b1a94cb 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PrimitiveTypeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PrimitiveTypeImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProfileApplicationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProfileApplicationImpl.java
index 057c7de..f4a68d7 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProfileApplicationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProfileApplicationImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -16,6 +16,8 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
+
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,8 +29,11 @@
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -106,20 +111,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> targets = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			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>(
-						Element.class, this,
-						UMLPackage.PROFILE_APPLICATION__TARGET,
-						TARGET_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET, targets = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PROFILE_APPLICATION__TARGET, TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.PROFILE_APPLICATION__TARGET, TARGET_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PROFILE_APPLICATION__TARGET, TARGET_ESUBSETS);
 	}
 
 	/**
@@ -133,20 +131,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> sources = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			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>(
-						Element.class, this,
-						UMLPackage.PROFILE_APPLICATION__SOURCE,
-						SOURCE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE, sources = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PROFILE_APPLICATION__SOURCE, SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.PROFILE_APPLICATION__SOURCE, SOURCE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PROFILE_APPLICATION__SOURCE, SOURCE_ESUBSETS);
 	}
 
 	/**
@@ -155,11 +146,7 @@
 	 * @generated
 	 */
 	public Profile getAppliedProfile() {
-		return (Profile) eDynamicGet(
-			UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROFILE_APPLICATION__APPLIED_PROFILE, true,
-			true);
+		return (Profile) eDynamicGet(UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROFILE_APPLICATION__APPLIED_PROFILE, true, true);
 	}
 
 	/**
@@ -168,11 +155,7 @@
 	 * @generated
 	 */
 	public Profile basicGetAppliedProfile() {
-		return (Profile) eDynamicGet(
-			UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROFILE_APPLICATION__APPLIED_PROFILE, false,
-			true);
+		return (Profile) eDynamicGet(UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROFILE_APPLICATION__APPLIED_PROFILE, false, true);
 	}
 
 	/**
@@ -181,11 +164,7 @@
 	 * @generated
 	 */
 	public void setAppliedProfile(Profile newAppliedProfile) {
-		eDynamicSet(
-			UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROFILE_APPLICATION__APPLIED_PROFILE,
-			newAppliedProfile);
+		eDynamicSet(UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROFILE_APPLICATION__APPLIED_PROFILE, newAppliedProfile);
 	}
 
 	/**
@@ -194,9 +173,7 @@
 	 * @generated
 	 */
 	public boolean isStrict() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.PROFILE_APPLICATION__IS_STRICT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROFILE_APPLICATION__IS_STRICT, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.PROFILE_APPLICATION__IS_STRICT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROFILE_APPLICATION__IS_STRICT, true, true);
 	}
 
 	/**
@@ -205,9 +182,7 @@
 	 * @generated
 	 */
 	public void setIsStrict(boolean newIsStrict) {
-		eDynamicSet(
-			UMLPackage.PROFILE_APPLICATION__IS_STRICT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROFILE_APPLICATION__IS_STRICT, newIsStrict);
+		eDynamicSet(UMLPackage.PROFILE_APPLICATION__IS_STRICT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROFILE_APPLICATION__IS_STRICT, newIsStrict);
 	}
 
 	/**
@@ -216,11 +191,7 @@
 	 * @generated
 	 */
 	public org.eclipse.uml2.uml.Package getApplyingPackage() {
-		return (org.eclipse.uml2.uml.Package) eDynamicGet(
-			UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROFILE_APPLICATION__APPLYING_PACKAGE, true,
-			true);
+		return (org.eclipse.uml2.uml.Package) eDynamicGet(UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROFILE_APPLICATION__APPLYING_PACKAGE, true, true);
 	}
 
 	/**
@@ -229,11 +200,7 @@
 	 * @generated
 	 */
 	public org.eclipse.uml2.uml.Package basicGetApplyingPackage() {
-		return (org.eclipse.uml2.uml.Package) eDynamicGet(
-			UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROFILE_APPLICATION__APPLYING_PACKAGE, false,
-			true);
+		return (org.eclipse.uml2.uml.Package) eDynamicGet(UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROFILE_APPLICATION__APPLYING_PACKAGE, false, true);
 	}
 
 	/**
@@ -244,8 +211,7 @@
 	public NotificationChain basicSetApplyingPackage(
 			org.eclipse.uml2.uml.Package newApplyingPackage,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newApplyingPackage,
-			UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newApplyingPackage, UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE, msgs);
 		return msgs;
 	}
 
@@ -256,11 +222,7 @@
 	 */
 	public void setApplyingPackage(
 			org.eclipse.uml2.uml.Package newApplyingPackage) {
-		eDynamicSet(
-			UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROFILE_APPLICATION__APPLYING_PACKAGE,
-			newApplyingPackage);
+		eDynamicSet(UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROFILE_APPLICATION__APPLYING_PACKAGE, newApplyingPackage);
 	}
 
 	/**
@@ -278,8 +240,7 @@
 	 * @generated
 	 */
 	public ENamedElement getAppliedDefinition(NamedElement namedElement) {
-		return ProfileApplicationOperations.getAppliedDefinition(this,
-			namedElement);
+		return ProfileApplicationOperations.getAppliedDefinition(this, namedElement);
 	}
 
 	/**
@@ -292,14 +253,12 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetApplyingPackage(
-					(org.eclipse.uml2.uml.Package) otherEnd, msgs);
+		case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetApplyingPackage((org.eclipse.uml2.uml.Package) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -313,14 +272,12 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROFILE_APPLICATION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE :
-				return basicSetApplyingPackage(null, msgs);
+		case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROFILE_APPLICATION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE:
+			return basicSetApplyingPackage(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -334,10 +291,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.PACKAGE__PROFILE_APPLICATION,
-					org.eclipse.uml2.uml.Package.class, msgs);
+		case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.PACKAGE__PROFILE_APPLICATION, org.eclipse.uml2.uml.Package.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -350,32 +305,32 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PROFILE_APPLICATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PROFILE_APPLICATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PROFILE_APPLICATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PROFILE_APPLICATION__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.PROFILE_APPLICATION__SOURCE :
-				return getSources();
-			case UMLPackage.PROFILE_APPLICATION__TARGET :
-				return getTargets();
-			case UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE :
-				if (resolve)
-					return getAppliedProfile();
-				return basicGetAppliedProfile();
-			case UMLPackage.PROFILE_APPLICATION__IS_STRICT :
-				return isStrict();
-			case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE :
-				if (resolve)
-					return getApplyingPackage();
-				return basicGetApplyingPackage();
+		case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PROFILE_APPLICATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PROFILE_APPLICATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PROFILE_APPLICATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PROFILE_APPLICATION__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.PROFILE_APPLICATION__SOURCE:
+			return getSources();
+		case UMLPackage.PROFILE_APPLICATION__TARGET:
+			return getTargets();
+		case UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE:
+			if (resolve)
+				return getAppliedProfile();
+			return basicGetAppliedProfile();
+		case UMLPackage.PROFILE_APPLICATION__IS_STRICT:
+			return isStrict();
+		case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE:
+			if (resolve)
+				return getApplyingPackage();
+			return basicGetApplyingPackage();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -389,25 +344,23 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PROFILE_APPLICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE :
-				setAppliedProfile((Profile) newValue);
-				return;
-			case UMLPackage.PROFILE_APPLICATION__IS_STRICT :
-				setIsStrict((Boolean) newValue);
-				return;
-			case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE :
-				setApplyingPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
+		case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PROFILE_APPLICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE:
+			setAppliedProfile((Profile) newValue);
+			return;
+		case UMLPackage.PROFILE_APPLICATION__IS_STRICT:
+			setIsStrict((Boolean) newValue);
+			return;
+		case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE:
+			setApplyingPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -420,21 +373,21 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PROFILE_APPLICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE :
-				setAppliedProfile((Profile) null);
-				return;
-			case UMLPackage.PROFILE_APPLICATION__IS_STRICT :
-				setIsStrict(IS_STRICT_EDEFAULT);
-				return;
-			case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE :
-				setApplyingPackage((org.eclipse.uml2.uml.Package) null);
-				return;
+		case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PROFILE_APPLICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE:
+			setAppliedProfile((Profile) null);
+			return;
+		case UMLPackage.PROFILE_APPLICATION__IS_STRICT:
+			setIsStrict(IS_STRICT_EDEFAULT);
+			return;
+		case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE:
+			setApplyingPackage((org.eclipse.uml2.uml.Package) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -447,26 +400,26 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PROFILE_APPLICATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PROFILE_APPLICATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PROFILE_APPLICATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.PROFILE_APPLICATION__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.PROFILE_APPLICATION__SOURCE :
-				return isSetSources();
-			case UMLPackage.PROFILE_APPLICATION__TARGET :
-				return isSetTargets();
-			case UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE :
-				return basicGetAppliedProfile() != null;
-			case UMLPackage.PROFILE_APPLICATION__IS_STRICT :
-				return isStrict() != IS_STRICT_EDEFAULT;
-			case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE :
-				return basicGetApplyingPackage() != null;
+		case UMLPackage.PROFILE_APPLICATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PROFILE_APPLICATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PROFILE_APPLICATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PROFILE_APPLICATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.PROFILE_APPLICATION__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.PROFILE_APPLICATION__SOURCE:
+			return isSetSources();
+		case UMLPackage.PROFILE_APPLICATION__TARGET:
+			return isSetTargets();
+		case UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE:
+			return basicGetAppliedProfile() != null;
+		case UMLPackage.PROFILE_APPLICATION__IS_STRICT:
+			return isStrict() != IS_STRICT_EDEFAULT;
+		case UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE:
+			return basicGetApplyingPackage() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -481,94 +434,86 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.PROFILE_APPLICATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROFILE_APPLICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROFILE_APPLICATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.PROFILE_APPLICATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.PROFILE_APPLICATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.PROFILE_APPLICATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.PROFILE_APPLICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PROFILE_APPLICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.PROFILE_APPLICATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.PROFILE_APPLICATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.PROFILE_APPLICATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.PROFILE_APPLICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.PROFILE_APPLICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.PROFILE_APPLICATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.PROFILE_APPLICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PROFILE_APPLICATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PROFILE_APPLICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.PROFILE_APPLICATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PROFILE_APPLICATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.PROFILE_APPLICATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.PROFILE_APPLICATION___GET_APPLIED_DEFINITION :
-				return getAppliedDefinition();
-			case UMLPackage.PROFILE_APPLICATION___GET_APPLIED_DEFINITION__NAMEDELEMENT :
-				return getAppliedDefinition((NamedElement) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROFILE_APPLICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROFILE_APPLICATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.PROFILE_APPLICATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.PROFILE_APPLICATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.PROFILE_APPLICATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.PROFILE_APPLICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PROFILE_APPLICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.PROFILE_APPLICATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.PROFILE_APPLICATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.PROFILE_APPLICATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.PROFILE_APPLICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.PROFILE_APPLICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.PROFILE_APPLICATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.PROFILE_APPLICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PROFILE_APPLICATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PROFILE_APPLICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.PROFILE_APPLICATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PROFILE_APPLICATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.PROFILE_APPLICATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.PROFILE_APPLICATION___GET_APPLIED_DEFINITION:
+			return getAppliedDefinition();
+		case UMLPackage.PROFILE_APPLICATION___GET_APPLIED_DEFINITION__NAMEDELEMENT:
+			return getAppliedDefinition((NamedElement) arguments.get(0));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -581,8 +526,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] TARGET_ESUBSETS = new int[]{
-		UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE};
+	protected static final int[] TARGET_ESUBSETS = new int[] { UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -592,7 +536,7 @@
 	@Override
 	public boolean isSetTargets() {
 		return super.isSetTargets()
-			|| eIsSet(UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE);
+				|| eIsSet(UMLPackage.PROFILE_APPLICATION__APPLIED_PROFILE);
 	}
 
 	/**
@@ -603,8 +547,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SOURCE_ESUBSETS = new int[]{
-		UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE};
+	protected static final int[] SOURCE_ESUBSETS = new int[] { UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -614,9 +557,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -627,7 +568,7 @@
 	@Override
 	public boolean isSetSources() {
 		return super.isSetSources()
-			|| eIsSet(UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE);
+				|| eIsSet(UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE);
 	}
 
 	/**
@@ -652,7 +593,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE);
+				|| eIsSet(UMLPackage.PROFILE_APPLICATION__APPLYING_PACKAGE);
 	}
 
 } //ProfileApplicationImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProfileImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProfileImpl.java
index 2cb4866..b1ac69d 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProfileImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProfileImpl.java
@@ -1,25 +1,29 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.NotificationChain;
+
 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.ENamedElement;
@@ -27,10 +31,13 @@
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectContainmentWithInverseEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectResolvingEList;
+
 import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Constraint;
@@ -53,6 +60,7 @@
 import org.eclipse.uml2.uml.Type;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.VisibilityKind;
+
 import org.eclipse.uml2.uml.internal.operations.ProfileOperations;
 
 /**
@@ -94,17 +102,9 @@
 		return UMLPackage.Literals.PROFILE;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.NAMESPACE__ELEMENT_IMPORT) {
 			return createElementImportsList();
 		}
@@ -132,16 +132,14 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<ElementImport> getElementImports() {
-		return (EList<ElementImport>) eDynamicGet(
-			UMLPackage.PROFILE__ELEMENT_IMPORT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMESPACE__ELEMENT_IMPORT, true, true);
+		return (EList<ElementImport>) eDynamicGet(UMLPackage.PROFILE__ELEMENT_IMPORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMESPACE__ELEMENT_IMPORT, true, true);
 	}
 
 	private EList<ElementImport> createElementImportsList() {
 		return new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<ElementImport>(
-			ElementImport.class, this, UMLPackage.PROFILE__ELEMENT_IMPORT, null,
-			ELEMENT_IMPORT_ESUBSETS,
-			UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE);
+				ElementImport.class, this, UMLPackage.PROFILE__ELEMENT_IMPORT, null,
+				ELEMENT_IMPORT_ESUBSETS,
+				UMLPackage.ELEMENT_IMPORT__IMPORTING_NAMESPACE);
 	}
 
 	/**
@@ -152,8 +150,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] ELEMENT_IMPORT_ESUBSETS = new int[]{
-		UMLPackage.PROFILE__METACLASS_REFERENCE};
+	protected static final int[] ELEMENT_IMPORT_ESUBSETS = new int[] { UMLPackage.PROFILE__METACLASS_REFERENCE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -163,16 +160,14 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<PackageImport> getPackageImports() {
-		return (EList<PackageImport>) eDynamicGet(
-			UMLPackage.PROFILE__PACKAGE_IMPORT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMESPACE__PACKAGE_IMPORT, true, true);
+		return (EList<PackageImport>) eDynamicGet(UMLPackage.PROFILE__PACKAGE_IMPORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMESPACE__PACKAGE_IMPORT, true, true);
 	}
 
 	private EList<PackageImport> createPackageImportsList() {
 		return new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<PackageImport>(
-			PackageImport.class, this, UMLPackage.PROFILE__PACKAGE_IMPORT, null,
-			PACKAGE_IMPORT_ESUBSETS,
-			UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE);
+				PackageImport.class, this, UMLPackage.PROFILE__PACKAGE_IMPORT, null,
+				PACKAGE_IMPORT_ESUBSETS,
+				UMLPackage.PACKAGE_IMPORT__IMPORTING_NAMESPACE);
 	}
 
 	/**
@@ -183,8 +178,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] PACKAGE_IMPORT_ESUBSETS = new int[]{
-		UMLPackage.PROFILE__METAMODEL_REFERENCE};
+	protected static final int[] PACKAGE_IMPORT_ESUBSETS = new int[] { UMLPackage.PROFILE__METAMODEL_REFERENCE };
 
 	/**
 	 * The array of superset feature identifiers for the '{@link #getMetaclassReferences() <em>Metaclass Reference</em>}' reference list.
@@ -194,8 +188,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] METACLASS_REFERENCE_ESUPERSETS = new int[]{
-		UMLPackage.PROFILE__ELEMENT_IMPORT};
+	protected static final int[] METACLASS_REFERENCE_ESUPERSETS = new int[] { UMLPackage.PROFILE__ELEMENT_IMPORT };
 
 	/**
 	 * The array of superset feature identifiers for the '{@link #getMetamodelReferences() <em>Metamodel Reference</em>}' reference list.
@@ -205,8 +198,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] METAMODEL_REFERENCE_ESUPERSETS = new int[]{
-		UMLPackage.PROFILE__PACKAGE_IMPORT};
+	protected static final int[] METAMODEL_REFERENCE_ESUPERSETS = new int[] { UMLPackage.PROFILE__PACKAGE_IMPORT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -215,15 +207,13 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ElementImport> getMetaclassReferences() {
-		return (EList<ElementImport>) eDynamicGet(
-			UMLPackage.PROFILE__METACLASS_REFERENCE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROFILE__METACLASS_REFERENCE, true, true);
+		return (EList<ElementImport>) eDynamicGet(UMLPackage.PROFILE__METACLASS_REFERENCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROFILE__METACLASS_REFERENCE, true, true);
 	}
 
 	private EList<ElementImport> createMetaclassReferencesList() {
 		return new SubsetSupersetEObjectResolvingEList<ElementImport>(
-			ElementImport.class, this, UMLPackage.PROFILE__METACLASS_REFERENCE,
-			METACLASS_REFERENCE_ESUPERSETS, null);
+				ElementImport.class, this, UMLPackage.PROFILE__METACLASS_REFERENCE,
+				METACLASS_REFERENCE_ESUPERSETS, null);
 	}
 
 	/**
@@ -233,8 +223,7 @@
 	 */
 	public ElementImport createMetaclassReference(
 			PackageableElement importedElement) {
-		ElementImport newMetaclassReference = (ElementImport) create(
-			UMLPackage.Literals.ELEMENT_IMPORT);
+		ElementImport newMetaclassReference = (ElementImport) create(UMLPackage.Literals.ELEMENT_IMPORT);
 		getMetaclassReferences().add(newMetaclassReference);
 		if (importedElement != null)
 			newMetaclassReference.setImportedElement(importedElement);
@@ -258,15 +247,12 @@
 	 */
 	public ElementImport getMetaclassReference(
 			PackageableElement importedElement, boolean createOnDemand) {
-		metaclassReferenceLoop : for (ElementImport metaclassReference : getMetaclassReferences()) {
-			if (importedElement != null && !importedElement
-				.equals(metaclassReference.getImportedElement()))
+		metaclassReferenceLoop: for (ElementImport metaclassReference : getMetaclassReferences()) {
+			if (importedElement != null && !importedElement.equals(metaclassReference.getImportedElement()))
 				continue metaclassReferenceLoop;
 			return metaclassReference;
 		}
-		return createOnDemand
-			? createMetaclassReference(importedElement)
-			: null;
+		return createOnDemand ? createMetaclassReference(importedElement) : null;
 	}
 
 	/**
@@ -276,15 +262,13 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<PackageImport> getMetamodelReferences() {
-		return (EList<PackageImport>) eDynamicGet(
-			UMLPackage.PROFILE__METAMODEL_REFERENCE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROFILE__METAMODEL_REFERENCE, true, true);
+		return (EList<PackageImport>) eDynamicGet(UMLPackage.PROFILE__METAMODEL_REFERENCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROFILE__METAMODEL_REFERENCE, true, true);
 	}
 
 	private EList<PackageImport> createMetamodelReferencesList() {
 		return new SubsetSupersetEObjectResolvingEList<PackageImport>(
-			PackageImport.class, this, UMLPackage.PROFILE__METAMODEL_REFERENCE,
-			METAMODEL_REFERENCE_ESUPERSETS, null);
+				PackageImport.class, this, UMLPackage.PROFILE__METAMODEL_REFERENCE,
+				METAMODEL_REFERENCE_ESUPERSETS, null);
 	}
 
 	/**
@@ -294,8 +278,7 @@
 	 */
 	public PackageImport createMetamodelReference(
 			org.eclipse.uml2.uml.Package importedPackage) {
-		PackageImport newMetamodelReference = (PackageImport) create(
-			UMLPackage.Literals.PACKAGE_IMPORT);
+		PackageImport newMetamodelReference = (PackageImport) create(UMLPackage.Literals.PACKAGE_IMPORT);
 		getMetamodelReferences().add(newMetamodelReference);
 		if (importedPackage != null)
 			newMetamodelReference.setImportedPackage(importedPackage);
@@ -320,15 +303,12 @@
 	public PackageImport getMetamodelReference(
 			org.eclipse.uml2.uml.Package importedPackage,
 			boolean createOnDemand) {
-		metamodelReferenceLoop : for (PackageImport metamodelReference : getMetamodelReferences()) {
-			if (importedPackage != null && !importedPackage
-				.equals(metamodelReference.getImportedPackage()))
+		metamodelReferenceLoop: for (PackageImport metamodelReference : getMetamodelReferences()) {
+			if (importedPackage != null && !importedPackage.equals(metamodelReference.getImportedPackage()))
 				continue metamodelReferenceLoop;
 			return metamodelReference;
 		}
-		return createOnDemand
-			? createMetamodelReference(importedPackage)
-			: null;
+		return createOnDemand ? createMetamodelReference(importedPackage) : null;
 	}
 
 	/**
@@ -338,8 +318,7 @@
 	 */
 	public boolean validateMetaclassReferenceNotSpecialized(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return ProfileOperations.validateMetaclassReferenceNotSpecialized(this,
-			diagnostics, context);
+		return ProfileOperations.validateMetaclassReferenceNotSpecialized(this, diagnostics, context);
 	}
 
 	/**
@@ -349,8 +328,7 @@
 	 */
 	public boolean validateReferencesSameMetamodel(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ProfileOperations.validateReferencesSameMetamodel(this,
-			diagnostics, context);
+		return ProfileOperations.validateReferencesSameMetamodel(this, diagnostics, context);
 	}
 
 	/**
@@ -418,13 +396,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<org.eclipse.uml2.uml.Class> result = (EList<org.eclipse.uml2.uml.Class>) cache
-				.get(this,
-					UMLPackage.Literals.PROFILE___GET_REFERENCED_METACLASSES);
+			EList<org.eclipse.uml2.uml.Class> result = (EList<org.eclipse.uml2.uml.Class>) cache.get(this, UMLPackage.Literals.PROFILE___GET_REFERENCED_METACLASSES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.PROFILE___GET_REFERENCED_METACLASSES,
-					result = ProfileOperations.getReferencedMetaclasses(this));
+				cache.put(this, UMLPackage.Literals.PROFILE___GET_REFERENCED_METACLASSES, result = ProfileOperations.getReferencedMetaclasses(this));
 			}
 			return result;
 		}
@@ -440,12 +414,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Model> result = (EList<Model>) cache.get(this,
-				UMLPackage.Literals.PROFILE___GET_REFERENCED_METAMODELS);
+			EList<Model> result = (EList<Model>) cache.get(this, UMLPackage.Literals.PROFILE___GET_REFERENCED_METAMODELS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.PROFILE___GET_REFERENCED_METAMODELS,
-					result = ProfileOperations.getReferencedMetamodels(this));
+				cache.put(this, UMLPackage.Literals.PROFILE___GET_REFERENCED_METAMODELS, result = ProfileOperations.getReferencedMetamodels(this));
 			}
 			return result;
 		}
@@ -471,51 +442,34 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PROFILE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROFILE__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROFILE__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROFILE__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROFILE__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.PROFILE__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.PROFILE__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this,
-							EOPPOSITE_FEATURE_BASE
-								- UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.PROFILE__PACKAGE_MERGE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageMerges())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROFILE__PROFILE_APPLICATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getProfileApplications())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.PROFILE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROFILE__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROFILE__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROFILE__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROFILE__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.PROFILE__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.PROFILE__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.PROFILE__PACKAGE_MERGE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageMerges()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROFILE__PROFILE_APPLICATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getProfileApplications()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -529,41 +483,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PROFILE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROFILE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROFILE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.PROFILE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROFILE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROFILE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.PROFILE__PACKAGE_MERGE :
-				return ((InternalEList<?>) getPackageMerges())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROFILE__PACKAGED_ELEMENT :
-				return ((InternalEList<?>) getPackagedElements())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROFILE__PROFILE_APPLICATION :
-				return ((InternalEList<?>) getProfileApplications())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.PROFILE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROFILE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROFILE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.PROFILE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROFILE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROFILE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.PROFILE__PACKAGE_MERGE:
+			return ((InternalEList<?>) getPackageMerges()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROFILE__PACKAGED_ELEMENT:
+			return ((InternalEList<?>) getPackagedElements()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROFILE__PROFILE_APPLICATION:
+			return ((InternalEList<?>) getProfileApplications()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -576,80 +521,80 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PROFILE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PROFILE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PROFILE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PROFILE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PROFILE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.PROFILE__NAME :
-				return getName();
-			case UMLPackage.PROFILE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.PROFILE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.PROFILE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PROFILE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.PROFILE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.PROFILE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.PROFILE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.PROFILE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.PROFILE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.PROFILE__MEMBER :
-				return getMembers();
-			case UMLPackage.PROFILE__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.PROFILE__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.PROFILE__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.PROFILE__URI :
-				return getURI();
-			case UMLPackage.PROFILE__NESTED_PACKAGE :
-				return getNestedPackages();
-			case UMLPackage.PROFILE__NESTING_PACKAGE :
-				if (resolve)
-					return getNestingPackage();
-				return basicGetNestingPackage();
-			case UMLPackage.PROFILE__OWNED_STEREOTYPE :
-				return getOwnedStereotypes();
-			case UMLPackage.PROFILE__OWNED_TYPE :
-				return getOwnedTypes();
-			case UMLPackage.PROFILE__PACKAGE_MERGE :
-				return getPackageMerges();
-			case UMLPackage.PROFILE__PACKAGED_ELEMENT :
-				return getPackagedElements();
-			case UMLPackage.PROFILE__PROFILE_APPLICATION :
-				return getProfileApplications();
-			case UMLPackage.PROFILE__METACLASS_REFERENCE :
-				return getMetaclassReferences();
-			case UMLPackage.PROFILE__METAMODEL_REFERENCE :
-				return getMetamodelReferences();
+		case UMLPackage.PROFILE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PROFILE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PROFILE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PROFILE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PROFILE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.PROFILE__NAME:
+			return getName();
+		case UMLPackage.PROFILE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.PROFILE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.PROFILE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PROFILE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.PROFILE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.PROFILE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.PROFILE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.PROFILE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.PROFILE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.PROFILE__MEMBER:
+			return getMembers();
+		case UMLPackage.PROFILE__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.PROFILE__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.PROFILE__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.PROFILE__URI:
+			return getURI();
+		case UMLPackage.PROFILE__NESTED_PACKAGE:
+			return getNestedPackages();
+		case UMLPackage.PROFILE__NESTING_PACKAGE:
+			if (resolve)
+				return getNestingPackage();
+			return basicGetNestingPackage();
+		case UMLPackage.PROFILE__OWNED_STEREOTYPE:
+			return getOwnedStereotypes();
+		case UMLPackage.PROFILE__OWNED_TYPE:
+			return getOwnedTypes();
+		case UMLPackage.PROFILE__PACKAGE_MERGE:
+			return getPackageMerges();
+		case UMLPackage.PROFILE__PACKAGED_ELEMENT:
+			return getPackagedElements();
+		case UMLPackage.PROFILE__PROFILE_APPLICATION:
+			return getProfileApplications();
+		case UMLPackage.PROFILE__METACLASS_REFERENCE:
+			return getMetaclassReferences();
+		case UMLPackage.PROFILE__METAMODEL_REFERENCE:
+			return getMetamodelReferences();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -663,94 +608,82 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PROFILE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PROFILE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PROFILE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.PROFILE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.PROFILE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.PROFILE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.PROFILE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.PROFILE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.PROFILE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.PROFILE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.PROFILE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.PROFILE__URI :
-				setURI((String) newValue);
-				return;
-			case UMLPackage.PROFILE__NESTED_PACKAGE :
-				getNestedPackages().clear();
-				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__OWNED_TYPE :
-				getOwnedTypes().clear();
-				getOwnedTypes().addAll((Collection<? extends Type>) newValue);
-				return;
-			case UMLPackage.PROFILE__PACKAGE_MERGE :
-				getPackageMerges().clear();
-				getPackageMerges()
-					.addAll((Collection<? extends PackageMerge>) newValue);
-				return;
-			case UMLPackage.PROFILE__PACKAGED_ELEMENT :
-				getPackagedElements().clear();
-				getPackagedElements().addAll(
-					(Collection<? extends PackageableElement>) newValue);
-				return;
-			case UMLPackage.PROFILE__PROFILE_APPLICATION :
-				getProfileApplications().clear();
-				getProfileApplications().addAll(
-					(Collection<? extends ProfileApplication>) newValue);
-				return;
-			case UMLPackage.PROFILE__METACLASS_REFERENCE :
-				getMetaclassReferences().clear();
-				getMetaclassReferences()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.PROFILE__METAMODEL_REFERENCE :
-				getMetamodelReferences().clear();
-				getMetamodelReferences()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
+		case UMLPackage.PROFILE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PROFILE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PROFILE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.PROFILE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.PROFILE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.PROFILE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.PROFILE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.PROFILE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.PROFILE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.PROFILE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.PROFILE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.PROFILE__URI:
+			setURI((String) newValue);
+			return;
+		case UMLPackage.PROFILE__NESTED_PACKAGE:
+			getNestedPackages().clear();
+			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__OWNED_TYPE:
+			getOwnedTypes().clear();
+			getOwnedTypes().addAll((Collection<? extends Type>) newValue);
+			return;
+		case UMLPackage.PROFILE__PACKAGE_MERGE:
+			getPackageMerges().clear();
+			getPackageMerges().addAll((Collection<? extends PackageMerge>) newValue);
+			return;
+		case UMLPackage.PROFILE__PACKAGED_ELEMENT:
+			getPackagedElements().clear();
+			getPackagedElements().addAll((Collection<? extends PackageableElement>) newValue);
+			return;
+		case UMLPackage.PROFILE__PROFILE_APPLICATION:
+			getProfileApplications().clear();
+			getProfileApplications().addAll((Collection<? extends ProfileApplication>) newValue);
+			return;
+		case UMLPackage.PROFILE__METACLASS_REFERENCE:
+			getMetaclassReferences().clear();
+			getMetaclassReferences().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.PROFILE__METAMODEL_REFERENCE:
+			getMetamodelReferences().clear();
+			getMetamodelReferences().addAll((Collection<? extends PackageImport>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -763,69 +696,69 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PROFILE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PROFILE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PROFILE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.PROFILE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.PROFILE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.PROFILE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.PROFILE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.PROFILE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.PROFILE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.PROFILE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.PROFILE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.PROFILE__URI :
-				setURI(URI_EDEFAULT);
-				return;
-			case UMLPackage.PROFILE__NESTED_PACKAGE :
-				getNestedPackages().clear();
-				return;
-			case UMLPackage.PROFILE__NESTING_PACKAGE :
-				setNestingPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.PROFILE__OWNED_TYPE :
-				getOwnedTypes().clear();
-				return;
-			case UMLPackage.PROFILE__PACKAGE_MERGE :
-				getPackageMerges().clear();
-				return;
-			case UMLPackage.PROFILE__PACKAGED_ELEMENT :
-				getPackagedElements().clear();
-				return;
-			case UMLPackage.PROFILE__PROFILE_APPLICATION :
-				getProfileApplications().clear();
-				return;
-			case UMLPackage.PROFILE__METACLASS_REFERENCE :
-				getMetaclassReferences().clear();
-				return;
-			case UMLPackage.PROFILE__METAMODEL_REFERENCE :
-				getMetamodelReferences().clear();
-				return;
+		case UMLPackage.PROFILE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PROFILE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PROFILE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.PROFILE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.PROFILE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.PROFILE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.PROFILE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.PROFILE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.PROFILE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.PROFILE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.PROFILE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.PROFILE__URI:
+			setURI(URI_EDEFAULT);
+			return;
+		case UMLPackage.PROFILE__NESTED_PACKAGE:
+			getNestedPackages().clear();
+			return;
+		case UMLPackage.PROFILE__NESTING_PACKAGE:
+			setNestingPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.PROFILE__OWNED_TYPE:
+			getOwnedTypes().clear();
+			return;
+		case UMLPackage.PROFILE__PACKAGE_MERGE:
+			getPackageMerges().clear();
+			return;
+		case UMLPackage.PROFILE__PACKAGED_ELEMENT:
+			getPackagedElements().clear();
+			return;
+		case UMLPackage.PROFILE__PROFILE_APPLICATION:
+			getProfileApplications().clear();
+			return;
+		case UMLPackage.PROFILE__METACLASS_REFERENCE:
+			getMetaclassReferences().clear();
+			return;
+		case UMLPackage.PROFILE__METAMODEL_REFERENCE:
+			getMetamodelReferences().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -838,70 +771,66 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PROFILE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PROFILE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PROFILE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PROFILE__OWNER :
-				return isSetOwner();
-			case UMLPackage.PROFILE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.PROFILE__NAME :
-				return isSetName();
-			case UMLPackage.PROFILE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.PROFILE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.PROFILE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.PROFILE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.PROFILE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.PROFILE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.PROFILE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.PROFILE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.PROFILE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.PROFILE__MEMBER :
-				return isSetMembers();
-			case UMLPackage.PROFILE__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.PROFILE__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.PROFILE__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE :
-				return basicGetOwnedTemplateSignature() != null;
-			case UMLPackage.PROFILE__URI :
-				return URI_EDEFAULT == null
-					? getURI() != null
-					: !URI_EDEFAULT.equals(getURI());
-			case UMLPackage.PROFILE__NESTED_PACKAGE :
-				return !getNestedPackages().isEmpty();
-			case UMLPackage.PROFILE__NESTING_PACKAGE :
-				return basicGetNestingPackage() != null;
-			case UMLPackage.PROFILE__OWNED_STEREOTYPE :
-				return !getOwnedStereotypes().isEmpty();
-			case UMLPackage.PROFILE__OWNED_TYPE :
-				return !getOwnedTypes().isEmpty();
-			case UMLPackage.PROFILE__PACKAGE_MERGE :
-				return !getPackageMerges().isEmpty();
-			case UMLPackage.PROFILE__PACKAGED_ELEMENT :
-				return !getPackagedElements().isEmpty();
-			case UMLPackage.PROFILE__PROFILE_APPLICATION :
-				return !getProfileApplications().isEmpty();
-			case UMLPackage.PROFILE__METACLASS_REFERENCE :
-				return !getMetaclassReferences().isEmpty();
-			case UMLPackage.PROFILE__METAMODEL_REFERENCE :
-				return !getMetamodelReferences().isEmpty();
+		case UMLPackage.PROFILE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PROFILE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PROFILE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PROFILE__OWNER:
+			return isSetOwner();
+		case UMLPackage.PROFILE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.PROFILE__NAME:
+			return isSetName();
+		case UMLPackage.PROFILE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.PROFILE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.PROFILE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.PROFILE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.PROFILE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.PROFILE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.PROFILE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.PROFILE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.PROFILE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.PROFILE__MEMBER:
+			return isSetMembers();
+		case UMLPackage.PROFILE__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.PROFILE__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.PROFILE__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.PROFILE__OWNED_TEMPLATE_SIGNATURE:
+			return basicGetOwnedTemplateSignature() != null;
+		case UMLPackage.PROFILE__URI:
+			return URI_EDEFAULT == null ? getURI() != null : !URI_EDEFAULT.equals(getURI());
+		case UMLPackage.PROFILE__NESTED_PACKAGE:
+			return !getNestedPackages().isEmpty();
+		case UMLPackage.PROFILE__NESTING_PACKAGE:
+			return basicGetNestingPackage() != null;
+		case UMLPackage.PROFILE__OWNED_STEREOTYPE:
+			return !getOwnedStereotypes().isEmpty();
+		case UMLPackage.PROFILE__OWNED_TYPE:
+			return !getOwnedTypes().isEmpty();
+		case UMLPackage.PROFILE__PACKAGE_MERGE:
+			return !getPackageMerges().isEmpty();
+		case UMLPackage.PROFILE__PACKAGED_ELEMENT:
+			return !getPackagedElements().isEmpty();
+		case UMLPackage.PROFILE__PROFILE_APPLICATION:
+			return !getProfileApplications().isEmpty();
+		case UMLPackage.PROFILE__METACLASS_REFERENCE:
+			return !getMetaclassReferences().isEmpty();
+		case UMLPackage.PROFILE__METAMODEL_REFERENCE:
+			return !getMetamodelReferences().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -916,260 +845,218 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.PROFILE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.PROFILE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROFILE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROFILE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.PROFILE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PROFILE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.PROFILE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.PROFILE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.PROFILE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.PROFILE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.PROFILE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.PROFILE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.PROFILE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PROFILE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.PROFILE___GET_MODEL :
-				return getModel();
-			case UMLPackage.PROFILE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.PROFILE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.PROFILE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.PROFILE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.PROFILE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.PROFILE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.PROFILE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PROFILE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.PROFILE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.PROFILE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.PROFILE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PROFILE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PROFILE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.PROFILE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PROFILE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.PROFILE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.PROFILE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.PROFILE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.PROFILE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.PROFILE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PROFILE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.PROFILE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.PROFILE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROFILE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROFILE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROFILE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.PROFILE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.PROFILE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.PROFILE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.PROFILE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.PROFILE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.PROFILE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.PROFILE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.PROFILE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PROFILE___SEPARATOR :
-				return separator();
-			case UMLPackage.PROFILE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.PROFILE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROFILE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROFILE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROFILE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.PROFILE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.PROFILE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.PROFILE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.PROFILE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.PROFILE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.PROFILE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.PROFILE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.PROFILE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.PROFILE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.PROFILE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.PROFILE___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.PROFILE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROFILE___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.PROFILE___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.PROFILE___VALIDATE_ELEMENTS_PUBLIC_OR_PRIVATE__DIAGNOSTICCHAIN_MAP :
-				return validateElementsPublicOrPrivate(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROFILE___APPLY_PROFILE__PROFILE :
-				return applyProfile((Profile) arguments.get(0));
-			case UMLPackage.PROFILE___CREATE_OWNED_CLASS__STRING_BOOLEAN :
-				return createOwnedClass((String) arguments.get(0),
-					(Boolean) arguments.get(1));
-			case UMLPackage.PROFILE___CREATE_OWNED_ENUMERATION__STRING :
-				return createOwnedEnumeration((String) arguments.get(0));
-			case UMLPackage.PROFILE___CREATE_OWNED_INTERFACE__STRING :
-				return createOwnedInterface((String) arguments.get(0));
-			case UMLPackage.PROFILE___CREATE_OWNED_PRIMITIVE_TYPE__STRING :
-				return createOwnedPrimitiveType((String) arguments.get(0));
-			case UMLPackage.PROFILE___CREATE_OWNED_STEREOTYPE__STRING_BOOLEAN :
-				return createOwnedStereotype((String) arguments.get(0),
-					(Boolean) arguments.get(1));
-			case UMLPackage.PROFILE___GET_ALL_APPLIED_PROFILES :
-				return getAllAppliedProfiles();
-			case UMLPackage.PROFILE___GET_ALL_PROFILE_APPLICATIONS :
-				return getAllProfileApplications();
-			case UMLPackage.PROFILE___GET_APPLIED_PROFILE__STRING :
-				return getAppliedProfile((String) arguments.get(0));
-			case UMLPackage.PROFILE___GET_APPLIED_PROFILE__STRING_BOOLEAN :
-				return getAppliedProfile((String) arguments.get(0),
-					(Boolean) arguments.get(1));
-			case UMLPackage.PROFILE___GET_APPLIED_PROFILES :
-				return getAppliedProfiles();
-			case UMLPackage.PROFILE___GET_PROFILE_APPLICATION__PROFILE :
-				return getProfileApplication((Profile) arguments.get(0));
-			case UMLPackage.PROFILE___GET_PROFILE_APPLICATION__PROFILE_BOOLEAN :
-				return getProfileApplication((Profile) arguments.get(0),
-					(Boolean) arguments.get(1));
-			case UMLPackage.PROFILE___IS_MODEL_LIBRARY :
-				return isModelLibrary();
-			case UMLPackage.PROFILE___IS_PROFILE_APPLIED__PROFILE :
-				return isProfileApplied((Profile) arguments.get(0));
-			case UMLPackage.PROFILE___UNAPPLY_PROFILE__PROFILE :
-				return unapplyProfile((Profile) arguments.get(0));
-			case UMLPackage.PROFILE___APPLY_PROFILES__ELIST :
-				return applyProfiles((EList<Profile>) arguments.get(0));
-			case UMLPackage.PROFILE___ALL_APPLICABLE_STEREOTYPES :
-				return allApplicableStereotypes();
-			case UMLPackage.PROFILE___CONTAINING_PROFILE :
-				return containingProfile();
-			case UMLPackage.PROFILE___MAKES_VISIBLE__NAMEDELEMENT :
-				return makesVisible((NamedElement) arguments.get(0));
-			case UMLPackage.PROFILE___GET_NESTED_PACKAGES :
-				return getNestedPackages();
-			case UMLPackage.PROFILE___GET_OWNED_STEREOTYPES :
-				return getOwnedStereotypes();
-			case UMLPackage.PROFILE___GET_OWNED_TYPES :
-				return getOwnedTypes();
-			case UMLPackage.PROFILE___VISIBLE_MEMBERS :
-				return visibleMembers();
-			case UMLPackage.PROFILE___VALIDATE_METACLASS_REFERENCE_NOT_SPECIALIZED__DIAGNOSTICCHAIN_MAP :
-				return validateMetaclassReferenceNotSpecialized(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROFILE___VALIDATE_REFERENCES_SAME_METAMODEL__DIAGNOSTICCHAIN_MAP :
-				return validateReferencesSameMetamodel(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROFILE___CREATE__CLASSIFIER :
-				return create((Classifier) arguments.get(0));
-			case UMLPackage.PROFILE___DEFINE :
-				return define();
-			case UMLPackage.PROFILE___DEFINE__MAP_DIAGNOSTICCHAIN_MAP :
-				return define((Map<String, String>) arguments.get(0),
-					(DiagnosticChain) arguments.get(1),
-					(Map<Object, Object>) arguments.get(2));
-			case UMLPackage.PROFILE___GET_DEFINITION :
-				return getDefinition();
-			case UMLPackage.PROFILE___GET_DEFINITION__NAMEDELEMENT :
-				return getDefinition((NamedElement) arguments.get(0));
-			case UMLPackage.PROFILE___GET_OWNED_EXTENSIONS__BOOLEAN :
-				return getOwnedExtensions((Boolean) arguments.get(0));
-			case UMLPackage.PROFILE___GET_REFERENCED_METACLASSES :
-				return getReferencedMetaclasses();
-			case UMLPackage.PROFILE___GET_REFERENCED_METAMODELS :
-				return getReferencedMetamodels();
-			case UMLPackage.PROFILE___IS_DEFINED :
-				return isDefined();
+		case UMLPackage.PROFILE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.PROFILE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROFILE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROFILE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.PROFILE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PROFILE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.PROFILE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.PROFILE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.PROFILE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.PROFILE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.PROFILE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.PROFILE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.PROFILE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PROFILE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.PROFILE___GET_MODEL:
+			return getModel();
+		case UMLPackage.PROFILE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.PROFILE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.PROFILE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.PROFILE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.PROFILE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.PROFILE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.PROFILE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PROFILE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.PROFILE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.PROFILE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.PROFILE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PROFILE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PROFILE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.PROFILE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PROFILE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.PROFILE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.PROFILE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.PROFILE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.PROFILE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.PROFILE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PROFILE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.PROFILE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.PROFILE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROFILE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROFILE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROFILE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.PROFILE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.PROFILE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.PROFILE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.PROFILE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.PROFILE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.PROFILE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.PROFILE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.PROFILE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PROFILE___SEPARATOR:
+			return separator();
+		case UMLPackage.PROFILE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.PROFILE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROFILE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROFILE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROFILE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.PROFILE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.PROFILE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.PROFILE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.PROFILE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.PROFILE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.PROFILE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.PROFILE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.PROFILE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.PROFILE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.PROFILE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.PROFILE___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.PROFILE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROFILE___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.PROFILE___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.PROFILE___VALIDATE_ELEMENTS_PUBLIC_OR_PRIVATE__DIAGNOSTICCHAIN_MAP:
+			return validateElementsPublicOrPrivate((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROFILE___APPLY_PROFILE__PROFILE:
+			return applyProfile((Profile) arguments.get(0));
+		case UMLPackage.PROFILE___CREATE_OWNED_CLASS__STRING_BOOLEAN:
+			return createOwnedClass((String) arguments.get(0), (Boolean) arguments.get(1));
+		case UMLPackage.PROFILE___CREATE_OWNED_ENUMERATION__STRING:
+			return createOwnedEnumeration((String) arguments.get(0));
+		case UMLPackage.PROFILE___CREATE_OWNED_INTERFACE__STRING:
+			return createOwnedInterface((String) arguments.get(0));
+		case UMLPackage.PROFILE___CREATE_OWNED_PRIMITIVE_TYPE__STRING:
+			return createOwnedPrimitiveType((String) arguments.get(0));
+		case UMLPackage.PROFILE___CREATE_OWNED_STEREOTYPE__STRING_BOOLEAN:
+			return createOwnedStereotype((String) arguments.get(0), (Boolean) arguments.get(1));
+		case UMLPackage.PROFILE___GET_ALL_APPLIED_PROFILES:
+			return getAllAppliedProfiles();
+		case UMLPackage.PROFILE___GET_ALL_PROFILE_APPLICATIONS:
+			return getAllProfileApplications();
+		case UMLPackage.PROFILE___GET_APPLIED_PROFILE__STRING:
+			return getAppliedProfile((String) arguments.get(0));
+		case UMLPackage.PROFILE___GET_APPLIED_PROFILE__STRING_BOOLEAN:
+			return getAppliedProfile((String) arguments.get(0), (Boolean) arguments.get(1));
+		case UMLPackage.PROFILE___GET_APPLIED_PROFILES:
+			return getAppliedProfiles();
+		case UMLPackage.PROFILE___GET_PROFILE_APPLICATION__PROFILE:
+			return getProfileApplication((Profile) arguments.get(0));
+		case UMLPackage.PROFILE___GET_PROFILE_APPLICATION__PROFILE_BOOLEAN:
+			return getProfileApplication((Profile) arguments.get(0), (Boolean) arguments.get(1));
+		case UMLPackage.PROFILE___IS_MODEL_LIBRARY:
+			return isModelLibrary();
+		case UMLPackage.PROFILE___IS_PROFILE_APPLIED__PROFILE:
+			return isProfileApplied((Profile) arguments.get(0));
+		case UMLPackage.PROFILE___UNAPPLY_PROFILE__PROFILE:
+			return unapplyProfile((Profile) arguments.get(0));
+		case UMLPackage.PROFILE___APPLY_PROFILES__ELIST:
+			return applyProfiles((EList<Profile>) arguments.get(0));
+		case UMLPackage.PROFILE___ALL_APPLICABLE_STEREOTYPES:
+			return allApplicableStereotypes();
+		case UMLPackage.PROFILE___CONTAINING_PROFILE:
+			return containingProfile();
+		case UMLPackage.PROFILE___MAKES_VISIBLE__NAMEDELEMENT:
+			return makesVisible((NamedElement) arguments.get(0));
+		case UMLPackage.PROFILE___GET_NESTED_PACKAGES:
+			return getNestedPackages();
+		case UMLPackage.PROFILE___GET_OWNED_STEREOTYPES:
+			return getOwnedStereotypes();
+		case UMLPackage.PROFILE___GET_OWNED_TYPES:
+			return getOwnedTypes();
+		case UMLPackage.PROFILE___VISIBLE_MEMBERS:
+			return visibleMembers();
+		case UMLPackage.PROFILE___VALIDATE_METACLASS_REFERENCE_NOT_SPECIALIZED__DIAGNOSTICCHAIN_MAP:
+			return validateMetaclassReferenceNotSpecialized((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROFILE___VALIDATE_REFERENCES_SAME_METAMODEL__DIAGNOSTICCHAIN_MAP:
+			return validateReferencesSameMetamodel((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROFILE___CREATE__CLASSIFIER:
+			return create((Classifier) arguments.get(0));
+		case UMLPackage.PROFILE___DEFINE:
+			return define();
+		case UMLPackage.PROFILE___DEFINE__MAP_DIAGNOSTICCHAIN_MAP:
+			return define((Map<String, String>) arguments.get(0), (DiagnosticChain) arguments.get(1), (Map<Object, Object>) arguments.get(2));
+		case UMLPackage.PROFILE___GET_DEFINITION:
+			return getDefinition();
+		case UMLPackage.PROFILE___GET_DEFINITION__NAMEDELEMENT:
+			return getDefinition((NamedElement) arguments.get(0));
+		case UMLPackage.PROFILE___GET_OWNED_EXTENSIONS__BOOLEAN:
+			return getOwnedExtensions((Boolean) arguments.get(0));
+		case UMLPackage.PROFILE___GET_REFERENCED_METACLASSES:
+			return getReferencedMetaclasses();
+		case UMLPackage.PROFILE___GET_REFERENCED_METAMODELS:
+			return getReferencedMetamodels();
+		case UMLPackage.PROFILE___IS_DEFINED:
+			return isDefined();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PropertyImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PropertyImpl.java
index d491298..886e97c 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PropertyImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PropertyImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 208353, 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 212765, 418466, 451350, 485756
  *
  */
@@ -33,6 +33,8 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
@@ -202,9 +204,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -213,10 +213,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PROPERTY__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true,
-			true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PROPERTY__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -225,10 +222,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PROPERTY__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PROPERTY__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -238,13 +232,10 @@
 	 */
 	public NotificationChain basicSetTemplateParameterGen(
 			TemplateParameter newTemplateParameter, NotificationChain msgs) {
-		if (newTemplateParameter != null
-			&& !(newTemplateParameter instanceof ConnectableElementTemplateParameter)) {
-			throw new IllegalArgumentException(
-				"newTemplateParameter must be an instance of ConnectableElementTemplateParameter"); //$NON-NLS-1$
+		if (newTemplateParameter != null && !(newTemplateParameter instanceof ConnectableElementTemplateParameter)) {
+			throw new IllegalArgumentException("newTemplateParameter must be an instance of ConnectableElementTemplateParameter"); //$NON-NLS-1$
 		}
-		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter,
-			UMLPackage.PROPERTY__TEMPLATE_PARAMETER, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newTemplateParameter, UMLPackage.PROPERTY__TEMPLATE_PARAMETER, msgs);
 		return msgs;
 	}
 
@@ -258,7 +249,7 @@
 			TemplateParameter owningTemplateParameter = basicGetOwningTemplateParameter();
 
 			if (owningTemplateParameter != null
-				&& owningTemplateParameter != newTemplateParameter) {
+					&& owningTemplateParameter != newTemplateParameter) {
 
 				setOwningTemplateParameter(null);
 			}
@@ -273,15 +264,10 @@
 	 * @generated
 	 */
 	public void setTemplateParameter(TemplateParameter newTemplateParameter) {
-		if (newTemplateParameter != null
-			&& !(newTemplateParameter instanceof ConnectableElementTemplateParameter)) {
-			throw new IllegalArgumentException(
-				"newTemplateParameter must be an instance of ConnectableElementTemplateParameter"); //$NON-NLS-1$
+		if (newTemplateParameter != null && !(newTemplateParameter instanceof ConnectableElementTemplateParameter)) {
+			throw new IllegalArgumentException("newTemplateParameter must be an instance of ConnectableElementTemplateParameter"); //$NON-NLS-1$
 		}
-		eDynamicSet(
-			UMLPackage.PROPERTY__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-			newTemplateParameter);
+		eDynamicSet(UMLPackage.PROPERTY__TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, newTemplateParameter);
 	}
 
 	/**
@@ -299,11 +285,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			true, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, true, true);
 	}
 
 	/**
@@ -312,11 +294,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetOwningTemplateParameter() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			false, true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, false, true);
 	}
 
 	/**
@@ -327,8 +305,7 @@
 	public NotificationChain basicSetOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter,
-			UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newOwningTemplateParameter, UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -347,11 +324,7 @@
 	 */
 	public void setOwningTemplateParameter(
 			TemplateParameter newOwningTemplateParameter) {
-		eDynamicSet(
-			UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER,
-			newOwningTemplateParameter);
+		eDynamicSet(UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER, newOwningTemplateParameter);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningTemplateParameter != null) {
@@ -382,19 +355,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.PROPERTY__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PROPERTY__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.PROPERTY__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PROPERTY__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -404,9 +371,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Deployment> getDeployments() {
-		return (EList<Deployment>) eDynamicGet(
-			UMLPackage.PROPERTY__DEPLOYMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYMENT, true, true);
+		return (EList<Deployment>) eDynamicGet(UMLPackage.PROPERTY__DEPLOYMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYMENT, true, true);
 	}
 
 	/**
@@ -418,14 +383,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<PackageableElement> result = (EList<PackageableElement>) cache
-				.get(this,
-					UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT);
+			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,
-					result = DeploymentTargetOperations
-						.getDeployedElements(this));
+				cache.put(this, UMLPackage.Literals.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT, result = DeploymentTargetOperations.getDeployedElements(this));
 			}
 			return result;
 		}
@@ -448,12 +408,10 @@
 	 */
 	public PackageableElement getDeployedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		deployedElementLoop : for (PackageableElement deployedElement : getDeployedElements()) {
+		deployedElementLoop: for (PackageableElement deployedElement : getDeployedElements()) {
 			if (eClass != null && !eClass.isInstance(deployedElement))
 				continue deployedElementLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(deployedElement.getName())
-				: name.equals(deployedElement.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(deployedElement.getName()) : name.equals(deployedElement.getName())))
 				continue deployedElementLoop;
 			return deployedElement;
 		}
@@ -468,9 +426,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -484,22 +440,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Classifier> featuringClassifiers = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.FEATURE__FEATURING_CLASSIFIER);
+			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>(
-						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>(Classifier.class, this,
-			UMLPackage.PROPERTY__FEATURING_CLASSIFIER,
-			FEATURING_CLASSIFIER_ESUBSETS);
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.PROPERTY__FEATURING_CLASSIFIER, FEATURING_CLASSIFIER_ESUBSETS);
 	}
 
 	/**
@@ -513,22 +460,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			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>(
-						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>(
-			RedefinableElement.class, this,
-			UMLPackage.PROPERTY__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<RedefinableElement>(RedefinableElement.class, this, UMLPackage.PROPERTY__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -537,9 +476,7 @@
 	 * @generated
 	 */
 	public Association getAssociation() {
-		return (Association) eDynamicGet(
-			UMLPackage.PROPERTY__ASSOCIATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__ASSOCIATION, true, true);
+		return (Association) eDynamicGet(UMLPackage.PROPERTY__ASSOCIATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__ASSOCIATION, true, true);
 	}
 
 	/**
@@ -548,9 +485,7 @@
 	 * @generated
 	 */
 	public Association basicGetAssociation() {
-		return (Association) eDynamicGet(
-			UMLPackage.PROPERTY__ASSOCIATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__ASSOCIATION, false, true);
+		return (Association) eDynamicGet(UMLPackage.PROPERTY__ASSOCIATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__ASSOCIATION, false, true);
 	}
 
 	/**
@@ -560,13 +495,11 @@
 	 */
 	public NotificationChain basicSetAssociation(Association newAssociation,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newAssociation,
-			UMLPackage.PROPERTY__ASSOCIATION, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newAssociation, UMLPackage.PROPERTY__ASSOCIATION, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			Association owningAssociation = basicGetOwningAssociation();
-			if (owningAssociation != null
-				&& owningAssociation != newAssociation) {
+			if (owningAssociation != null && owningAssociation != newAssociation) {
 				setOwningAssociation(null);
 			}
 		}
@@ -579,13 +512,11 @@
 	 * @generated
 	 */
 	public void setAssociation(Association newAssociation) {
-		eDynamicSet(UMLPackage.PROPERTY__ASSOCIATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__ASSOCIATION, newAssociation);
+		eDynamicSet(UMLPackage.PROPERTY__ASSOCIATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__ASSOCIATION, newAssociation);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			Association owningAssociation = basicGetOwningAssociation();
-			if (owningAssociation != null
-				&& owningAssociation != newAssociation) {
+			if (owningAssociation != null && owningAssociation != newAssociation) {
 				setOwningAssociation(null);
 			}
 		}
@@ -597,9 +528,7 @@
 	 * @generated
 	 */
 	public DataType getDatatype() {
-		return (DataType) eDynamicGet(
-			UMLPackage.PROPERTY__DATATYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__DATATYPE, true, true);
+		return (DataType) eDynamicGet(UMLPackage.PROPERTY__DATATYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__DATATYPE, true, true);
 	}
 
 	/**
@@ -608,9 +537,7 @@
 	 * @generated
 	 */
 	public DataType basicGetDatatype() {
-		return (DataType) eDynamicGet(
-			UMLPackage.PROPERTY__DATATYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__DATATYPE, false, true);
+		return (DataType) eDynamicGet(UMLPackage.PROPERTY__DATATYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__DATATYPE, false, true);
 	}
 
 	/**
@@ -620,8 +547,7 @@
 	 */
 	public NotificationChain basicSetDatatype(DataType newDatatype,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newDatatype,
-			UMLPackage.PROPERTY__DATATYPE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newDatatype, UMLPackage.PROPERTY__DATATYPE, msgs);
 		return msgs;
 	}
 
@@ -631,8 +557,7 @@
 	 * @generated
 	 */
 	public void setDatatype(DataType newDatatype) {
-		eDynamicSet(UMLPackage.PROPERTY__DATATYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__DATATYPE, newDatatype);
+		eDynamicSet(UMLPackage.PROPERTY__DATATYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__DATATYPE, newDatatype);
 	}
 
 	/**
@@ -641,9 +566,7 @@
 	 * @generated
 	 */
 	public Interface getInterface() {
-		return (Interface) eDynamicGet(
-			UMLPackage.PROPERTY__INTERFACE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__INTERFACE, true, true);
+		return (Interface) eDynamicGet(UMLPackage.PROPERTY__INTERFACE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__INTERFACE, true, true);
 	}
 
 	/**
@@ -652,9 +575,7 @@
 	 * @generated
 	 */
 	public Interface basicGetInterface() {
-		return (Interface) eDynamicGet(
-			UMLPackage.PROPERTY__INTERFACE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__INTERFACE, false, true);
+		return (Interface) eDynamicGet(UMLPackage.PROPERTY__INTERFACE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__INTERFACE, false, true);
 	}
 
 	/**
@@ -664,8 +585,7 @@
 	 */
 	public NotificationChain basicSetInterface(Interface newInterface,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newInterface,
-			UMLPackage.PROPERTY__INTERFACE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newInterface, UMLPackage.PROPERTY__INTERFACE, msgs);
 		return msgs;
 	}
 
@@ -675,8 +595,7 @@
 	 * @generated
 	 */
 	public void setInterface(Interface newInterface) {
-		eDynamicSet(UMLPackage.PROPERTY__INTERFACE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__INTERFACE, newInterface);
+		eDynamicSet(UMLPackage.PROPERTY__INTERFACE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__INTERFACE, newInterface);
 	}
 
 	/**
@@ -685,9 +604,7 @@
 	 * @generated
 	 */
 	public boolean isDerived() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.PROPERTY__IS_DERIVED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__IS_DERIVED, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.PROPERTY__IS_DERIVED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__IS_DERIVED, true, true);
 	}
 
 	/**
@@ -696,8 +613,7 @@
 	 * @generated
 	 */
 	public void setIsDerived(boolean newIsDerived) {
-		eDynamicSet(UMLPackage.PROPERTY__IS_DERIVED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__IS_DERIVED, newIsDerived);
+		eDynamicSet(UMLPackage.PROPERTY__IS_DERIVED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__IS_DERIVED, newIsDerived);
 	}
 
 	/**
@@ -706,9 +622,7 @@
 	 * @generated
 	 */
 	public boolean isDerivedUnion() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.PROPERTY__IS_DERIVED_UNION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__IS_DERIVED_UNION, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.PROPERTY__IS_DERIVED_UNION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__IS_DERIVED_UNION, true, true);
 	}
 
 	/**
@@ -717,9 +631,7 @@
 	 * @generated
 	 */
 	public void setIsDerivedUnion(boolean newIsDerivedUnion) {
-		eDynamicSet(
-			UMLPackage.PROPERTY__IS_DERIVED_UNION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__IS_DERIVED_UNION, newIsDerivedUnion);
+		eDynamicSet(UMLPackage.PROPERTY__IS_DERIVED_UNION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__IS_DERIVED_UNION, newIsDerivedUnion);
 	}
 
 	/**
@@ -728,9 +640,7 @@
 	 * @generated
 	 */
 	public boolean isID() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.PROPERTY__IS_ID - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__IS_ID, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.PROPERTY__IS_ID - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__IS_ID, true, true);
 	}
 
 	/**
@@ -739,8 +649,7 @@
 	 * @generated
 	 */
 	public void setIsID(boolean newIsID) {
-		eDynamicSet(UMLPackage.PROPERTY__IS_ID - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__IS_ID, newIsID);
+		eDynamicSet(UMLPackage.PROPERTY__IS_ID - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__IS_ID, newIsID);
 	}
 
 	/**
@@ -767,9 +676,7 @@
 	 * @generated
 	 */
 	public AggregationKind getAggregation() {
-		return (AggregationKind) eDynamicGet(
-			UMLPackage.PROPERTY__AGGREGATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__AGGREGATION, true, true);
+		return (AggregationKind) eDynamicGet(UMLPackage.PROPERTY__AGGREGATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__AGGREGATION, true, true);
 	}
 
 	/**
@@ -778,8 +685,7 @@
 	 * @generated
 	 */
 	public void setAggregation(AggregationKind newAggregation) {
-		eDynamicSet(UMLPackage.PROPERTY__AGGREGATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__AGGREGATION, newAggregation);
+		eDynamicSet(UMLPackage.PROPERTY__AGGREGATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__AGGREGATION, newAggregation);
 	}
 
 	/**
@@ -807,10 +713,7 @@
 	 */
 	public org.eclipse.uml2.uml.Class getClass_() {
 		org.eclipse.uml2.uml.Class class_ = basicGetClass_();
-		return class_ != null && class_.eIsProxy()
-			? (org.eclipse.uml2.uml.Class) eResolveProxy(
-				(InternalEObject) class_)
-			: class_;
+		return class_ != null && class_.eIsProxy() ? (org.eclipse.uml2.uml.Class) eResolveProxy((InternalEObject) class_) : class_;
 	}
 
 	/**
@@ -821,8 +724,8 @@
 	public org.eclipse.uml2.uml.Class basicGetClass_() {
 		InternalEObject eInternalContainer = eInternalContainer();
 		return eInternalContainer instanceof org.eclipse.uml2.uml.Class
-			? (org.eclipse.uml2.uml.Class) eInternalContainer
-			: null;
+				? (org.eclipse.uml2.uml.Class) eInternalContainer
+				: null;
 	}
 
 	/**
@@ -834,22 +737,22 @@
 		if (newClass != eInternalContainer()) {
 			if (EcoreUtil.isAncestor(this, newClass))
 				throw new IllegalArgumentException(
-					"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
+						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
 			NotificationChain msgs = null;
 			if (eInternalContainer() != null)
 				msgs = eBasicRemoveFromContainer(msgs);
 			if (newClass != null)
 				msgs = ((InternalEList<Property>) newClass.getOwnedAttributes())
-					.basicAdd(this, msgs);
+						.basicAdd(this, msgs);
 			msgs = eBasicSetContainer((InternalEObject) newClass,
-				InternalEObject.EOPPOSITE_FEATURE_BASE
-					- UMLPackage.CLASS__OWNED_ATTRIBUTE,
-				msgs);
+					InternalEObject.EOPPOSITE_FEATURE_BASE
+							- UMLPackage.CLASS__OWNED_ATTRIBUTE,
+					msgs);
 			if (msgs != null)
 				msgs.dispatch();
 		} else if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET,
-				UMLPackage.PROPERTY__CLASS, newClass, newClass));
+					UMLPackage.PROPERTY__CLASS, newClass, newClass));
 	}
 
 	/**
@@ -859,9 +762,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Property> getRedefinedProperties() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.PROPERTY__REDEFINED_PROPERTY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__REDEFINED_PROPERTY, true, true);
+		return (EList<Property>) eDynamicGet(UMLPackage.PROPERTY__REDEFINED_PROPERTY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__REDEFINED_PROPERTY, true, true);
 	}
 
 	/**
@@ -880,12 +781,10 @@
 	 */
 	public Property getRedefinedProperty(String name, Type type,
 			boolean ignoreCase, EClass eClass) {
-		redefinedPropertyLoop : for (Property redefinedProperty : getRedefinedProperties()) {
+		redefinedPropertyLoop: for (Property redefinedProperty : getRedefinedProperties()) {
 			if (eClass != null && !eClass.isInstance(redefinedProperty))
 				continue redefinedPropertyLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinedProperty.getName())
-				: name.equals(redefinedProperty.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinedProperty.getName()) : name.equals(redefinedProperty.getName())))
 				continue redefinedPropertyLoop;
 			if (type != null && !type.equals(redefinedProperty.getType()))
 				continue redefinedPropertyLoop;
@@ -900,9 +799,7 @@
 	 * @generated
 	 */
 	public Association getOwningAssociation() {
-		return (Association) eDynamicGet(
-			UMLPackage.PROPERTY__OWNING_ASSOCIATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__OWNING_ASSOCIATION, true, true);
+		return (Association) eDynamicGet(UMLPackage.PROPERTY__OWNING_ASSOCIATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__OWNING_ASSOCIATION, true, true);
 	}
 
 	/**
@@ -911,9 +808,7 @@
 	 * @generated
 	 */
 	public Association basicGetOwningAssociation() {
-		return (Association) eDynamicGet(
-			UMLPackage.PROPERTY__OWNING_ASSOCIATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__OWNING_ASSOCIATION, false, true);
+		return (Association) eDynamicGet(UMLPackage.PROPERTY__OWNING_ASSOCIATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__OWNING_ASSOCIATION, false, true);
 	}
 
 	/**
@@ -923,8 +818,7 @@
 	 */
 	public NotificationChain basicSetOwningAssociation(
 			Association newOwningAssociation, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newOwningAssociation,
-			UMLPackage.PROPERTY__OWNING_ASSOCIATION, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newOwningAssociation, UMLPackage.PROPERTY__OWNING_ASSOCIATION, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningAssociation != null) {
@@ -942,10 +836,7 @@
 	 * @generated
 	 */
 	public void setOwningAssociation(Association newOwningAssociation) {
-		eDynamicSet(
-			UMLPackage.PROPERTY__OWNING_ASSOCIATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__OWNING_ASSOCIATION,
-			newOwningAssociation);
+		eDynamicSet(UMLPackage.PROPERTY__OWNING_ASSOCIATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__OWNING_ASSOCIATION, newOwningAssociation);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwningAssociation != null) {
@@ -962,9 +853,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getDefaultValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.PROPERTY__DEFAULT_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__DEFAULT_VALUE, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.PROPERTY__DEFAULT_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__DEFAULT_VALUE, true, true);
 	}
 
 	/**
@@ -973,9 +862,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetDefaultValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.PROPERTY__DEFAULT_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__DEFAULT_VALUE, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.PROPERTY__DEFAULT_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__DEFAULT_VALUE, false, true);
 	}
 
 	/**
@@ -985,8 +872,7 @@
 	 */
 	public NotificationChain basicSetDefaultValue(
 			ValueSpecification newDefaultValue, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newDefaultValue,
-			UMLPackage.PROPERTY__DEFAULT_VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newDefaultValue, UMLPackage.PROPERTY__DEFAULT_VALUE, msgs);
 		return msgs;
 	}
 
@@ -996,8 +882,7 @@
 	 * @generated
 	 */
 	public void setDefaultValue(ValueSpecification newDefaultValue) {
-		eDynamicSet(UMLPackage.PROPERTY__DEFAULT_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__DEFAULT_VALUE, newDefaultValue);
+		eDynamicSet(UMLPackage.PROPERTY__DEFAULT_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__DEFAULT_VALUE, newDefaultValue);
 	}
 
 	/**
@@ -1007,8 +892,7 @@
 	 */
 	public ValueSpecification createDefaultValue(String name, Type type,
 			EClass eClass) {
-		ValueSpecification newDefaultValue = (ValueSpecification) create(
-			eClass);
+		ValueSpecification newDefaultValue = (ValueSpecification) create(eClass);
 		setDefaultValue(newDefaultValue);
 		if (name != null)
 			newDefaultValue.setName(name);
@@ -1024,9 +908,7 @@
 	 */
 	public Property getOpposite() {
 		Property opposite = basicGetOpposite();
-		return opposite != null && opposite.eIsProxy()
-			? (Property) eResolveProxy((InternalEObject) opposite)
-			: opposite;
+		return opposite != null && opposite.eIsProxy() ? (Property) eResolveProxy((InternalEObject) opposite) : opposite;
 	}
 
 	/**
@@ -1054,9 +936,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Property> getSubsettedProperties() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.PROPERTY__SUBSETTED_PROPERTY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__SUBSETTED_PROPERTY, true, true);
+		return (EList<Property>) eDynamicGet(UMLPackage.PROPERTY__SUBSETTED_PROPERTY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__SUBSETTED_PROPERTY, true, true);
 	}
 
 	/**
@@ -1075,12 +955,10 @@
 	 */
 	public Property getSubsettedProperty(String name, Type type,
 			boolean ignoreCase, EClass eClass) {
-		subsettedPropertyLoop : for (Property subsettedProperty : getSubsettedProperties()) {
+		subsettedPropertyLoop: for (Property subsettedProperty : getSubsettedProperties()) {
 			if (eClass != null && !eClass.isInstance(subsettedProperty))
 				continue subsettedPropertyLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(subsettedProperty.getName())
-				: name.equals(subsettedProperty.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(subsettedProperty.getName()) : name.equals(subsettedProperty.getName())))
 				continue subsettedPropertyLoop;
 			if (type != null && !type.equals(subsettedProperty.getType()))
 				continue subsettedPropertyLoop;
@@ -1096,9 +974,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Property> getQualifiers() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.PROPERTY__QUALIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__QUALIFIER, true, true);
+		return (EList<Property>) eDynamicGet(UMLPackage.PROPERTY__QUALIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__QUALIFIER, true, true);
 	}
 
 	/**
@@ -1141,20 +1017,16 @@
 	 */
 	public Property getQualifier(String name, Type type, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		qualifierLoop : for (Property qualifier : getQualifiers()) {
+		qualifierLoop: for (Property qualifier : getQualifiers()) {
 			if (eClass != null && !eClass.isInstance(qualifier))
 				continue qualifierLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(qualifier.getName())
-				: name.equals(qualifier.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(qualifier.getName()) : name.equals(qualifier.getName())))
 				continue qualifierLoop;
 			if (type != null && !type.equals(qualifier.getType()))
 				continue qualifierLoop;
 			return qualifier;
 		}
-		return createOnDemand && eClass != null
-			? createQualifier(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createQualifier(name, type, eClass) : null;
 	}
 
 	/**
@@ -1163,9 +1035,7 @@
 	 * @generated
 	 */
 	public Property getAssociationEnd() {
-		return (Property) eDynamicGet(
-			UMLPackage.PROPERTY__ASSOCIATION_END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__ASSOCIATION_END, true, true);
+		return (Property) eDynamicGet(UMLPackage.PROPERTY__ASSOCIATION_END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__ASSOCIATION_END, true, true);
 	}
 
 	/**
@@ -1174,9 +1044,7 @@
 	 * @generated
 	 */
 	public Property basicGetAssociationEnd() {
-		return (Property) eDynamicGet(
-			UMLPackage.PROPERTY__ASSOCIATION_END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__ASSOCIATION_END, false, true);
+		return (Property) eDynamicGet(UMLPackage.PROPERTY__ASSOCIATION_END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__ASSOCIATION_END, false, true);
 	}
 
 	/**
@@ -1186,8 +1054,7 @@
 	 */
 	public NotificationChain basicSetAssociationEnd(Property newAssociationEnd,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newAssociationEnd,
-			UMLPackage.PROPERTY__ASSOCIATION_END, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newAssociationEnd, UMLPackage.PROPERTY__ASSOCIATION_END, msgs);
 		return msgs;
 	}
 
@@ -1197,9 +1064,7 @@
 	 * @generated
 	 */
 	public void setAssociationEnd(Property newAssociationEnd) {
-		eDynamicSet(
-			UMLPackage.PROPERTY__ASSOCIATION_END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROPERTY__ASSOCIATION_END, newAssociationEnd);
+		eDynamicSet(UMLPackage.PROPERTY__ASSOCIATION_END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROPERTY__ASSOCIATION_END, newAssociationEnd);
 	}
 
 	/**
@@ -1227,8 +1092,7 @@
 	 */
 	public boolean validateMultiplicityOfComposite(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PropertyOperations.validateMultiplicityOfComposite(this,
-			diagnostics, context);
+		return PropertyOperations.validateMultiplicityOfComposite(this, diagnostics, context);
 	}
 
 	/**
@@ -1238,8 +1102,7 @@
 	 */
 	public boolean validateSubsettingContextConforms(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return PropertyOperations.validateSubsettingContextConforms(this,
-			diagnostics, context);
+		return PropertyOperations.validateSubsettingContextConforms(this, diagnostics, context);
 	}
 
 	/**
@@ -1249,8 +1112,7 @@
 	 */
 	public boolean validateRedefinedPropertyInherited(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return PropertyOperations.validateRedefinedPropertyInherited(this,
-			diagnostics, context);
+		return PropertyOperations.validateRedefinedPropertyInherited(this, diagnostics, context);
 	}
 
 	/**
@@ -1260,8 +1122,7 @@
 	 */
 	public boolean validateSubsettingRules(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PropertyOperations.validateSubsettingRules(this, diagnostics,
-			context);
+		return PropertyOperations.validateSubsettingRules(this, diagnostics, context);
 	}
 
 	/**
@@ -1271,8 +1132,7 @@
 	 */
 	public boolean validateDerivedUnionIsDerived(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PropertyOperations.validateDerivedUnionIsDerived(this,
-			diagnostics, context);
+		return PropertyOperations.validateDerivedUnionIsDerived(this, diagnostics, context);
 	}
 
 	/**
@@ -1282,8 +1142,7 @@
 	 */
 	public boolean validateDerivedUnionIsReadOnly(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PropertyOperations.validateDerivedUnionIsReadOnly(this,
-			diagnostics, context);
+		return PropertyOperations.validateDerivedUnionIsReadOnly(this, diagnostics, context);
 	}
 
 	/**
@@ -1293,8 +1152,7 @@
 	 */
 	public boolean validateSubsettedPropertyNames(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PropertyOperations.validateSubsettedPropertyNames(this,
-			diagnostics, context);
+		return PropertyOperations.validateSubsettedPropertyNames(this, diagnostics, context);
 	}
 
 	/**
@@ -1304,8 +1162,7 @@
 	 */
 	public boolean validateTypeOfOppositeEnd(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PropertyOperations.validateTypeOfOppositeEnd(this, diagnostics,
-			context);
+		return PropertyOperations.validateTypeOfOppositeEnd(this, diagnostics, context);
 	}
 
 	/**
@@ -1315,8 +1172,7 @@
 	 */
 	public boolean validateQualifiedIsAssociationEnd(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return PropertyOperations.validateQualifiedIsAssociationEnd(this,
-			diagnostics, context);
+		return PropertyOperations.validateQualifiedIsAssociationEnd(this, diagnostics, context);
 	}
 
 	/**
@@ -1326,8 +1182,7 @@
 	 */
 	public boolean validateDeploymentTarget(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PropertyOperations.validateDeploymentTarget(this, diagnostics,
-			context);
+		return PropertyOperations.validateDeploymentTarget(this, diagnostics, context);
 	}
 
 	/**
@@ -1337,8 +1192,7 @@
 	 */
 	public boolean validateBindingToAttribute(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PropertyOperations.validateBindingToAttribute(this, diagnostics,
-			context);
+		return PropertyOperations.validateBindingToAttribute(this, diagnostics, context);
 	}
 
 	/**
@@ -1449,12 +1303,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Type> result = (EList<Type>) cache.get(this,
-				UMLPackage.Literals.PROPERTY___SUBSETTING_CONTEXT);
+			EList<Type> result = (EList<Type>) cache.get(this, UMLPackage.Literals.PROPERTY___SUBSETTING_CONTEXT);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.PROPERTY___SUBSETTING_CONTEXT,
-					result = PropertyOperations.subsettingContext(this));
+				cache.put(this, UMLPackage.Literals.PROPERTY___SUBSETTING_CONTEXT, result = PropertyOperations.subsettingContext(this));
 			}
 			return result;
 		}
@@ -1490,52 +1341,42 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PROPERTY__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.PROPERTY__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.PROPERTY__DEPLOYMENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getDeployments())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROPERTY__DATATYPE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetDatatype((DataType) otherEnd, msgs);
-			case UMLPackage.PROPERTY__INTERFACE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetInterface((Interface) otherEnd, msgs);
-			case UMLPackage.PROPERTY__ASSOCIATION_END :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetAssociationEnd((Property) otherEnd, msgs);
-			case UMLPackage.PROPERTY__QUALIFIER :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getQualifiers())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROPERTY__OWNING_ASSOCIATION :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningAssociation((Association) otherEnd, msgs);
-			case UMLPackage.PROPERTY__ASSOCIATION :
-				Association association = basicGetAssociation();
-				if (association != null)
-					msgs = ((InternalEObject) association).eInverseRemove(this,
-						UMLPackage.ASSOCIATION__MEMBER_END, Association.class,
-						msgs);
-				return basicSetAssociation((Association) otherEnd, msgs);
+		case UMLPackage.PROPERTY__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.PROPERTY__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.PROPERTY__DEPLOYMENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getDeployments()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROPERTY__DATATYPE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetDatatype((DataType) otherEnd, msgs);
+		case UMLPackage.PROPERTY__INTERFACE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetInterface((Interface) otherEnd, msgs);
+		case UMLPackage.PROPERTY__ASSOCIATION_END:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetAssociationEnd((Property) otherEnd, msgs);
+		case UMLPackage.PROPERTY__QUALIFIER:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getQualifiers()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROPERTY__OWNING_ASSOCIATION:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningAssociation((Association) otherEnd, msgs);
+		case UMLPackage.PROPERTY__ASSOCIATION:
+			Association association = basicGetAssociation();
+			if (association != null)
+				msgs = ((InternalEObject) association).eInverseRemove(this, UMLPackage.ASSOCIATION__MEMBER_END, Association.class, msgs);
+			return basicSetAssociation((Association) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -1549,40 +1390,36 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PROPERTY__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROPERTY__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROPERTY__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.PROPERTY__LOWER_VALUE :
-				return basicSetLowerValue(null, msgs);
-			case UMLPackage.PROPERTY__UPPER_VALUE :
-				return basicSetUpperValue(null, msgs);
-			case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.PROPERTY__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.PROPERTY__DEPLOYMENT :
-				return ((InternalEList<?>) getDeployments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROPERTY__DATATYPE :
-				return basicSetDatatype(null, msgs);
-			case UMLPackage.PROPERTY__INTERFACE :
-				return basicSetInterface(null, msgs);
-			case UMLPackage.PROPERTY__ASSOCIATION_END :
-				return basicSetAssociationEnd(null, msgs);
-			case UMLPackage.PROPERTY__QUALIFIER :
-				return ((InternalEList<?>) getQualifiers())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROPERTY__DEFAULT_VALUE :
-				return basicSetDefaultValue(null, msgs);
-			case UMLPackage.PROPERTY__OWNING_ASSOCIATION :
-				return basicSetOwningAssociation(null, msgs);
-			case UMLPackage.PROPERTY__ASSOCIATION :
-				return basicSetAssociation(null, msgs);
+		case UMLPackage.PROPERTY__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROPERTY__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROPERTY__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.PROPERTY__LOWER_VALUE:
+			return basicSetLowerValue(null, msgs);
+		case UMLPackage.PROPERTY__UPPER_VALUE:
+			return basicSetUpperValue(null, msgs);
+		case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.PROPERTY__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.PROPERTY__DEPLOYMENT:
+			return ((InternalEList<?>) getDeployments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROPERTY__DATATYPE:
+			return basicSetDatatype(null, msgs);
+		case UMLPackage.PROPERTY__INTERFACE:
+			return basicSetInterface(null, msgs);
+		case UMLPackage.PROPERTY__ASSOCIATION_END:
+			return basicSetAssociationEnd(null, msgs);
+		case UMLPackage.PROPERTY__QUALIFIER:
+			return ((InternalEList<?>) getQualifiers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROPERTY__DEFAULT_VALUE:
+			return basicSetDefaultValue(null, msgs);
+		case UMLPackage.PROPERTY__OWNING_ASSOCIATION:
+			return basicSetOwningAssociation(null, msgs);
+		case UMLPackage.PROPERTY__ASSOCIATION:
+			return basicSetAssociation(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -1596,24 +1433,16 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
-			case UMLPackage.PROPERTY__DATATYPE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE, DataType.class,
-					msgs);
-			case UMLPackage.PROPERTY__INTERFACE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.INTERFACE__OWNED_ATTRIBUTE, Interface.class,
-					msgs);
-			case UMLPackage.PROPERTY__ASSOCIATION_END :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.PROPERTY__QUALIFIER, Property.class, msgs);
-			case UMLPackage.PROPERTY__OWNING_ASSOCIATION :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.ASSOCIATION__OWNED_END, Association.class, msgs);
+		case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+		case UMLPackage.PROPERTY__DATATYPE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.DATA_TYPE__OWNED_ATTRIBUTE, DataType.class, msgs);
+		case UMLPackage.PROPERTY__INTERFACE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.INTERFACE__OWNED_ATTRIBUTE, Interface.class, msgs);
+		case UMLPackage.PROPERTY__ASSOCIATION_END:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.PROPERTY__QUALIFIER, Property.class, msgs);
+		case UMLPackage.PROPERTY__OWNING_ASSOCIATION:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.ASSOCIATION__OWNED_END, Association.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -1626,128 +1455,128 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PROPERTY__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PROPERTY__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PROPERTY__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PROPERTY__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PROPERTY__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.PROPERTY__NAME :
-				return getName();
-			case UMLPackage.PROPERTY__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.PROPERTY__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.PROPERTY__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PROPERTY__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.PROPERTY__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.PROPERTY__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.PROPERTY__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.PROPERTY__FEATURING_CLASSIFIER :
-				return getFeaturingClassifiers();
-			case UMLPackage.PROPERTY__IS_STATIC :
-				return isStatic();
-			case UMLPackage.PROPERTY__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.PROPERTY__IS_ORDERED :
-				return isOrdered();
-			case UMLPackage.PROPERTY__IS_UNIQUE :
-				return isUnique();
-			case UMLPackage.PROPERTY__LOWER :
-				return getLower();
-			case UMLPackage.PROPERTY__LOWER_VALUE :
-				if (resolve)
-					return getLowerValue();
-				return basicGetLowerValue();
-			case UMLPackage.PROPERTY__UPPER :
-				return getUpper();
-			case UMLPackage.PROPERTY__UPPER_VALUE :
-				if (resolve)
-					return getUpperValue();
-				return basicGetUpperValue();
-			case UMLPackage.PROPERTY__IS_READ_ONLY :
-				return isReadOnly();
-			case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.PROPERTY__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.PROPERTY__END :
-				return getEnds();
-			case UMLPackage.PROPERTY__DEPLOYED_ELEMENT :
-				return getDeployedElements();
-			case UMLPackage.PROPERTY__DEPLOYMENT :
-				return getDeployments();
-			case UMLPackage.PROPERTY__DATATYPE :
-				if (resolve)
-					return getDatatype();
-				return basicGetDatatype();
-			case UMLPackage.PROPERTY__INTERFACE :
-				if (resolve)
-					return getInterface();
-				return basicGetInterface();
-			case UMLPackage.PROPERTY__DEFAULT :
-				return getDefault();
-			case UMLPackage.PROPERTY__AGGREGATION :
-				return getAggregation();
-			case UMLPackage.PROPERTY__ASSOCIATION_END :
-				if (resolve)
-					return getAssociationEnd();
-				return basicGetAssociationEnd();
-			case UMLPackage.PROPERTY__QUALIFIER :
-				return getQualifiers();
-			case UMLPackage.PROPERTY__CLASS :
-				if (resolve)
-					return getClass_();
-				return basicGetClass_();
-			case UMLPackage.PROPERTY__DEFAULT_VALUE :
-				if (resolve)
-					return getDefaultValue();
-				return basicGetDefaultValue();
-			case UMLPackage.PROPERTY__IS_COMPOSITE :
-				return isComposite();
-			case UMLPackage.PROPERTY__IS_DERIVED :
-				return isDerived();
-			case UMLPackage.PROPERTY__IS_DERIVED_UNION :
-				return isDerivedUnion();
-			case UMLPackage.PROPERTY__IS_ID :
-				return isID();
-			case UMLPackage.PROPERTY__OPPOSITE :
-				if (resolve)
-					return getOpposite();
-				return basicGetOpposite();
-			case UMLPackage.PROPERTY__OWNING_ASSOCIATION :
-				if (resolve)
-					return getOwningAssociation();
-				return basicGetOwningAssociation();
-			case UMLPackage.PROPERTY__REDEFINED_PROPERTY :
-				return getRedefinedProperties();
-			case UMLPackage.PROPERTY__SUBSETTED_PROPERTY :
-				return getSubsettedProperties();
-			case UMLPackage.PROPERTY__ASSOCIATION :
-				if (resolve)
-					return getAssociation();
-				return basicGetAssociation();
+		case UMLPackage.PROPERTY__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PROPERTY__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PROPERTY__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PROPERTY__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PROPERTY__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.PROPERTY__NAME:
+			return getName();
+		case UMLPackage.PROPERTY__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.PROPERTY__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.PROPERTY__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PROPERTY__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.PROPERTY__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.PROPERTY__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.PROPERTY__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.PROPERTY__FEATURING_CLASSIFIER:
+			return getFeaturingClassifiers();
+		case UMLPackage.PROPERTY__IS_STATIC:
+			return isStatic();
+		case UMLPackage.PROPERTY__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.PROPERTY__IS_ORDERED:
+			return isOrdered();
+		case UMLPackage.PROPERTY__IS_UNIQUE:
+			return isUnique();
+		case UMLPackage.PROPERTY__LOWER:
+			return getLower();
+		case UMLPackage.PROPERTY__LOWER_VALUE:
+			if (resolve)
+				return getLowerValue();
+			return basicGetLowerValue();
+		case UMLPackage.PROPERTY__UPPER:
+			return getUpper();
+		case UMLPackage.PROPERTY__UPPER_VALUE:
+			if (resolve)
+				return getUpperValue();
+			return basicGetUpperValue();
+		case UMLPackage.PROPERTY__IS_READ_ONLY:
+			return isReadOnly();
+		case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.PROPERTY__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.PROPERTY__END:
+			return getEnds();
+		case UMLPackage.PROPERTY__DEPLOYED_ELEMENT:
+			return getDeployedElements();
+		case UMLPackage.PROPERTY__DEPLOYMENT:
+			return getDeployments();
+		case UMLPackage.PROPERTY__DATATYPE:
+			if (resolve)
+				return getDatatype();
+			return basicGetDatatype();
+		case UMLPackage.PROPERTY__INTERFACE:
+			if (resolve)
+				return getInterface();
+			return basicGetInterface();
+		case UMLPackage.PROPERTY__DEFAULT:
+			return getDefault();
+		case UMLPackage.PROPERTY__AGGREGATION:
+			return getAggregation();
+		case UMLPackage.PROPERTY__ASSOCIATION_END:
+			if (resolve)
+				return getAssociationEnd();
+			return basicGetAssociationEnd();
+		case UMLPackage.PROPERTY__QUALIFIER:
+			return getQualifiers();
+		case UMLPackage.PROPERTY__CLASS:
+			if (resolve)
+				return getClass_();
+			return basicGetClass_();
+		case UMLPackage.PROPERTY__DEFAULT_VALUE:
+			if (resolve)
+				return getDefaultValue();
+			return basicGetDefaultValue();
+		case UMLPackage.PROPERTY__IS_COMPOSITE:
+			return isComposite();
+		case UMLPackage.PROPERTY__IS_DERIVED:
+			return isDerived();
+		case UMLPackage.PROPERTY__IS_DERIVED_UNION:
+			return isDerivedUnion();
+		case UMLPackage.PROPERTY__IS_ID:
+			return isID();
+		case UMLPackage.PROPERTY__OPPOSITE:
+			if (resolve)
+				return getOpposite();
+			return basicGetOpposite();
+		case UMLPackage.PROPERTY__OWNING_ASSOCIATION:
+			if (resolve)
+				return getOwningAssociation();
+			return basicGetOwningAssociation();
+		case UMLPackage.PROPERTY__REDEFINED_PROPERTY:
+			return getRedefinedProperties();
+		case UMLPackage.PROPERTY__SUBSETTED_PROPERTY:
+			return getSubsettedProperties();
+		case UMLPackage.PROPERTY__ASSOCIATION:
+			if (resolve)
+				return getAssociation();
+			return basicGetAssociation();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -1761,120 +1590,114 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PROPERTY__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PROPERTY__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PROPERTY__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.PROPERTY__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.PROPERTY__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.PROPERTY__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.PROPERTY__IS_STATIC :
-				setIsStatic((Boolean) newValue);
-				return;
-			case UMLPackage.PROPERTY__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.PROPERTY__IS_ORDERED :
-				setIsOrdered((Boolean) newValue);
-				return;
-			case UMLPackage.PROPERTY__IS_UNIQUE :
-				setIsUnique((Boolean) newValue);
-				return;
-			case UMLPackage.PROPERTY__LOWER :
-				setLower((Integer) newValue);
-				return;
-			case UMLPackage.PROPERTY__LOWER_VALUE :
-				setLowerValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.PROPERTY__UPPER :
-				setUpper((Integer) newValue);
-				return;
-			case UMLPackage.PROPERTY__UPPER_VALUE :
-				setUpperValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.PROPERTY__IS_READ_ONLY :
-				setIsReadOnly((Boolean) newValue);
-				return;
-			case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.PROPERTY__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.PROPERTY__DEPLOYMENT :
-				getDeployments().clear();
-				getDeployments()
-					.addAll((Collection<? extends Deployment>) newValue);
-				return;
-			case UMLPackage.PROPERTY__DATATYPE :
-				setDatatype((DataType) newValue);
-				return;
-			case UMLPackage.PROPERTY__INTERFACE :
-				setInterface((Interface) newValue);
-				return;
-			case UMLPackage.PROPERTY__DEFAULT :
-				setDefault((String) newValue);
-				return;
-			case UMLPackage.PROPERTY__AGGREGATION :
-				setAggregation((AggregationKind) newValue);
-				return;
-			case UMLPackage.PROPERTY__ASSOCIATION_END :
-				setAssociationEnd((Property) newValue);
-				return;
-			case UMLPackage.PROPERTY__QUALIFIER :
-				getQualifiers().clear();
-				getQualifiers()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.PROPERTY__DEFAULT_VALUE :
-				setDefaultValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.PROPERTY__IS_COMPOSITE :
-				setIsComposite((Boolean) newValue);
-				return;
-			case UMLPackage.PROPERTY__IS_DERIVED :
-				setIsDerived((Boolean) newValue);
-				return;
-			case UMLPackage.PROPERTY__IS_DERIVED_UNION :
-				setIsDerivedUnion((Boolean) newValue);
-				return;
-			case UMLPackage.PROPERTY__IS_ID :
-				setIsID((Boolean) newValue);
-				return;
-			case UMLPackage.PROPERTY__OPPOSITE :
-				setOpposite((Property) newValue);
-				return;
-			case UMLPackage.PROPERTY__OWNING_ASSOCIATION :
-				setOwningAssociation((Association) newValue);
-				return;
-			case UMLPackage.PROPERTY__REDEFINED_PROPERTY :
-				getRedefinedProperties().clear();
-				getRedefinedProperties()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.PROPERTY__SUBSETTED_PROPERTY :
-				getSubsettedProperties().clear();
-				getSubsettedProperties()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.PROPERTY__ASSOCIATION :
-				setAssociation((Association) newValue);
-				return;
+		case UMLPackage.PROPERTY__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PROPERTY__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PROPERTY__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.PROPERTY__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.PROPERTY__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.PROPERTY__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.PROPERTY__IS_STATIC:
+			setIsStatic((Boolean) newValue);
+			return;
+		case UMLPackage.PROPERTY__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.PROPERTY__IS_ORDERED:
+			setIsOrdered((Boolean) newValue);
+			return;
+		case UMLPackage.PROPERTY__IS_UNIQUE:
+			setIsUnique((Boolean) newValue);
+			return;
+		case UMLPackage.PROPERTY__LOWER:
+			setLower((Integer) newValue);
+			return;
+		case UMLPackage.PROPERTY__LOWER_VALUE:
+			setLowerValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.PROPERTY__UPPER:
+			setUpper((Integer) newValue);
+			return;
+		case UMLPackage.PROPERTY__UPPER_VALUE:
+			setUpperValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.PROPERTY__IS_READ_ONLY:
+			setIsReadOnly((Boolean) newValue);
+			return;
+		case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.PROPERTY__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.PROPERTY__DEPLOYMENT:
+			getDeployments().clear();
+			getDeployments().addAll((Collection<? extends Deployment>) newValue);
+			return;
+		case UMLPackage.PROPERTY__DATATYPE:
+			setDatatype((DataType) newValue);
+			return;
+		case UMLPackage.PROPERTY__INTERFACE:
+			setInterface((Interface) newValue);
+			return;
+		case UMLPackage.PROPERTY__DEFAULT:
+			setDefault((String) newValue);
+			return;
+		case UMLPackage.PROPERTY__AGGREGATION:
+			setAggregation((AggregationKind) newValue);
+			return;
+		case UMLPackage.PROPERTY__ASSOCIATION_END:
+			setAssociationEnd((Property) newValue);
+			return;
+		case UMLPackage.PROPERTY__QUALIFIER:
+			getQualifiers().clear();
+			getQualifiers().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.PROPERTY__DEFAULT_VALUE:
+			setDefaultValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.PROPERTY__IS_COMPOSITE:
+			setIsComposite((Boolean) newValue);
+			return;
+		case UMLPackage.PROPERTY__IS_DERIVED:
+			setIsDerived((Boolean) newValue);
+			return;
+		case UMLPackage.PROPERTY__IS_DERIVED_UNION:
+			setIsDerivedUnion((Boolean) newValue);
+			return;
+		case UMLPackage.PROPERTY__IS_ID:
+			setIsID((Boolean) newValue);
+			return;
+		case UMLPackage.PROPERTY__OPPOSITE:
+			setOpposite((Property) newValue);
+			return;
+		case UMLPackage.PROPERTY__OWNING_ASSOCIATION:
+			setOwningAssociation((Association) newValue);
+			return;
+		case UMLPackage.PROPERTY__REDEFINED_PROPERTY:
+			getRedefinedProperties().clear();
+			getRedefinedProperties().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.PROPERTY__SUBSETTED_PROPERTY:
+			getSubsettedProperties().clear();
+			getSubsettedProperties().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.PROPERTY__ASSOCIATION:
+			setAssociation((Association) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -1898,108 +1721,108 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PROPERTY__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PROPERTY__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PROPERTY__NAME :
-				unsetName();
-				return;
-			case UMLPackage.PROPERTY__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.PROPERTY__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.PROPERTY__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.PROPERTY__IS_STATIC :
-				setIsStatic(IS_STATIC_EDEFAULT);
-				return;
-			case UMLPackage.PROPERTY__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.PROPERTY__IS_ORDERED :
-				setIsOrdered(IS_ORDERED_EDEFAULT);
-				return;
-			case UMLPackage.PROPERTY__IS_UNIQUE :
-				setIsUnique(IS_UNIQUE_EDEFAULT);
-				return;
-			case UMLPackage.PROPERTY__LOWER :
-				setLower(LOWER_EDEFAULT);
-				return;
-			case UMLPackage.PROPERTY__LOWER_VALUE :
-				setLowerValue((ValueSpecification) null);
-				return;
-			case UMLPackage.PROPERTY__UPPER :
-				setUpper(UPPER_EDEFAULT);
-				return;
-			case UMLPackage.PROPERTY__UPPER_VALUE :
-				setUpperValue((ValueSpecification) null);
-				return;
-			case UMLPackage.PROPERTY__IS_READ_ONLY :
-				setIsReadOnly(IS_READ_ONLY_EDEFAULT);
-				return;
-			case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.PROPERTY__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.PROPERTY__DEPLOYMENT :
-				getDeployments().clear();
-				return;
-			case UMLPackage.PROPERTY__DATATYPE :
-				setDatatype((DataType) null);
-				return;
-			case UMLPackage.PROPERTY__INTERFACE :
-				setInterface((Interface) null);
-				return;
-			case UMLPackage.PROPERTY__DEFAULT :
-				unsetDefault();
-				return;
-			case UMLPackage.PROPERTY__AGGREGATION :
-				setAggregation(AGGREGATION_EDEFAULT);
-				return;
-			case UMLPackage.PROPERTY__ASSOCIATION_END :
-				setAssociationEnd((Property) null);
-				return;
-			case UMLPackage.PROPERTY__QUALIFIER :
-				getQualifiers().clear();
-				return;
-			case UMLPackage.PROPERTY__DEFAULT_VALUE :
-				setDefaultValue((ValueSpecification) null);
-				return;
-			case UMLPackage.PROPERTY__IS_COMPOSITE :
-				setIsComposite(IS_COMPOSITE_EDEFAULT);
-				return;
-			case UMLPackage.PROPERTY__IS_DERIVED :
-				setIsDerived(IS_DERIVED_EDEFAULT);
-				return;
-			case UMLPackage.PROPERTY__IS_DERIVED_UNION :
-				setIsDerivedUnion(IS_DERIVED_UNION_EDEFAULT);
-				return;
-			case UMLPackage.PROPERTY__IS_ID :
-				setIsID(IS_ID_EDEFAULT);
-				return;
-			case UMLPackage.PROPERTY__OPPOSITE :
-				setOpposite((Property) null);
-				return;
-			case UMLPackage.PROPERTY__OWNING_ASSOCIATION :
-				setOwningAssociation((Association) null);
-				return;
-			case UMLPackage.PROPERTY__REDEFINED_PROPERTY :
-				getRedefinedProperties().clear();
-				return;
-			case UMLPackage.PROPERTY__SUBSETTED_PROPERTY :
-				getSubsettedProperties().clear();
-				return;
-			case UMLPackage.PROPERTY__ASSOCIATION :
-				setAssociation((Association) null);
-				return;
+		case UMLPackage.PROPERTY__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PROPERTY__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PROPERTY__NAME:
+			unsetName();
+			return;
+		case UMLPackage.PROPERTY__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.PROPERTY__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.PROPERTY__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.PROPERTY__IS_STATIC:
+			setIsStatic(IS_STATIC_EDEFAULT);
+			return;
+		case UMLPackage.PROPERTY__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.PROPERTY__IS_ORDERED:
+			setIsOrdered(IS_ORDERED_EDEFAULT);
+			return;
+		case UMLPackage.PROPERTY__IS_UNIQUE:
+			setIsUnique(IS_UNIQUE_EDEFAULT);
+			return;
+		case UMLPackage.PROPERTY__LOWER:
+			setLower(LOWER_EDEFAULT);
+			return;
+		case UMLPackage.PROPERTY__LOWER_VALUE:
+			setLowerValue((ValueSpecification) null);
+			return;
+		case UMLPackage.PROPERTY__UPPER:
+			setUpper(UPPER_EDEFAULT);
+			return;
+		case UMLPackage.PROPERTY__UPPER_VALUE:
+			setUpperValue((ValueSpecification) null);
+			return;
+		case UMLPackage.PROPERTY__IS_READ_ONLY:
+			setIsReadOnly(IS_READ_ONLY_EDEFAULT);
+			return;
+		case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.PROPERTY__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.PROPERTY__DEPLOYMENT:
+			getDeployments().clear();
+			return;
+		case UMLPackage.PROPERTY__DATATYPE:
+			setDatatype((DataType) null);
+			return;
+		case UMLPackage.PROPERTY__INTERFACE:
+			setInterface((Interface) null);
+			return;
+		case UMLPackage.PROPERTY__DEFAULT:
+			unsetDefault();
+			return;
+		case UMLPackage.PROPERTY__AGGREGATION:
+			setAggregation(AGGREGATION_EDEFAULT);
+			return;
+		case UMLPackage.PROPERTY__ASSOCIATION_END:
+			setAssociationEnd((Property) null);
+			return;
+		case UMLPackage.PROPERTY__QUALIFIER:
+			getQualifiers().clear();
+			return;
+		case UMLPackage.PROPERTY__DEFAULT_VALUE:
+			setDefaultValue((ValueSpecification) null);
+			return;
+		case UMLPackage.PROPERTY__IS_COMPOSITE:
+			setIsComposite(IS_COMPOSITE_EDEFAULT);
+			return;
+		case UMLPackage.PROPERTY__IS_DERIVED:
+			setIsDerived(IS_DERIVED_EDEFAULT);
+			return;
+		case UMLPackage.PROPERTY__IS_DERIVED_UNION:
+			setIsDerivedUnion(IS_DERIVED_UNION_EDEFAULT);
+			return;
+		case UMLPackage.PROPERTY__IS_ID:
+			setIsID(IS_ID_EDEFAULT);
+			return;
+		case UMLPackage.PROPERTY__OPPOSITE:
+			setOpposite((Property) null);
+			return;
+		case UMLPackage.PROPERTY__OWNING_ASSOCIATION:
+			setOwningAssociation((Association) null);
+			return;
+		case UMLPackage.PROPERTY__REDEFINED_PROPERTY:
+			getRedefinedProperties().clear();
+			return;
+		case UMLPackage.PROPERTY__SUBSETTED_PROPERTY:
+			getSubsettedProperties().clear();
+			return;
+		case UMLPackage.PROPERTY__ASSOCIATION:
+			setAssociation((Association) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -2012,98 +1835,96 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PROPERTY__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PROPERTY__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PROPERTY__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PROPERTY__OWNER :
-				return isSetOwner();
-			case UMLPackage.PROPERTY__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.PROPERTY__NAME :
-				return isSetName();
-			case UMLPackage.PROPERTY__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.PROPERTY__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.PROPERTY__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.PROPERTY__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.PROPERTY__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.PROPERTY__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.PROPERTY__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.PROPERTY__FEATURING_CLASSIFIER :
-				return isSetFeaturingClassifiers();
-			case UMLPackage.PROPERTY__IS_STATIC :
-				return isStatic() != IS_STATIC_EDEFAULT;
-			case UMLPackage.PROPERTY__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.PROPERTY__IS_ORDERED :
-				return isOrdered() != IS_ORDERED_EDEFAULT;
-			case UMLPackage.PROPERTY__IS_UNIQUE :
-				return isUnique() != IS_UNIQUE_EDEFAULT;
-			case UMLPackage.PROPERTY__LOWER :
-				return getLower() != LOWER_EDEFAULT;
-			case UMLPackage.PROPERTY__LOWER_VALUE :
-				return basicGetLowerValue() != null;
-			case UMLPackage.PROPERTY__UPPER :
-				return getUpper() != UPPER_EDEFAULT;
-			case UMLPackage.PROPERTY__UPPER_VALUE :
-				return basicGetUpperValue() != null;
-			case UMLPackage.PROPERTY__IS_READ_ONLY :
-				return isReadOnly() != IS_READ_ONLY_EDEFAULT;
-			case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.PROPERTY__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.PROPERTY__END :
-				return !getEnds().isEmpty();
-			case UMLPackage.PROPERTY__DEPLOYED_ELEMENT :
-				return !getDeployedElements().isEmpty();
-			case UMLPackage.PROPERTY__DEPLOYMENT :
-				return !getDeployments().isEmpty();
-			case UMLPackage.PROPERTY__DATATYPE :
-				return basicGetDatatype() != null;
-			case UMLPackage.PROPERTY__INTERFACE :
-				return basicGetInterface() != null;
-			case UMLPackage.PROPERTY__DEFAULT :
-				return isSetDefault();
-			case UMLPackage.PROPERTY__AGGREGATION :
-				return getAggregation() != AGGREGATION_EDEFAULT;
-			case UMLPackage.PROPERTY__ASSOCIATION_END :
-				return basicGetAssociationEnd() != null;
-			case UMLPackage.PROPERTY__QUALIFIER :
-				return !getQualifiers().isEmpty();
-			case UMLPackage.PROPERTY__CLASS :
-				return basicGetClass_() != null;
-			case UMLPackage.PROPERTY__DEFAULT_VALUE :
-				return basicGetDefaultValue() != null;
-			case UMLPackage.PROPERTY__IS_COMPOSITE :
-				return isComposite() != IS_COMPOSITE_EDEFAULT;
-			case UMLPackage.PROPERTY__IS_DERIVED :
-				return isDerived() != IS_DERIVED_EDEFAULT;
-			case UMLPackage.PROPERTY__IS_DERIVED_UNION :
-				return isDerivedUnion() != IS_DERIVED_UNION_EDEFAULT;
-			case UMLPackage.PROPERTY__IS_ID :
-				return isID() != IS_ID_EDEFAULT;
-			case UMLPackage.PROPERTY__OPPOSITE :
-				return basicGetOpposite() != null;
-			case UMLPackage.PROPERTY__OWNING_ASSOCIATION :
-				return basicGetOwningAssociation() != null;
-			case UMLPackage.PROPERTY__REDEFINED_PROPERTY :
-				return !getRedefinedProperties().isEmpty();
-			case UMLPackage.PROPERTY__SUBSETTED_PROPERTY :
-				return !getSubsettedProperties().isEmpty();
-			case UMLPackage.PROPERTY__ASSOCIATION :
-				return basicGetAssociation() != null;
+		case UMLPackage.PROPERTY__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PROPERTY__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PROPERTY__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PROPERTY__OWNER:
+			return isSetOwner();
+		case UMLPackage.PROPERTY__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.PROPERTY__NAME:
+			return isSetName();
+		case UMLPackage.PROPERTY__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.PROPERTY__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.PROPERTY__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.PROPERTY__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.PROPERTY__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.PROPERTY__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.PROPERTY__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.PROPERTY__FEATURING_CLASSIFIER:
+			return isSetFeaturingClassifiers();
+		case UMLPackage.PROPERTY__IS_STATIC:
+			return isStatic() != IS_STATIC_EDEFAULT;
+		case UMLPackage.PROPERTY__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.PROPERTY__IS_ORDERED:
+			return isOrdered() != IS_ORDERED_EDEFAULT;
+		case UMLPackage.PROPERTY__IS_UNIQUE:
+			return isUnique() != IS_UNIQUE_EDEFAULT;
+		case UMLPackage.PROPERTY__LOWER:
+			return getLower() != LOWER_EDEFAULT;
+		case UMLPackage.PROPERTY__LOWER_VALUE:
+			return basicGetLowerValue() != null;
+		case UMLPackage.PROPERTY__UPPER:
+			return getUpper() != UPPER_EDEFAULT;
+		case UMLPackage.PROPERTY__UPPER_VALUE:
+			return basicGetUpperValue() != null;
+		case UMLPackage.PROPERTY__IS_READ_ONLY:
+			return isReadOnly() != IS_READ_ONLY_EDEFAULT;
+		case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.PROPERTY__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.PROPERTY__END:
+			return !getEnds().isEmpty();
+		case UMLPackage.PROPERTY__DEPLOYED_ELEMENT:
+			return !getDeployedElements().isEmpty();
+		case UMLPackage.PROPERTY__DEPLOYMENT:
+			return !getDeployments().isEmpty();
+		case UMLPackage.PROPERTY__DATATYPE:
+			return basicGetDatatype() != null;
+		case UMLPackage.PROPERTY__INTERFACE:
+			return basicGetInterface() != null;
+		case UMLPackage.PROPERTY__DEFAULT:
+			return isSetDefault();
+		case UMLPackage.PROPERTY__AGGREGATION:
+			return getAggregation() != AGGREGATION_EDEFAULT;
+		case UMLPackage.PROPERTY__ASSOCIATION_END:
+			return basicGetAssociationEnd() != null;
+		case UMLPackage.PROPERTY__QUALIFIER:
+			return !getQualifiers().isEmpty();
+		case UMLPackage.PROPERTY__CLASS:
+			return basicGetClass_() != null;
+		case UMLPackage.PROPERTY__DEFAULT_VALUE:
+			return basicGetDefaultValue() != null;
+		case UMLPackage.PROPERTY__IS_COMPOSITE:
+			return isComposite() != IS_COMPOSITE_EDEFAULT;
+		case UMLPackage.PROPERTY__IS_DERIVED:
+			return isDerived() != IS_DERIVED_EDEFAULT;
+		case UMLPackage.PROPERTY__IS_DERIVED_UNION:
+			return isDerivedUnion() != IS_DERIVED_UNION_EDEFAULT;
+		case UMLPackage.PROPERTY__IS_ID:
+			return isID() != IS_ID_EDEFAULT;
+		case UMLPackage.PROPERTY__OPPOSITE:
+			return basicGetOpposite() != null;
+		case UMLPackage.PROPERTY__OWNING_ASSOCIATION:
+			return basicGetOwningAssociation() != null;
+		case UMLPackage.PROPERTY__REDEFINED_PROPERTY:
+			return !getRedefinedProperties().isEmpty();
+		case UMLPackage.PROPERTY__SUBSETTED_PROPERTY:
+			return !getSubsettedProperties().isEmpty();
+		case UMLPackage.PROPERTY__ASSOCIATION:
+			return basicGetAssociation() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -2118,30 +1939,30 @@
 			Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER :
-					return UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
-				case UMLPackage.PROPERTY__TEMPLATE_PARAMETER :
-					return UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER:
+				return UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER;
+			case UMLPackage.PROPERTY__TEMPLATE_PARAMETER:
+				return UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == ConnectableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.PROPERTY__END :
-					return UMLPackage.CONNECTABLE_ELEMENT__END;
-				default :
-					return -1;
+			case UMLPackage.PROPERTY__END:
+				return UMLPackage.CONNECTABLE_ELEMENT__END;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == DeploymentTarget.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.PROPERTY__DEPLOYED_ELEMENT :
-					return UMLPackage.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT;
-				case UMLPackage.PROPERTY__DEPLOYMENT :
-					return UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT;
-				default :
-					return -1;
+			case UMLPackage.PROPERTY__DEPLOYED_ELEMENT:
+				return UMLPackage.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT;
+			case UMLPackage.PROPERTY__DEPLOYMENT:
+				return UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -2157,30 +1978,30 @@
 			Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER :
-					return UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER;
-				case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER :
-					return UMLPackage.PROPERTY__TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PARAMETERABLE_ELEMENT__OWNING_TEMPLATE_PARAMETER:
+				return UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER;
+			case UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER:
+				return UMLPackage.PROPERTY__TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == ConnectableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.CONNECTABLE_ELEMENT__END :
-					return UMLPackage.PROPERTY__END;
-				default :
-					return -1;
+			case UMLPackage.CONNECTABLE_ELEMENT__END:
+				return UMLPackage.PROPERTY__END;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == DeploymentTarget.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT :
-					return UMLPackage.PROPERTY__DEPLOYED_ELEMENT;
-				case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT :
-					return UMLPackage.PROPERTY__DEPLOYMENT;
-				default :
-					return -1;
+			case UMLPackage.DEPLOYMENT_TARGET__DEPLOYED_ELEMENT:
+				return UMLPackage.PROPERTY__DEPLOYED_ELEMENT;
+			case UMLPackage.DEPLOYMENT_TARGET__DEPLOYMENT:
+				return UMLPackage.PROPERTY__DEPLOYMENT;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -2195,28 +2016,28 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == ParameterableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-					return UMLPackage.PROPERTY___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT;
-				case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER :
-					return UMLPackage.PROPERTY___IS_TEMPLATE_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.PARAMETERABLE_ELEMENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+				return UMLPackage.PROPERTY___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT;
+			case UMLPackage.PARAMETERABLE_ELEMENT___IS_TEMPLATE_PARAMETER:
+				return UMLPackage.PROPERTY___IS_TEMPLATE_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == ConnectableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.CONNECTABLE_ELEMENT___GET_ENDS :
-					return UMLPackage.PROPERTY___GET_ENDS;
-				default :
-					return -1;
+			case UMLPackage.CONNECTABLE_ELEMENT___GET_ENDS:
+				return UMLPackage.PROPERTY___GET_ENDS;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == DeploymentTarget.class) {
 			switch (baseOperationID) {
-				case UMLPackage.DEPLOYMENT_TARGET___GET_DEPLOYED_ELEMENTS :
-					return UMLPackage.PROPERTY___GET_DEPLOYED_ELEMENTS;
-				default :
-					return -1;
+			case UMLPackage.DEPLOYMENT_TARGET___GET_DEPLOYED_ELEMENTS:
+				return UMLPackage.PROPERTY___GET_DEPLOYED_ELEMENTS;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -2232,290 +2053,233 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.PROPERTY___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.PROPERTY___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.PROPERTY___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PROPERTY___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.PROPERTY___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.PROPERTY___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.PROPERTY___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.PROPERTY___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.PROPERTY___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.PROPERTY___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.PROPERTY___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PROPERTY___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.PROPERTY___GET_MODEL :
-				return getModel();
-			case UMLPackage.PROPERTY___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.PROPERTY___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.PROPERTY___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.PROPERTY___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.PROPERTY___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.PROPERTY___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.PROPERTY___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PROPERTY___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.PROPERTY___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.PROPERTY___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.PROPERTY___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PROPERTY___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PROPERTY___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.PROPERTY___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PROPERTY___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.PROPERTY___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.PROPERTY___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.PROPERTY___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.PROPERTY___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.PROPERTY___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PROPERTY___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.PROPERTY___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.PROPERTY___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.PROPERTY___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.PROPERTY___GET_LABEL :
-				return getLabel();
-			case UMLPackage.PROPERTY___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.PROPERTY___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.PROPERTY___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.PROPERTY___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.PROPERTY___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.PROPERTY___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PROPERTY___SEPARATOR :
-				return separator();
-			case UMLPackage.PROPERTY___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.PROPERTY___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.PROPERTY___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.PROPERTY___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-				return validateUpperGeLower((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-				return validateLowerGe0((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationNoSideEffects(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationConstant(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-				return validateLowerIsInteger(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-				return validateUpperIsUnlimitedNatural(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___SET_LOWER__INT :
-				setLower((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.PROPERTY___SET_UPPER__INT :
-				setUpper((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.PROPERTY___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-				return compatibleWith((MultiplicityElement) arguments.get(0));
-			case UMLPackage.PROPERTY___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-				return includesMultiplicity(
-					(MultiplicityElement) arguments.get(0));
-			case UMLPackage.PROPERTY___IS__INT_INT :
-				return is((Integer) arguments.get(0),
-					(Integer) arguments.get(1));
-			case UMLPackage.PROPERTY___IS_MULTIVALUED :
-				return isMultivalued();
-			case UMLPackage.PROPERTY___GET_LOWER :
-				return getLower();
-			case UMLPackage.PROPERTY___LOWER_BOUND :
-				return lowerBound();
-			case UMLPackage.PROPERTY___GET_UPPER :
-				return getUpper();
-			case UMLPackage.PROPERTY___UPPER_BOUND :
-				return upperBound();
-			case UMLPackage.PROPERTY___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.PROPERTY___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.PROPERTY___GET_ENDS :
-				return getEnds();
-			case UMLPackage.PROPERTY___GET_DEPLOYED_ELEMENTS :
-				return getDeployedElements();
-			case UMLPackage.PROPERTY___VALIDATE_SUBSETTING_CONTEXT_CONFORMS__DIAGNOSTICCHAIN_MAP :
-				return validateSubsettingContextConforms(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_DERIVED_UNION_IS_READ_ONLY__DIAGNOSTICCHAIN_MAP :
-				return validateDerivedUnionIsReadOnly(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_MULTIPLICITY_OF_COMPOSITE__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfComposite(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_REDEFINED_PROPERTY_INHERITED__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinedPropertyInherited(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_SUBSETTING_RULES__DIAGNOSTICCHAIN_MAP :
-				return validateSubsettingRules(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_BINDING_TO_ATTRIBUTE__DIAGNOSTICCHAIN_MAP :
-				return validateBindingToAttribute(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_DERIVED_UNION_IS_DERIVED__DIAGNOSTICCHAIN_MAP :
-				return validateDerivedUnionIsDerived(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_DEPLOYMENT_TARGET__DIAGNOSTICCHAIN_MAP :
-				return validateDeploymentTarget(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_SUBSETTED_PROPERTY_NAMES__DIAGNOSTICCHAIN_MAP :
-				return validateSubsettedPropertyNames(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_TYPE_OF_OPPOSITE_END__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfOppositeEnd(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___VALIDATE_QUALIFIED_IS_ASSOCIATION_END__DIAGNOSTICCHAIN_MAP :
-				return validateQualifiedIsAssociationEnd(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROPERTY___GET_DEFAULT :
-				return getDefault();
-			case UMLPackage.PROPERTY___GET_OTHER_END :
-				return getOtherEnd();
-			case UMLPackage.PROPERTY___IS_SET_DEFAULT :
-				return isSetDefault();
-			case UMLPackage.PROPERTY___SET_BOOLEAN_DEFAULT_VALUE__BOOLEAN :
-				setBooleanDefaultValue((Boolean) arguments.get(0));
-				return null;
-			case UMLPackage.PROPERTY___SET_DEFAULT__STRING :
-				setDefault((String) arguments.get(0));
-				return null;
-			case UMLPackage.PROPERTY___SET_INTEGER_DEFAULT_VALUE__INT :
-				setIntegerDefaultValue((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.PROPERTY___SET_IS_COMPOSITE__BOOLEAN :
-				setIsComposite((Boolean) arguments.get(0));
-				return null;
-			case UMLPackage.PROPERTY___SET_IS_NAVIGABLE__BOOLEAN :
-				setIsNavigable((Boolean) arguments.get(0));
-				return null;
-			case UMLPackage.PROPERTY___SET_NULL_DEFAULT_VALUE :
-				setNullDefaultValue();
-				return null;
-			case UMLPackage.PROPERTY___SET_OPPOSITE__PROPERTY :
-				setOpposite((Property) arguments.get(0));
-				return null;
-			case UMLPackage.PROPERTY___SET_REAL_DEFAULT_VALUE__DOUBLE :
-				setRealDefaultValue((Double) arguments.get(0));
-				return null;
-			case UMLPackage.PROPERTY___SET_STRING_DEFAULT_VALUE__STRING :
-				setStringDefaultValue((String) arguments.get(0));
-				return null;
-			case UMLPackage.PROPERTY___SET_UNLIMITED_NATURAL_DEFAULT_VALUE__INT :
-				setUnlimitedNaturalDefaultValue((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.PROPERTY___UNSET_DEFAULT :
-				unsetDefault();
-				return null;
-			case UMLPackage.PROPERTY___IS_ATTRIBUTE :
-				return isAttribute();
-			case UMLPackage.PROPERTY___IS_COMPOSITE :
-				return isComposite();
-			case UMLPackage.PROPERTY___IS_NAVIGABLE :
-				return isNavigable();
-			case UMLPackage.PROPERTY___GET_OPPOSITE :
-				return getOpposite();
-			case UMLPackage.PROPERTY___SUBSETTING_CONTEXT :
-				return subsettingContext();
+		case UMLPackage.PROPERTY___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.PROPERTY___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.PROPERTY___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PROPERTY___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.PROPERTY___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.PROPERTY___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.PROPERTY___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.PROPERTY___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.PROPERTY___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.PROPERTY___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.PROPERTY___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PROPERTY___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.PROPERTY___GET_MODEL:
+			return getModel();
+		case UMLPackage.PROPERTY___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.PROPERTY___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.PROPERTY___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.PROPERTY___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.PROPERTY___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.PROPERTY___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.PROPERTY___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PROPERTY___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.PROPERTY___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.PROPERTY___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.PROPERTY___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PROPERTY___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PROPERTY___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.PROPERTY___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PROPERTY___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.PROPERTY___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.PROPERTY___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.PROPERTY___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.PROPERTY___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.PROPERTY___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PROPERTY___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.PROPERTY___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.PROPERTY___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.PROPERTY___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.PROPERTY___GET_LABEL:
+			return getLabel();
+		case UMLPackage.PROPERTY___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.PROPERTY___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.PROPERTY___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.PROPERTY___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.PROPERTY___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.PROPERTY___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PROPERTY___SEPARATOR:
+			return separator();
+		case UMLPackage.PROPERTY___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.PROPERTY___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.PROPERTY___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.PROPERTY___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+			return validateUpperGeLower((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+			return validateLowerGe0((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationConstant((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+			return validateLowerIsInteger((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+			return validateUpperIsUnlimitedNatural((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___SET_LOWER__INT:
+			setLower((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.PROPERTY___SET_UPPER__INT:
+			setUpper((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.PROPERTY___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+			return compatibleWith((MultiplicityElement) arguments.get(0));
+		case UMLPackage.PROPERTY___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+			return includesMultiplicity((MultiplicityElement) arguments.get(0));
+		case UMLPackage.PROPERTY___IS__INT_INT:
+			return is((Integer) arguments.get(0), (Integer) arguments.get(1));
+		case UMLPackage.PROPERTY___IS_MULTIVALUED:
+			return isMultivalued();
+		case UMLPackage.PROPERTY___GET_LOWER:
+			return getLower();
+		case UMLPackage.PROPERTY___LOWER_BOUND:
+			return lowerBound();
+		case UMLPackage.PROPERTY___GET_UPPER:
+			return getUpper();
+		case UMLPackage.PROPERTY___UPPER_BOUND:
+			return upperBound();
+		case UMLPackage.PROPERTY___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.PROPERTY___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.PROPERTY___GET_ENDS:
+			return getEnds();
+		case UMLPackage.PROPERTY___GET_DEPLOYED_ELEMENTS:
+			return getDeployedElements();
+		case UMLPackage.PROPERTY___VALIDATE_SUBSETTING_CONTEXT_CONFORMS__DIAGNOSTICCHAIN_MAP:
+			return validateSubsettingContextConforms((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_DERIVED_UNION_IS_READ_ONLY__DIAGNOSTICCHAIN_MAP:
+			return validateDerivedUnionIsReadOnly((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_MULTIPLICITY_OF_COMPOSITE__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfComposite((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_REDEFINED_PROPERTY_INHERITED__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinedPropertyInherited((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_SUBSETTING_RULES__DIAGNOSTICCHAIN_MAP:
+			return validateSubsettingRules((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_BINDING_TO_ATTRIBUTE__DIAGNOSTICCHAIN_MAP:
+			return validateBindingToAttribute((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_DERIVED_UNION_IS_DERIVED__DIAGNOSTICCHAIN_MAP:
+			return validateDerivedUnionIsDerived((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_DEPLOYMENT_TARGET__DIAGNOSTICCHAIN_MAP:
+			return validateDeploymentTarget((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_SUBSETTED_PROPERTY_NAMES__DIAGNOSTICCHAIN_MAP:
+			return validateSubsettedPropertyNames((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_TYPE_OF_OPPOSITE_END__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfOppositeEnd((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___VALIDATE_QUALIFIED_IS_ASSOCIATION_END__DIAGNOSTICCHAIN_MAP:
+			return validateQualifiedIsAssociationEnd((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROPERTY___GET_DEFAULT:
+			return getDefault();
+		case UMLPackage.PROPERTY___GET_OTHER_END:
+			return getOtherEnd();
+		case UMLPackage.PROPERTY___IS_SET_DEFAULT:
+			return isSetDefault();
+		case UMLPackage.PROPERTY___SET_BOOLEAN_DEFAULT_VALUE__BOOLEAN:
+			setBooleanDefaultValue((Boolean) arguments.get(0));
+			return null;
+		case UMLPackage.PROPERTY___SET_DEFAULT__STRING:
+			setDefault((String) arguments.get(0));
+			return null;
+		case UMLPackage.PROPERTY___SET_INTEGER_DEFAULT_VALUE__INT:
+			setIntegerDefaultValue((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.PROPERTY___SET_IS_COMPOSITE__BOOLEAN:
+			setIsComposite((Boolean) arguments.get(0));
+			return null;
+		case UMLPackage.PROPERTY___SET_IS_NAVIGABLE__BOOLEAN:
+			setIsNavigable((Boolean) arguments.get(0));
+			return null;
+		case UMLPackage.PROPERTY___SET_NULL_DEFAULT_VALUE:
+			setNullDefaultValue();
+			return null;
+		case UMLPackage.PROPERTY___SET_OPPOSITE__PROPERTY:
+			setOpposite((Property) arguments.get(0));
+			return null;
+		case UMLPackage.PROPERTY___SET_REAL_DEFAULT_VALUE__DOUBLE:
+			setRealDefaultValue((Double) arguments.get(0));
+			return null;
+		case UMLPackage.PROPERTY___SET_STRING_DEFAULT_VALUE__STRING:
+			setStringDefaultValue((String) arguments.get(0));
+			return null;
+		case UMLPackage.PROPERTY___SET_UNLIMITED_NATURAL_DEFAULT_VALUE__INT:
+			setUnlimitedNaturalDefaultValue((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.PROPERTY___UNSET_DEFAULT:
+			unsetDefault();
+			return null;
+		case UMLPackage.PROPERTY___IS_ATTRIBUTE:
+			return isAttribute();
+		case UMLPackage.PROPERTY___IS_COMPOSITE:
+			return isComposite();
+		case UMLPackage.PROPERTY___IS_NAVIGABLE:
+			return isNavigable();
+		case UMLPackage.PROPERTY___GET_OPPOSITE:
+			return getOpposite();
+		case UMLPackage.PROPERTY___SUBSETTING_CONTEXT:
+			return subsettingContext();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -2546,8 +2310,8 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER)
-			|| eIsSet(UMLPackage.PROPERTY__ASSOCIATION_END);
+				|| eIsSet(UMLPackage.PROPERTY__OWNING_TEMPLATE_PARAMETER)
+				|| eIsSet(UMLPackage.PROPERTY__ASSOCIATION_END);
 	}
 
 	/**
@@ -2558,11 +2322,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.PROPERTY__OWNED_COMMENT,
-		UMLPackage.PROPERTY__NAME_EXPRESSION, UMLPackage.PROPERTY__LOWER_VALUE,
-		UMLPackage.PROPERTY__UPPER_VALUE, UMLPackage.PROPERTY__DEPLOYMENT,
-		UMLPackage.PROPERTY__QUALIFIER, UMLPackage.PROPERTY__DEFAULT_VALUE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.PROPERTY__OWNED_COMMENT, UMLPackage.PROPERTY__NAME_EXPRESSION, UMLPackage.PROPERTY__LOWER_VALUE, UMLPackage.PROPERTY__UPPER_VALUE, UMLPackage.PROPERTY__DEPLOYMENT,
+			UMLPackage.PROPERTY__QUALIFIER, UMLPackage.PROPERTY__DEFAULT_VALUE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2570,8 +2331,7 @@
 	 * @generated
 	 */
 	public Deployment createDeployment(String name) {
-		Deployment newDeployment = (Deployment) create(
-			UMLPackage.Literals.DEPLOYMENT);
+		Deployment newDeployment = (Deployment) create(UMLPackage.Literals.DEPLOYMENT);
 		getDeployments().add(newDeployment);
 		if (name != null)
 			newDeployment.setName(name);
@@ -2594,16 +2354,12 @@
 	 */
 	public Deployment getDeployment(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		deploymentLoop : for (Deployment deployment : getDeployments()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(deployment.getName())
-				: name.equals(deployment.getName())))
+		deploymentLoop: for (Deployment deployment : getDeployments()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(deployment.getName()) : name.equals(deployment.getName())))
 				continue deploymentLoop;
 			return deployment;
 		}
-		return createOnDemand
-			? createDeployment(name)
-			: null;
+		return createOnDemand ? createDeployment(name) : null;
 	}
 
 	/**
@@ -2614,9 +2370,9 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.PROPERTY__DEPLOYMENT)
-			|| eIsSet(UMLPackage.PROPERTY__QUALIFIER)
-			|| eIsSet(UMLPackage.PROPERTY__DEFAULT_VALUE);
+				|| eIsSet(UMLPackage.PROPERTY__DEPLOYMENT)
+				|| eIsSet(UMLPackage.PROPERTY__QUALIFIER)
+				|| eIsSet(UMLPackage.PROPERTY__DEFAULT_VALUE);
 	}
 
 	/**
@@ -2652,10 +2408,11 @@
 	 */
 	@Override
 	public boolean isSetNamespace() {
-		return super.isSetNamespace() || eIsSet(UMLPackage.PROPERTY__DATATYPE)
-			|| eIsSet(UMLPackage.PROPERTY__INTERFACE)
-			|| eIsSet(UMLPackage.PROPERTY__CLASS)
-			|| eIsSet(UMLPackage.PROPERTY__OWNING_ASSOCIATION);
+		return super.isSetNamespace()
+				|| eIsSet(UMLPackage.PROPERTY__DATATYPE)
+				|| eIsSet(UMLPackage.PROPERTY__INTERFACE)
+				|| eIsSet(UMLPackage.PROPERTY__CLASS)
+				|| eIsSet(UMLPackage.PROPERTY__OWNING_ASSOCIATION);
 	}
 
 	/**
@@ -2666,9 +2423,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] FEATURING_CLASSIFIER_ESUBSETS = new int[]{
-		UMLPackage.PROPERTY__DATATYPE, UMLPackage.PROPERTY__INTERFACE,
-		UMLPackage.PROPERTY__CLASS, UMLPackage.PROPERTY__OWNING_ASSOCIATION};
+	protected static final int[] FEATURING_CLASSIFIER_ESUBSETS = new int[] { UMLPackage.PROPERTY__DATATYPE, UMLPackage.PROPERTY__INTERFACE, UMLPackage.PROPERTY__CLASS, UMLPackage.PROPERTY__OWNING_ASSOCIATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2681,22 +2436,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			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<Classifier>(
-						Classifier.class, this,
-						UMLPackage.PROPERTY__REDEFINITION_CONTEXT,
-						REDEFINITION_CONTEXT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
+						redefinitionContexts = new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.PROPERTY__REDEFINITION_CONTEXT, REDEFINITION_CONTEXT_ESUBSETS));
 			}
 			return redefinitionContexts;
 		}
-		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
-			UMLPackage.PROPERTY__REDEFINITION_CONTEXT,
-			REDEFINITION_CONTEXT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.PROPERTY__REDEFINITION_CONTEXT, REDEFINITION_CONTEXT_ESUBSETS);
 	}
 
 	/**
@@ -2707,9 +2454,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[]{
-		UMLPackage.PROPERTY__DATATYPE, UMLPackage.PROPERTY__INTERFACE,
-		UMLPackage.PROPERTY__CLASS, UMLPackage.PROPERTY__OWNING_ASSOCIATION};
+	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[] { UMLPackage.PROPERTY__DATATYPE, UMLPackage.PROPERTY__INTERFACE, UMLPackage.PROPERTY__CLASS, UMLPackage.PROPERTY__OWNING_ASSOCIATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2719,10 +2464,10 @@
 	@Override
 	public boolean isSetFeaturingClassifiers() {
 		return super.isSetFeaturingClassifiers()
-			|| eIsSet(UMLPackage.PROPERTY__DATATYPE)
-			|| eIsSet(UMLPackage.PROPERTY__INTERFACE)
-			|| eIsSet(UMLPackage.PROPERTY__CLASS)
-			|| eIsSet(UMLPackage.PROPERTY__OWNING_ASSOCIATION);
+				|| eIsSet(UMLPackage.PROPERTY__DATATYPE)
+				|| eIsSet(UMLPackage.PROPERTY__INTERFACE)
+				|| eIsSet(UMLPackage.PROPERTY__CLASS)
+				|| eIsSet(UMLPackage.PROPERTY__OWNING_ASSOCIATION);
 	}
 
 	/**
@@ -2733,10 +2478,10 @@
 	@Override
 	public boolean isSetRedefinitionContexts() {
 		return super.isSetRedefinitionContexts()
-			|| eIsSet(UMLPackage.PROPERTY__DATATYPE)
-			|| eIsSet(UMLPackage.PROPERTY__INTERFACE)
-			|| eIsSet(UMLPackage.PROPERTY__CLASS)
-			|| eIsSet(UMLPackage.PROPERTY__OWNING_ASSOCIATION);
+				|| eIsSet(UMLPackage.PROPERTY__DATATYPE)
+				|| eIsSet(UMLPackage.PROPERTY__INTERFACE)
+				|| eIsSet(UMLPackage.PROPERTY__CLASS)
+				|| eIsSet(UMLPackage.PROPERTY__OWNING_ASSOCIATION);
 	}
 
 	/**
@@ -2747,8 +2492,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.PROPERTY__REDEFINED_PROPERTY};
+	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[] { UMLPackage.PROPERTY__REDEFINED_PROPERTY };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2758,7 +2502,7 @@
 	@Override
 	public boolean isSetRedefinedElements() {
 		return super.isSetRedefinedElements()
-			|| eIsSet(UMLPackage.PROPERTY__REDEFINED_PROPERTY);
+				|| eIsSet(UMLPackage.PROPERTY__REDEFINED_PROPERTY);
 	}
 
 } //PropertyImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProtocolConformanceImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProtocolConformanceImpl.java
index 0b51400..5deb112 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProtocolConformanceImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProtocolConformanceImpl.java
@@ -1,18 +1,20 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -21,8 +23,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -85,20 +90,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> targets = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			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>(
-						Element.class, this,
-						UMLPackage.PROTOCOL_CONFORMANCE__TARGET,
-						TARGET_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET, targets = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PROTOCOL_CONFORMANCE__TARGET, TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.PROTOCOL_CONFORMANCE__TARGET, TARGET_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PROTOCOL_CONFORMANCE__TARGET, TARGET_ESUBSETS);
 	}
 
 	/**
@@ -112,20 +110,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> sources = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			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>(
-						Element.class, this,
-						UMLPackage.PROTOCOL_CONFORMANCE__SOURCE,
-						SOURCE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE, sources = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PROTOCOL_CONFORMANCE__SOURCE, SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.PROTOCOL_CONFORMANCE__SOURCE, SOURCE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PROTOCOL_CONFORMANCE__SOURCE, SOURCE_ESUBSETS);
 	}
 
 	/**
@@ -134,11 +125,7 @@
 	 * @generated
 	 */
 	public ProtocolStateMachine getGeneralMachine() {
-		return (ProtocolStateMachine) eDynamicGet(
-			UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROTOCOL_CONFORMANCE__GENERAL_MACHINE, true,
-			true);
+		return (ProtocolStateMachine) eDynamicGet(UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROTOCOL_CONFORMANCE__GENERAL_MACHINE, true, true);
 	}
 
 	/**
@@ -147,11 +134,7 @@
 	 * @generated
 	 */
 	public ProtocolStateMachine basicGetGeneralMachine() {
-		return (ProtocolStateMachine) eDynamicGet(
-			UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROTOCOL_CONFORMANCE__GENERAL_MACHINE, false,
-			true);
+		return (ProtocolStateMachine) eDynamicGet(UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROTOCOL_CONFORMANCE__GENERAL_MACHINE, false, true);
 	}
 
 	/**
@@ -160,11 +143,7 @@
 	 * @generated
 	 */
 	public void setGeneralMachine(ProtocolStateMachine newGeneralMachine) {
-		eDynamicSet(
-			UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROTOCOL_CONFORMANCE__GENERAL_MACHINE,
-			newGeneralMachine);
+		eDynamicSet(UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROTOCOL_CONFORMANCE__GENERAL_MACHINE, newGeneralMachine);
 	}
 
 	/**
@@ -173,11 +152,7 @@
 	 * @generated
 	 */
 	public ProtocolStateMachine getSpecificMachine() {
-		return (ProtocolStateMachine) eDynamicGet(
-			UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE, true,
-			true);
+		return (ProtocolStateMachine) eDynamicGet(UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE, true, true);
 	}
 
 	/**
@@ -186,11 +161,7 @@
 	 * @generated
 	 */
 	public ProtocolStateMachine basicGetSpecificMachine() {
-		return (ProtocolStateMachine) eDynamicGet(
-			UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE, false,
-			true);
+		return (ProtocolStateMachine) eDynamicGet(UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE, false, true);
 	}
 
 	/**
@@ -200,8 +171,7 @@
 	 */
 	public NotificationChain basicSetSpecificMachine(
 			ProtocolStateMachine newSpecificMachine, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newSpecificMachine,
-			UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newSpecificMachine, UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE, msgs);
 		return msgs;
 	}
 
@@ -211,11 +181,7 @@
 	 * @generated
 	 */
 	public void setSpecificMachine(ProtocolStateMachine newSpecificMachine) {
-		eDynamicSet(
-			UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE,
-			newSpecificMachine);
+		eDynamicSet(UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE, newSpecificMachine);
 	}
 
 	/**
@@ -228,14 +194,12 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetSpecificMachine((ProtocolStateMachine) otherEnd,
-					msgs);
+		case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetSpecificMachine((ProtocolStateMachine) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -249,14 +213,12 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE :
-				return basicSetSpecificMachine(null, msgs);
+		case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE:
+			return basicSetSpecificMachine(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -270,10 +232,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE,
-					ProtocolStateMachine.class, msgs);
+		case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE, ProtocolStateMachine.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -286,30 +246,30 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PROTOCOL_CONFORMANCE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PROTOCOL_CONFORMANCE__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.PROTOCOL_CONFORMANCE__SOURCE :
-				return getSources();
-			case UMLPackage.PROTOCOL_CONFORMANCE__TARGET :
-				return getTargets();
-			case UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE :
-				if (resolve)
-					return getGeneralMachine();
-				return basicGetGeneralMachine();
-			case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE :
-				if (resolve)
-					return getSpecificMachine();
-				return basicGetSpecificMachine();
+		case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PROTOCOL_CONFORMANCE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PROTOCOL_CONFORMANCE__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.PROTOCOL_CONFORMANCE__SOURCE:
+			return getSources();
+		case UMLPackage.PROTOCOL_CONFORMANCE__TARGET:
+			return getTargets();
+		case UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE:
+			if (resolve)
+				return getGeneralMachine();
+			return basicGetGeneralMachine();
+		case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE:
+			if (resolve)
+				return getSpecificMachine();
+			return basicGetSpecificMachine();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -323,22 +283,20 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE :
-				setGeneralMachine((ProtocolStateMachine) newValue);
-				return;
-			case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE :
-				setSpecificMachine((ProtocolStateMachine) newValue);
-				return;
+		case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE:
+			setGeneralMachine((ProtocolStateMachine) newValue);
+			return;
+		case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE:
+			setSpecificMachine((ProtocolStateMachine) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -351,18 +309,18 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE :
-				setGeneralMachine((ProtocolStateMachine) null);
-				return;
-			case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE :
-				setSpecificMachine((ProtocolStateMachine) null);
-				return;
+		case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE:
+			setGeneralMachine((ProtocolStateMachine) null);
+			return;
+		case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE:
+			setSpecificMachine((ProtocolStateMachine) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -375,24 +333,24 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PROTOCOL_CONFORMANCE__OWNER :
-				return isSetOwner();
-			case UMLPackage.PROTOCOL_CONFORMANCE__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.PROTOCOL_CONFORMANCE__SOURCE :
-				return isSetSources();
-			case UMLPackage.PROTOCOL_CONFORMANCE__TARGET :
-				return isSetTargets();
-			case UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE :
-				return basicGetGeneralMachine() != null;
-			case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE :
-				return basicGetSpecificMachine() != null;
+		case UMLPackage.PROTOCOL_CONFORMANCE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PROTOCOL_CONFORMANCE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PROTOCOL_CONFORMANCE__OWNER:
+			return isSetOwner();
+		case UMLPackage.PROTOCOL_CONFORMANCE__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.PROTOCOL_CONFORMANCE__SOURCE:
+			return isSetSources();
+		case UMLPackage.PROTOCOL_CONFORMANCE__TARGET:
+			return isSetTargets();
+		case UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE:
+			return basicGetGeneralMachine() != null;
+		case UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE:
+			return basicGetSpecificMachine() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -405,8 +363,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] TARGET_ESUBSETS = new int[]{
-		UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE};
+	protected static final int[] TARGET_ESUBSETS = new int[] { UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -416,7 +373,7 @@
 	@Override
 	public boolean isSetTargets() {
 		return super.isSetTargets()
-			|| eIsSet(UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE);
+				|| eIsSet(UMLPackage.PROTOCOL_CONFORMANCE__GENERAL_MACHINE);
 	}
 
 	/**
@@ -427,8 +384,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SOURCE_ESUBSETS = new int[]{
-		UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE};
+	protected static final int[] SOURCE_ESUBSETS = new int[] { UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -438,9 +394,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -451,7 +405,7 @@
 	@Override
 	public boolean isSetSources() {
 		return super.isSetSources()
-			|| eIsSet(UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE);
+				|| eIsSet(UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE);
 	}
 
 	/**
@@ -476,7 +430,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE);
+				|| eIsSet(UMLPackage.PROTOCOL_CONFORMANCE__SPECIFIC_MACHINE);
 	}
 
 } //ProtocolConformanceImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProtocolStateMachineImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProtocolStateMachineImpl.java
index cbee3d7..b21969f 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProtocolStateMachineImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProtocolStateMachineImpl.java
@@ -1,13 +1,13 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -29,6 +29,7 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -126,21 +127,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -150,11 +143,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ProtocolConformance> getConformances() {
-		return (EList<ProtocolConformance>) eDynamicGet(
-			UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROTOCOL_STATE_MACHINE__CONFORMANCE, true,
-			true);
+		return (EList<ProtocolConformance>) eDynamicGet(UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROTOCOL_STATE_MACHINE__CONFORMANCE, true, true);
 	}
 
 	/**
@@ -164,8 +153,7 @@
 	 */
 	public ProtocolConformance createConformance(
 			ProtocolStateMachine generalMachine) {
-		ProtocolConformance newConformance = (ProtocolConformance) create(
-			UMLPackage.Literals.PROTOCOL_CONFORMANCE);
+		ProtocolConformance newConformance = (ProtocolConformance) create(UMLPackage.Literals.PROTOCOL_CONFORMANCE);
 		getConformances().add(newConformance);
 		if (generalMachine != null)
 			newConformance.setGeneralMachine(generalMachine);
@@ -189,15 +177,12 @@
 	 */
 	public ProtocolConformance getConformance(
 			ProtocolStateMachine generalMachine, boolean createOnDemand) {
-		conformanceLoop : for (ProtocolConformance conformance : getConformances()) {
-			if (generalMachine != null
-				&& !generalMachine.equals(conformance.getGeneralMachine()))
+		conformanceLoop: for (ProtocolConformance conformance : getConformances()) {
+			if (generalMachine != null && !generalMachine.equals(conformance.getGeneralMachine()))
 				continue conformanceLoop;
 			return conformance;
 		}
-		return createOnDemand
-			? createConformance(generalMachine)
-			: null;
+		return createOnDemand ? createConformance(generalMachine) : null;
 	}
 
 	/**
@@ -207,8 +192,7 @@
 	 */
 	public boolean validateProtocolTransitions(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ProtocolStateMachineOperations.validateProtocolTransitions(this,
-			diagnostics, context);
+		return ProtocolStateMachineOperations.validateProtocolTransitions(this, diagnostics, context);
 	}
 
 	/**
@@ -218,8 +202,7 @@
 	 */
 	public boolean validateEntryExitDo(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ProtocolStateMachineOperations.validateEntryExitDo(this,
-			diagnostics, context);
+		return ProtocolStateMachineOperations.validateEntryExitDo(this, diagnostics, context);
 	}
 
 	/**
@@ -229,8 +212,7 @@
 	 */
 	public boolean validateDeepOrShallowHistory(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ProtocolStateMachineOperations.validateDeepOrShallowHistory(this,
-			diagnostics, context);
+		return ProtocolStateMachineOperations.validateDeepOrShallowHistory(this, diagnostics, context);
 	}
 
 	/**
@@ -241,8 +223,7 @@
 	@Override
 	public boolean validateClassifierContext(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ProtocolStateMachineOperations.validateClassifierContext(this,
-			diagnostics, context);
+		return ProtocolStateMachineOperations.validateClassifierContext(this, diagnostics, context);
 	}
 
 	/**
@@ -255,82 +236,55 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__INTERFACE_REALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_OPERATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SPECIFICATION :
-				BehavioralFeature specification = basicGetSpecification();
-				if (specification != null)
-					msgs = ((InternalEObject) specification).eInverseRemove(
-						this, UMLPackage.BEHAVIORAL_FEATURE__METHOD,
-						BehavioralFeature.class, msgs);
-				return basicSetSpecification((BehavioralFeature) otherEnd,
-					msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CONNECTION_POINT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getConnectionPoints())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBMACHINE_STATE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubmachineStates())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REGION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getRegions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getConformances())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__INTERFACE_REALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_OPERATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SPECIFICATION:
+			BehavioralFeature specification = basicGetSpecification();
+			if (specification != null)
+				msgs = ((InternalEObject) specification).eInverseRemove(this, UMLPackage.BEHAVIORAL_FEATURE__METHOD, BehavioralFeature.class, msgs);
+			return basicSetSpecification((BehavioralFeature) otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CONNECTION_POINT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getConnectionPoints()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUBMACHINE_STATE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubmachineStates()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REGION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getRegions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getConformances()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -344,91 +298,66 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_CONNECTOR :
-				return ((InternalEList<?>) getOwnedConnectors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__INTERFACE_REALIZATION :
-				return ((InternalEList<?>) getInterfaceRealizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_BEHAVIOR :
-				return ((InternalEList<?>) getOwnedBehaviors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_OPERATION :
-				return ((InternalEList<?>) getOwnedOperations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NESTED_CLASSIFIER :
-				return ((InternalEList<?>) getNestedClassifiers())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RECEPTION :
-				return ((InternalEList<?>) getOwnedReceptions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SPECIFICATION :
-				return basicSetSpecification(null, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER :
-				return ((InternalEList<?>) getOwnedParameters())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER_SET :
-				return ((InternalEList<?>) getOwnedParameterSets())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CONNECTION_POINT :
-				return ((InternalEList<?>) getConnectionPoints())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBMACHINE_STATE :
-				return ((InternalEList<?>) getSubmachineStates())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REGION :
-				return ((InternalEList<?>) getRegions()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE :
-				return ((InternalEList<?>) getConformances())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_CONNECTOR:
+			return ((InternalEList<?>) getOwnedConnectors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__INTERFACE_REALIZATION:
+			return ((InternalEList<?>) getInterfaceRealizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_BEHAVIOR:
+			return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_OPERATION:
+			return ((InternalEList<?>) getOwnedOperations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NESTED_CLASSIFIER:
+			return ((InternalEList<?>) getNestedClassifiers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RECEPTION:
+			return ((InternalEList<?>) getOwnedReceptions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SPECIFICATION:
+			return basicSetSpecification(null, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER:
+			return ((InternalEList<?>) getOwnedParameters()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER_SET:
+			return ((InternalEList<?>) getOwnedParameterSets()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CONNECTION_POINT:
+			return ((InternalEList<?>) getConnectionPoints()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUBMACHINE_STATE:
+			return ((InternalEList<?>) getSubmachineStates()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REGION:
+			return ((InternalEList<?>) getRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE:
+			return ((InternalEList<?>) getConformances()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -441,158 +370,158 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NAME :
-				return getName();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__MEMBER :
-				return getMembers();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__FEATURE :
-				return getFeatures();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__GENERAL :
-				return getGenerals();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__USE_CASE :
-				return getUseCases();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_CONNECTOR :
-				return getOwnedConnectors();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PART :
-				return getParts();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__ROLE :
-				return getRoles();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PORT :
-				return getOwnedPorts();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CLASSIFIER_BEHAVIOR :
-				if (resolve)
-					return getClassifierBehavior();
-				return basicGetClassifierBehavior();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__INTERFACE_REALIZATION :
-				return getInterfaceRealizations();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_BEHAVIOR :
-				return getOwnedBehaviors();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_OPERATION :
-				return getOwnedOperations();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__EXTENSION :
-				return getExtensions();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ACTIVE :
-				return isActive();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NESTED_CLASSIFIER :
-				return getNestedClassifiers();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RECEPTION :
-				return getOwnedReceptions();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUPER_CLASS :
-				return getSuperClasses();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SPECIFICATION :
-				if (resolve)
-					return getSpecification();
-				return basicGetSpecification();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_REENTRANT :
-				return isReentrant();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER :
-				return getOwnedParameters();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER_SET :
-				return getOwnedParameterSets();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__POSTCONDITION :
-				return getPostconditions();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PRECONDITION :
-				return getPreconditions();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_BEHAVIOR :
-				return getRedefinedBehaviors();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CONNECTION_POINT :
-				return getConnectionPoints();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBMACHINE_STATE :
-				return getSubmachineStates();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REGION :
-				return getRegions();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__EXTENDED_STATE_MACHINE :
-				return getExtendedStateMachines();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE :
-				return getConformances();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NAME:
+			return getName();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__MEMBER:
+			return getMembers();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__FEATURE:
+			return getFeatures();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__GENERAL:
+			return getGenerals();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__USE_CASE:
+			return getUseCases();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_CONNECTOR:
+			return getOwnedConnectors();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PART:
+			return getParts();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__ROLE:
+			return getRoles();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PORT:
+			return getOwnedPorts();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CLASSIFIER_BEHAVIOR:
+			if (resolve)
+				return getClassifierBehavior();
+			return basicGetClassifierBehavior();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__INTERFACE_REALIZATION:
+			return getInterfaceRealizations();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_BEHAVIOR:
+			return getOwnedBehaviors();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_OPERATION:
+			return getOwnedOperations();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__EXTENSION:
+			return getExtensions();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ACTIVE:
+			return isActive();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NESTED_CLASSIFIER:
+			return getNestedClassifiers();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RECEPTION:
+			return getOwnedReceptions();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUPER_CLASS:
+			return getSuperClasses();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SPECIFICATION:
+			if (resolve)
+				return getSpecification();
+			return basicGetSpecification();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_REENTRANT:
+			return isReentrant();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER:
+			return getOwnedParameters();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER_SET:
+			return getOwnedParameterSets();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__POSTCONDITION:
+			return getPostconditions();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PRECONDITION:
+			return getPreconditions();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_BEHAVIOR:
+			return getRedefinedBehaviors();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CONNECTION_POINT:
+			return getConnectionPoints();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUBMACHINE_STATE:
+			return getSubmachineStates();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REGION:
+			return getRegions();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__EXTENDED_STATE_MACHINE:
+			return getExtendedStateMachines();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE:
+			return getConformances();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -606,209 +535,179 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				getOwnedConnectors()
-					.addAll((Collection<? extends Connector>) 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<? extends InterfaceRealization>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				getOwnedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ACTIVE :
-				setIsActive((Boolean) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				getNestedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				getOwnedReceptions()
-					.addAll((Collection<? extends Reception>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUPER_CLASS :
-				getSuperClasses().clear();
-				getSuperClasses().addAll(
-					(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SPECIFICATION :
-				setSpecification((BehavioralFeature) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_REENTRANT :
-				setIsReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				getOwnedParameters()
-					.addAll((Collection<? extends Parameter>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				getOwnedParameterSets()
-					.addAll((Collection<? extends ParameterSet>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__POSTCONDITION :
-				getPostconditions().clear();
-				getPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PRECONDITION :
-				getPreconditions().clear();
-				getPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_BEHAVIOR :
-				getRedefinedBehaviors().clear();
-				getRedefinedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CONNECTION_POINT :
-				getConnectionPoints().clear();
-				getConnectionPoints()
-					.addAll((Collection<? extends Pseudostate>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBMACHINE_STATE :
-				getSubmachineStates().clear();
-				getSubmachineStates()
-					.addAll((Collection<? extends State>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REGION :
-				getRegions().clear();
-				getRegions().addAll((Collection<? extends Region>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__EXTENDED_STATE_MACHINE :
-				getExtendedStateMachines().clear();
-				getExtendedStateMachines()
-					.addAll((Collection<? extends StateMachine>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE :
-				getConformances().clear();
-				getConformances().addAll(
-					(Collection<? extends ProtocolConformance>) newValue);
-				return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			getOwnedConnectors().addAll((Collection<? extends Connector>) 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<? extends InterfaceRealization>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			getOwnedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ACTIVE:
+			setIsActive((Boolean) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			getNestedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			getOwnedReceptions().addAll((Collection<? extends Reception>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUPER_CLASS:
+			getSuperClasses().clear();
+			getSuperClasses().addAll((Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SPECIFICATION:
+			setSpecification((BehavioralFeature) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_REENTRANT:
+			setIsReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			getOwnedParameters().addAll((Collection<? extends Parameter>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			getOwnedParameterSets().addAll((Collection<? extends ParameterSet>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__POSTCONDITION:
+			getPostconditions().clear();
+			getPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PRECONDITION:
+			getPreconditions().clear();
+			getPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_BEHAVIOR:
+			getRedefinedBehaviors().clear();
+			getRedefinedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CONNECTION_POINT:
+			getConnectionPoints().clear();
+			getConnectionPoints().addAll((Collection<? extends Pseudostate>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUBMACHINE_STATE:
+			getSubmachineStates().clear();
+			getSubmachineStates().addAll((Collection<? extends State>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REGION:
+			getRegions().clear();
+			getRegions().addAll((Collection<? extends Region>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__EXTENDED_STATE_MACHINE:
+			getExtendedStateMachines().clear();
+			getExtendedStateMachines().addAll((Collection<? extends StateMachine>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE:
+			getConformances().clear();
+			getConformances().addAll((Collection<? extends ProtocolConformance>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -821,147 +720,147 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) null);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ACTIVE :
-				setIsActive(IS_ACTIVE_EDEFAULT);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUPER_CLASS :
-				getSuperClasses().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SPECIFICATION :
-				setSpecification((BehavioralFeature) null);
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_REENTRANT :
-				unsetIsReentrant();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__POSTCONDITION :
-				getPostconditions().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PRECONDITION :
-				getPreconditions().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_BEHAVIOR :
-				getRedefinedBehaviors().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CONNECTION_POINT :
-				getConnectionPoints().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBMACHINE_STATE :
-				getSubmachineStates().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REGION :
-				getRegions().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__EXTENDED_STATE_MACHINE :
-				getExtendedStateMachines().clear();
-				return;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE :
-				getConformances().clear();
-				return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) null);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ACTIVE:
+			setIsActive(IS_ACTIVE_EDEFAULT);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUPER_CLASS:
+			getSuperClasses().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SPECIFICATION:
+			setSpecification((BehavioralFeature) null);
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_REENTRANT:
+			unsetIsReentrant();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__POSTCONDITION:
+			getPostconditions().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PRECONDITION:
+			getPreconditions().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_BEHAVIOR:
+			getRedefinedBehaviors().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CONNECTION_POINT:
+			getConnectionPoints().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUBMACHINE_STATE:
+			getSubmachineStates().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REGION:
+			getRegions().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__EXTENDED_STATE_MACHINE:
+			getExtendedStateMachines().clear();
+			return;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE:
+			getConformances().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -974,138 +873,136 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNER :
-				return isSetOwner();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NAME :
-				return isSetName();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.PROTOCOL_STATE_MACHINE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__MEMBER :
-				return isSetMembers();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__GENERAL :
-				return isSetGenerals();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ABSTRACT :
-				return isSetIsAbstract();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ATTRIBUTE :
-				return isSetOwnedAttributes();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_CONNECTOR :
-				return !getOwnedConnectors().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PART :
-				return !getParts().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__ROLE :
-				return isSetRoles();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PORT :
-				return !getOwnedPorts().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CLASSIFIER_BEHAVIOR :
-				return basicGetClassifierBehavior() != null;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__INTERFACE_REALIZATION :
-				return !getInterfaceRealizations().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_BEHAVIOR :
-				return !getOwnedBehaviors().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__EXTENSION :
-				return !getExtensions().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ACTIVE :
-				return isActive() != IS_ACTIVE_EDEFAULT;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__NESTED_CLASSIFIER :
-				return !getNestedClassifiers().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RECEPTION :
-				return !getOwnedReceptions().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUPER_CLASS :
-				return isSetSuperClasses();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SPECIFICATION :
-				return basicGetSpecification() != null;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.PROTOCOL_STATE_MACHINE__IS_REENTRANT :
-				return isSetIsReentrant();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER :
-				return !getOwnedParameters().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER_SET :
-				return !getOwnedParameterSets().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__POSTCONDITION :
-				return !getPostconditions().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__PRECONDITION :
-				return !getPreconditions().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_BEHAVIOR :
-				return isSetRedefinedBehaviors();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CONNECTION_POINT :
-				return !getConnectionPoints().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__SUBMACHINE_STATE :
-				return !getSubmachineStates().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__REGION :
-				return !getRegions().isEmpty();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__EXTENDED_STATE_MACHINE :
-				return isSetExtendedStateMachines();
-			case UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE :
-				return !getConformances().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNER:
+			return isSetOwner();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NAME:
+			return isSetName();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.PROTOCOL_STATE_MACHINE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__MEMBER:
+			return isSetMembers();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__GENERAL:
+			return isSetGenerals();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ABSTRACT:
+			return isSetIsAbstract();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_ATTRIBUTE:
+			return isSetOwnedAttributes();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_CONNECTOR:
+			return !getOwnedConnectors().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PART:
+			return !getParts().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__ROLE:
+			return isSetRoles();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PORT:
+			return !getOwnedPorts().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CLASSIFIER_BEHAVIOR:
+			return basicGetClassifierBehavior() != null;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__INTERFACE_REALIZATION:
+			return !getInterfaceRealizations().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_BEHAVIOR:
+			return !getOwnedBehaviors().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__EXTENSION:
+			return !getExtensions().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_ACTIVE:
+			return isActive() != IS_ACTIVE_EDEFAULT;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__NESTED_CLASSIFIER:
+			return !getNestedClassifiers().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_RECEPTION:
+			return !getOwnedReceptions().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUPER_CLASS:
+			return isSetSuperClasses();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SPECIFICATION:
+			return basicGetSpecification() != null;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.PROTOCOL_STATE_MACHINE__IS_REENTRANT:
+			return isSetIsReentrant();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER:
+			return !getOwnedParameters().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_PARAMETER_SET:
+			return !getOwnedParameterSets().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__POSTCONDITION:
+			return !getPostconditions().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__PRECONDITION:
+			return !getPreconditions().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REDEFINED_BEHAVIOR:
+			return isSetRedefinedBehaviors();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CONNECTION_POINT:
+			return !getConnectionPoints().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__SUBMACHINE_STATE:
+			return !getSubmachineStates().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__REGION:
+			return !getRegions().isEmpty();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__EXTENDED_STATE_MACHINE:
+			return isSetExtendedStateMachines();
+		case UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE:
+			return !getConformances().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1120,357 +1017,275 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_MODEL :
-				return getModel();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.PROTOCOL_STATE_MACHINE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___SEPARATOR :
-				return separator();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___PARENTS :
-				return parents();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_PARTS :
-				return getParts();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_ROLES :
-				return allRoles();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_OWNED_PORTS :
-				return getOwnedPorts();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateClassBehavior((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_ALL_IMPLEMENTED_INTERFACES :
-				return getAllImplementedInterfaces();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_IMPLEMENTED_INTERFACES :
-				return getImplementedInterfaces();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP :
-				return validatePassiveClass((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___IS_METACLASS :
-				return isMetaclass();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_EXTENSIONS :
-				return getExtensions();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_SUPER_CLASSES :
-				return getSuperClasses();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_MOST_ONE_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateMostOneBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_PARAMETERS_MATCH__DIAGNOSTICCHAIN_MAP :
-				return validateParametersMatch(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_FEATURE_OF_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateFeatureOfContextClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___BEHAVIORED_CLASSIFIER__ELEMENT :
-				return behavioredClassifier((Element) arguments.get(0));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___INPUT_PARAMETERS :
-				return inputParameters();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___OUTPUT_PARAMETERS :
-				return outputParameters();
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_CONNECTION_POINTS__DIAGNOSTICCHAIN_MAP :
-				return validateConnectionPoints(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_CLASSIFIER_CONTEXT__DIAGNOSTICCHAIN_MAP :
-				return validateClassifierContext(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_METHOD__DIAGNOSTICCHAIN_MAP :
-				return validateMethod((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateContextClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___LCA__VERTEX_VERTEX :
-				return LCA((Vertex) arguments.get(0),
-					(Vertex) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___ANCESTOR__VERTEX_VERTEX :
-				return ancestor((Vertex) arguments.get(0),
-					(Vertex) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___LCA_STATE__VERTEX_VERTEX :
-				return LCAState((Vertex) arguments.get(0),
-					(Vertex) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_DEEP_OR_SHALLOW_HISTORY__DIAGNOSTICCHAIN_MAP :
-				return validateDeepOrShallowHistory(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_ENTRY_EXIT_DO__DIAGNOSTICCHAIN_MAP :
-				return validateEntryExitDo((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_PROTOCOL_TRANSITIONS__DIAGNOSTICCHAIN_MAP :
-				return validateProtocolTransitions(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_MODEL:
+			return getModel();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.PROTOCOL_STATE_MACHINE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___SEPARATOR:
+			return separator();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___PARENTS:
+			return parents();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_PARTS:
+			return getParts();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___ALL_ROLES:
+			return allRoles();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_OWNED_PORTS:
+			return getOwnedPorts();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateClassBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_ALL_IMPLEMENTED_INTERFACES:
+			return getAllImplementedInterfaces();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_IMPLEMENTED_INTERFACES:
+			return getImplementedInterfaces();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP:
+			return validatePassiveClass((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___IS_METACLASS:
+			return isMetaclass();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_EXTENSIONS:
+			return getExtensions();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_SUPER_CLASSES:
+			return getSuperClasses();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_MOST_ONE_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateMostOneBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_PARAMETERS_MATCH__DIAGNOSTICCHAIN_MAP:
+			return validateParametersMatch((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_FEATURE_OF_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateFeatureOfContextClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___BEHAVIORED_CLASSIFIER__ELEMENT:
+			return behavioredClassifier((Element) arguments.get(0));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___INPUT_PARAMETERS:
+			return inputParameters();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___OUTPUT_PARAMETERS:
+			return outputParameters();
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_CONNECTION_POINTS__DIAGNOSTICCHAIN_MAP:
+			return validateConnectionPoints((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_CLASSIFIER_CONTEXT__DIAGNOSTICCHAIN_MAP:
+			return validateClassifierContext((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_METHOD__DIAGNOSTICCHAIN_MAP:
+			return validateMethod((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateContextClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___LCA__VERTEX_VERTEX:
+			return LCA((Vertex) arguments.get(0), (Vertex) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___ANCESTOR__VERTEX_VERTEX:
+			return ancestor((Vertex) arguments.get(0), (Vertex) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___LCA_STATE__VERTEX_VERTEX:
+			return LCAState((Vertex) arguments.get(0), (Vertex) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_DEEP_OR_SHALLOW_HISTORY__DIAGNOSTICCHAIN_MAP:
+			return validateDeepOrShallowHistory((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_ENTRY_EXIT_DO__DIAGNOSTICCHAIN_MAP:
+			return validateEntryExitDo((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_STATE_MACHINE___VALIDATE_PROTOCOL_TRANSITIONS__DIAGNOSTICCHAIN_MAP:
+			return validateProtocolTransitions((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1483,19 +1298,10 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_COMMENT,
-		UMLPackage.PROTOCOL_STATE_MACHINE__NAME_EXPRESSION,
-		UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT,
-		UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT,
-		UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_MEMBER,
-		UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_BINDING,
-		UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE,
-		UMLPackage.PROTOCOL_STATE_MACHINE__COLLABORATION_USE,
-		UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION,
-		UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION,
-		UMLPackage.PROTOCOL_STATE_MACHINE__INTERFACE_REALIZATION,
-		UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_COMMENT, UMLPackage.PROTOCOL_STATE_MACHINE__NAME_EXPRESSION, UMLPackage.PROTOCOL_STATE_MACHINE__ELEMENT_IMPORT,
+			UMLPackage.PROTOCOL_STATE_MACHINE__PACKAGE_IMPORT, UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_MEMBER, UMLPackage.PROTOCOL_STATE_MACHINE__TEMPLATE_BINDING, UMLPackage.PROTOCOL_STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE,
+			UMLPackage.PROTOCOL_STATE_MACHINE__COLLABORATION_USE, UMLPackage.PROTOCOL_STATE_MACHINE__GENERALIZATION, UMLPackage.PROTOCOL_STATE_MACHINE__SUBSTITUTION, UMLPackage.PROTOCOL_STATE_MACHINE__INTERFACE_REALIZATION,
+			UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1505,7 +1311,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE);
+				|| eIsSet(UMLPackage.PROTOCOL_STATE_MACHINE__CONFORMANCE);
 	}
 
 } //ProtocolStateMachineImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProtocolTransitionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProtocolTransitionImpl.java
index 32de2db..133dce3 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProtocolTransitionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ProtocolTransitionImpl.java
@@ -1,37 +1,48 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
+
 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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedEObjectEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectContainmentWithInverseEList;
+
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.CallEvent;
 import org.eclipse.uml2.uml.Comment;
@@ -56,6 +67,7 @@
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.Vertex;
 import org.eclipse.uml2.uml.VisibilityKind;
+
 import org.eclipse.uml2.uml.internal.operations.ProtocolTransitionOperations;
 
 /**
@@ -98,17 +110,9 @@
 		return UMLPackage.Literals.PROTOCOL_TRANSITION;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.NAMESPACE__OWNED_RULE) {
 			return createOwnedRulesList();
 		}
@@ -124,15 +128,13 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Constraint> getOwnedRules() {
-		return (EList<Constraint>) eDynamicGet(
-			UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMESPACE__OWNED_RULE, true, true);
+		return (EList<Constraint>) eDynamicGet(UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMESPACE__OWNED_RULE, true, true);
 	}
 
 	private EList<Constraint> createOwnedRulesList() {
 		return new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Constraint>(
-			Constraint.class, this, UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE,
-			null, OWNED_RULE_ESUBSETS, UMLPackage.CONSTRAINT__CONTEXT);
+				Constraint.class, this, UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE,
+				null, OWNED_RULE_ESUBSETS, UMLPackage.CONSTRAINT__CONTEXT);
 	}
 
 	/**
@@ -143,9 +145,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_RULE_ESUBSETS = new int[]{
-		UMLPackage.PROTOCOL_TRANSITION__GUARD,
-		UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION};
+	protected static final int[] OWNED_RULE_ESUBSETS = new int[] { UMLPackage.PROTOCOL_TRANSITION__GUARD, UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -154,9 +154,7 @@
 	 */
 	@Override
 	public Constraint getGuard() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.PROTOCOL_TRANSITION__GUARD - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__GUARD, true, true);
+		return (Constraint) eDynamicGet(UMLPackage.PROTOCOL_TRANSITION__GUARD - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__GUARD, true, true);
 	}
 
 	/**
@@ -166,9 +164,7 @@
 	 */
 	@Override
 	public Constraint basicGetGuard() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.PROTOCOL_TRANSITION__GUARD - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__GUARD, false, true);
+		return (Constraint) eDynamicGet(UMLPackage.PROTOCOL_TRANSITION__GUARD - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__GUARD, false, true);
 	}
 
 	/**
@@ -178,9 +174,7 @@
 	 */
 	@Override
 	public void setGuard(Constraint newGuard) {
-		eDynamicSet(
-			UMLPackage.PROTOCOL_TRANSITION__GUARD - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__GUARD, newGuard);
+		eDynamicSet(UMLPackage.PROTOCOL_TRANSITION__GUARD - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__GUARD, newGuard);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			Constraint preCondition = getPreCondition();
@@ -202,11 +196,7 @@
 	 * @generated
 	 */
 	public Constraint getPostCondition() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROTOCOL_TRANSITION__POST_CONDITION, true,
-			true);
+		return (Constraint) eDynamicGet(UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROTOCOL_TRANSITION__POST_CONDITION, true, true);
 	}
 
 	/**
@@ -215,11 +205,7 @@
 	 * @generated
 	 */
 	public Constraint basicGetPostCondition() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROTOCOL_TRANSITION__POST_CONDITION, false,
-			true);
+		return (Constraint) eDynamicGet(UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROTOCOL_TRANSITION__POST_CONDITION, false, true);
 	}
 
 	/**
@@ -228,11 +214,7 @@
 	 * @generated
 	 */
 	public void setPostCondition(Constraint newPostCondition) {
-		eDynamicSet(
-			UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROTOCOL_TRANSITION__POST_CONDITION,
-			newPostCondition);
+		eDynamicSet(UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROTOCOL_TRANSITION__POST_CONDITION, newPostCondition);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newPostCondition != null) {
@@ -277,7 +259,7 @@
 		@Override
 		public List<Operation> basicList() {
 			return new ReferredEList(dataClass, owner, featureID,
-				sourceFeatureIDs) {
+					sourceFeatureIDs) {
 
 				@Override
 				public ListIterator<Operation> listIterator(int index) {
@@ -295,8 +277,8 @@
 		protected Operation derive(Object object) {
 			Event event = ((Trigger) object).getEvent();
 			return event instanceof CallEvent
-				? ((CallEvent) event).getOperation()
-				: null;
+					? ((CallEvent) event).getOperation()
+					: null;
 		}
 
 	}
@@ -305,8 +287,8 @@
 	 * The array of superset feature identifiers for the '{@link #getReferreds() <em>Referred</em>}' reference list.
 	 * @see #getReferreds()
 	 */
-	protected static final int[] REFERRED_ESUPERSETS = new int[]{
-		UMLPackage.PROTOCOL_TRANSITION__TRIGGER};
+	protected static final int[] REFERRED_ESUPERSETS = new int[] {
+			UMLPackage.PROTOCOL_TRANSITION__TRIGGER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -319,18 +301,18 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<Operation> referreds = (EList<Operation>) cache.get(eResource,
-				this, UMLPackage.Literals.PROTOCOL_TRANSITION__REFERRED);
+					this, UMLPackage.Literals.PROTOCOL_TRANSITION__REFERRED);
 			if (referreds == null) {
 				cache.put(eResource, this,
-					UMLPackage.Literals.PROTOCOL_TRANSITION__REFERRED,
-					referreds = new ReferredEList(Operation.class, this,
-						UMLPackage.PROTOCOL_TRANSITION__REFERRED,
-						REFERRED_ESUPERSETS));
+						UMLPackage.Literals.PROTOCOL_TRANSITION__REFERRED,
+						referreds = new ReferredEList(Operation.class, this,
+								UMLPackage.PROTOCOL_TRANSITION__REFERRED,
+								REFERRED_ESUPERSETS));
 			}
 			return referreds;
 		}
 		return new ReferredEList(Operation.class, this,
-			UMLPackage.PROTOCOL_TRANSITION__REFERRED, REFERRED_ESUPERSETS);
+				UMLPackage.PROTOCOL_TRANSITION__REFERRED, REFERRED_ESUPERSETS);
 	}
 
 	/**
@@ -340,8 +322,7 @@
 	 */
 	public Operation getReferred(String name, EList<String> ownedParameterNames,
 			EList<Type> ownedParameterTypes) {
-		return getReferred(name, ownedParameterNames, ownedParameterTypes,
-			false);
+		return getReferred(name, ownedParameterNames, ownedParameterTypes, false);
 	}
 
 	/**
@@ -351,28 +332,18 @@
 	 */
 	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())))
+		referredLoop: for (Operation referred : getReferreds()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(referred.getName()) : name.equals(referred.getName())))
 				continue referredLoop;
 			EList<Parameter> ownedParameterList = referred.getOwnedParameters();
 			int ownedParameterListSize = ownedParameterList.size();
-			if (ownedParameterNames != null
-				&& ownedParameterNames.size() != ownedParameterListSize
-				|| (ownedParameterTypes != null
-					&& ownedParameterTypes.size() != ownedParameterListSize))
+			if (ownedParameterNames != null && ownedParameterNames.size() != ownedParameterListSize || (ownedParameterTypes != null && ownedParameterTypes.size() != ownedParameterListSize))
 				continue referredLoop;
 			for (int j = 0; j < ownedParameterListSize; j++) {
 				Parameter ownedParameter = ownedParameterList.get(j);
-				if (ownedParameterNames != null && !(ignoreCase
-					? (ownedParameterNames.get(j))
-						.equalsIgnoreCase(ownedParameter.getName())
-					: ownedParameterNames.get(j)
-						.equals(ownedParameter.getName())))
+				if (ownedParameterNames != null && !(ignoreCase ? (ownedParameterNames.get(j)).equalsIgnoreCase(ownedParameter.getName()) : ownedParameterNames.get(j).equals(ownedParameter.getName())))
 					continue referredLoop;
-				if (ownedParameterTypes != null && !ownedParameterTypes.get(j)
-					.equals(ownedParameter.getType()))
+				if (ownedParameterTypes != null && !ownedParameterTypes.get(j).equals(ownedParameter.getType()))
 					continue referredLoop;
 			}
 			return referred;
@@ -386,10 +357,7 @@
 	 * @generated
 	 */
 	public Constraint getPreCondition() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.PROTOCOL_TRANSITION__PRE_CONDITION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROTOCOL_TRANSITION__PRE_CONDITION, true, true);
+		return (Constraint) eDynamicGet(UMLPackage.PROTOCOL_TRANSITION__PRE_CONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROTOCOL_TRANSITION__PRE_CONDITION, true, true);
 	}
 
 	/**
@@ -398,11 +366,7 @@
 	 * @generated
 	 */
 	public Constraint basicGetPreCondition() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.PROTOCOL_TRANSITION__PRE_CONDITION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROTOCOL_TRANSITION__PRE_CONDITION, false,
-			true);
+		return (Constraint) eDynamicGet(UMLPackage.PROTOCOL_TRANSITION__PRE_CONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROTOCOL_TRANSITION__PRE_CONDITION, false, true);
 	}
 
 	/**
@@ -411,11 +375,7 @@
 	 * @generated
 	 */
 	public void setPreCondition(Constraint newPreCondition) {
-		eDynamicSet(
-			UMLPackage.PROTOCOL_TRANSITION__PRE_CONDITION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PROTOCOL_TRANSITION__PRE_CONDITION,
-			newPreCondition);
+		eDynamicSet(UMLPackage.PROTOCOL_TRANSITION__PRE_CONDITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PROTOCOL_TRANSITION__PRE_CONDITION, newPreCondition);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newPreCondition != null) {
@@ -433,8 +393,7 @@
 	 */
 	public boolean validateBelongsToPsm(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ProtocolTransitionOperations.validateBelongsToPsm(this,
-			diagnostics, context);
+		return ProtocolTransitionOperations.validateBelongsToPsm(this, diagnostics, context);
 	}
 
 	/**
@@ -444,8 +403,7 @@
 	 */
 	public boolean validateAssociatedActions(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ProtocolTransitionOperations.validateAssociatedActions(this,
-			diagnostics, context);
+		return ProtocolTransitionOperations.validateAssociatedActions(this, diagnostics, context);
 	}
 
 	/**
@@ -455,8 +413,7 @@
 	 */
 	public boolean validateRefersToOperation(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ProtocolTransitionOperations.validateRefersToOperation(this,
-			diagnostics, context);
+		return ProtocolTransitionOperations.validateRefersToOperation(this, diagnostics, context);
 	}
 
 	/**
@@ -469,22 +426,18 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_TRANSITION__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_TRANSITION__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_TRANSITION__CONTAINER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetContainer((Region) otherEnd, msgs);
+		case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_TRANSITION__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_TRANSITION__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_TRANSITION__CONTAINER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetContainer((Region) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -498,30 +451,24 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_TRANSITION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_TRANSITION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_TRANSITION__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_TRANSITION__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PROTOCOL_TRANSITION__EFFECT :
-				return basicSetEffect(null, msgs);
-			case UMLPackage.PROTOCOL_TRANSITION__TRIGGER :
-				return ((InternalEList<?>) getTriggers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.PROTOCOL_TRANSITION__CONTAINER :
-				return basicSetContainer(null, msgs);
+		case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_TRANSITION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_TRANSITION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_TRANSITION__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_TRANSITION__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_TRANSITION__EFFECT:
+			return basicSetEffect(null, msgs);
+		case UMLPackage.PROTOCOL_TRANSITION__TRIGGER:
+			return ((InternalEList<?>) getTriggers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PROTOCOL_TRANSITION__CONTAINER:
+			return basicSetContainer(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -534,88 +481,88 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PROTOCOL_TRANSITION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PROTOCOL_TRANSITION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PROTOCOL_TRANSITION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PROTOCOL_TRANSITION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.PROTOCOL_TRANSITION__NAME :
-				return getName();
-			case UMLPackage.PROTOCOL_TRANSITION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.PROTOCOL_TRANSITION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.PROTOCOL_TRANSITION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PROTOCOL_TRANSITION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.PROTOCOL_TRANSITION__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.PROTOCOL_TRANSITION__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.PROTOCOL_TRANSITION__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.PROTOCOL_TRANSITION__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.PROTOCOL_TRANSITION__MEMBER :
-				return getMembers();
-			case UMLPackage.PROTOCOL_TRANSITION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.PROTOCOL_TRANSITION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.PROTOCOL_TRANSITION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.PROTOCOL_TRANSITION__EFFECT :
-				if (resolve)
-					return getEffect();
-				return basicGetEffect();
-			case UMLPackage.PROTOCOL_TRANSITION__GUARD :
-				if (resolve)
-					return getGuard();
-				return basicGetGuard();
-			case UMLPackage.PROTOCOL_TRANSITION__KIND :
-				return getKind();
-			case UMLPackage.PROTOCOL_TRANSITION__REDEFINED_TRANSITION :
-				if (resolve)
-					return getRedefinedTransition();
-				return basicGetRedefinedTransition();
-			case UMLPackage.PROTOCOL_TRANSITION__SOURCE :
-				if (resolve)
-					return getSource();
-				return basicGetSource();
-			case UMLPackage.PROTOCOL_TRANSITION__TARGET :
-				if (resolve)
-					return getTarget();
-				return basicGetTarget();
-			case UMLPackage.PROTOCOL_TRANSITION__TRIGGER :
-				return getTriggers();
-			case UMLPackage.PROTOCOL_TRANSITION__CONTAINER :
-				if (resolve)
-					return getContainer();
-				return basicGetContainer();
-			case UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION :
-				if (resolve)
-					return getPostCondition();
-				return basicGetPostCondition();
-			case UMLPackage.PROTOCOL_TRANSITION__PRE_CONDITION :
-				if (resolve)
-					return getPreCondition();
-				return basicGetPreCondition();
-			case UMLPackage.PROTOCOL_TRANSITION__REFERRED :
-				return getReferreds();
+		case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PROTOCOL_TRANSITION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PROTOCOL_TRANSITION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PROTOCOL_TRANSITION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PROTOCOL_TRANSITION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.PROTOCOL_TRANSITION__NAME:
+			return getName();
+		case UMLPackage.PROTOCOL_TRANSITION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.PROTOCOL_TRANSITION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.PROTOCOL_TRANSITION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PROTOCOL_TRANSITION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.PROTOCOL_TRANSITION__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.PROTOCOL_TRANSITION__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.PROTOCOL_TRANSITION__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.PROTOCOL_TRANSITION__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.PROTOCOL_TRANSITION__MEMBER:
+			return getMembers();
+		case UMLPackage.PROTOCOL_TRANSITION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.PROTOCOL_TRANSITION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.PROTOCOL_TRANSITION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.PROTOCOL_TRANSITION__EFFECT:
+			if (resolve)
+				return getEffect();
+			return basicGetEffect();
+		case UMLPackage.PROTOCOL_TRANSITION__GUARD:
+			if (resolve)
+				return getGuard();
+			return basicGetGuard();
+		case UMLPackage.PROTOCOL_TRANSITION__KIND:
+			return getKind();
+		case UMLPackage.PROTOCOL_TRANSITION__REDEFINED_TRANSITION:
+			if (resolve)
+				return getRedefinedTransition();
+			return basicGetRedefinedTransition();
+		case UMLPackage.PROTOCOL_TRANSITION__SOURCE:
+			if (resolve)
+				return getSource();
+			return basicGetSource();
+		case UMLPackage.PROTOCOL_TRANSITION__TARGET:
+			if (resolve)
+				return getTarget();
+			return basicGetTarget();
+		case UMLPackage.PROTOCOL_TRANSITION__TRIGGER:
+			return getTriggers();
+		case UMLPackage.PROTOCOL_TRANSITION__CONTAINER:
+			if (resolve)
+				return getContainer();
+			return basicGetContainer();
+		case UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION:
+			if (resolve)
+				return getPostCondition();
+			return basicGetPostCondition();
+		case UMLPackage.PROTOCOL_TRANSITION__PRE_CONDITION:
+			if (resolve)
+				return getPreCondition();
+			return basicGetPreCondition();
+		case UMLPackage.PROTOCOL_TRANSITION__REFERRED:
+			return getReferreds();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -629,74 +576,69 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__EFFECT :
-				setEffect((Behavior) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__GUARD :
-				setGuard((Constraint) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__KIND :
-				setKind((TransitionKind) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__REDEFINED_TRANSITION :
-				setRedefinedTransition((Transition) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__SOURCE :
-				setSource((Vertex) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__TARGET :
-				setTarget((Vertex) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__TRIGGER :
-				getTriggers().clear();
-				getTriggers().addAll((Collection<? extends Trigger>) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__CONTAINER :
-				setContainer((Region) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION :
-				setPostCondition((Constraint) newValue);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__PRE_CONDITION :
-				setPreCondition((Constraint) newValue);
-				return;
+		case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__EFFECT:
+			setEffect((Behavior) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__GUARD:
+			setGuard((Constraint) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__KIND:
+			setKind((TransitionKind) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__REDEFINED_TRANSITION:
+			setRedefinedTransition((Transition) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__SOURCE:
+			setSource((Vertex) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__TARGET:
+			setTarget((Vertex) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__TRIGGER:
+			getTriggers().clear();
+			getTriggers().addAll((Collection<? extends Trigger>) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__CONTAINER:
+			setContainer((Region) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION:
+			setPostCondition((Constraint) newValue);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__PRE_CONDITION:
+			setPreCondition((Constraint) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -709,63 +651,63 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__EFFECT :
-				setEffect((Behavior) null);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__GUARD :
-				setGuard((Constraint) null);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__KIND :
-				setKind(KIND_EDEFAULT);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__REDEFINED_TRANSITION :
-				setRedefinedTransition((Transition) null);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__SOURCE :
-				setSource((Vertex) null);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__TARGET :
-				setTarget((Vertex) null);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__TRIGGER :
-				getTriggers().clear();
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__CONTAINER :
-				setContainer((Region) null);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION :
-				setPostCondition((Constraint) null);
-				return;
-			case UMLPackage.PROTOCOL_TRANSITION__PRE_CONDITION :
-				setPreCondition((Constraint) null);
-				return;
+		case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__EFFECT:
+			setEffect((Behavior) null);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__GUARD:
+			setGuard((Constraint) null);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__KIND:
+			setKind(KIND_EDEFAULT);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__REDEFINED_TRANSITION:
+			setRedefinedTransition((Transition) null);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__SOURCE:
+			setSource((Vertex) null);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__TARGET:
+			setTarget((Vertex) null);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__TRIGGER:
+			getTriggers().clear();
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__CONTAINER:
+			setContainer((Region) null);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION:
+			setPostCondition((Constraint) null);
+			return;
+		case UMLPackage.PROTOCOL_TRANSITION__PRE_CONDITION:
+			setPreCondition((Constraint) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -778,68 +720,66 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PROTOCOL_TRANSITION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PROTOCOL_TRANSITION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PROTOCOL_TRANSITION__OWNER :
-				return isSetOwner();
-			case UMLPackage.PROTOCOL_TRANSITION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.PROTOCOL_TRANSITION__NAME :
-				return isSetName();
-			case UMLPackage.PROTOCOL_TRANSITION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.PROTOCOL_TRANSITION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.PROTOCOL_TRANSITION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.PROTOCOL_TRANSITION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.PROTOCOL_TRANSITION__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.PROTOCOL_TRANSITION__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.PROTOCOL_TRANSITION__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.PROTOCOL_TRANSITION__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.PROTOCOL_TRANSITION__MEMBER :
-				return isSetMembers();
-			case UMLPackage.PROTOCOL_TRANSITION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.PROTOCOL_TRANSITION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.PROTOCOL_TRANSITION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.PROTOCOL_TRANSITION__EFFECT :
-				return basicGetEffect() != null;
-			case UMLPackage.PROTOCOL_TRANSITION__GUARD :
-				return basicGetGuard() != null;
-			case UMLPackage.PROTOCOL_TRANSITION__KIND :
-				return getKind() != KIND_EDEFAULT;
-			case UMLPackage.PROTOCOL_TRANSITION__REDEFINED_TRANSITION :
-				return basicGetRedefinedTransition() != null;
-			case UMLPackage.PROTOCOL_TRANSITION__SOURCE :
-				return basicGetSource() != null;
-			case UMLPackage.PROTOCOL_TRANSITION__TARGET :
-				return basicGetTarget() != null;
-			case UMLPackage.PROTOCOL_TRANSITION__TRIGGER :
-				return !getTriggers().isEmpty();
-			case UMLPackage.PROTOCOL_TRANSITION__CONTAINER :
-				return basicGetContainer() != null;
-			case UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION :
-				return basicGetPostCondition() != null;
-			case UMLPackage.PROTOCOL_TRANSITION__PRE_CONDITION :
-				return basicGetPreCondition() != null;
-			case UMLPackage.PROTOCOL_TRANSITION__REFERRED :
-				return !getReferreds().isEmpty();
+		case UMLPackage.PROTOCOL_TRANSITION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PROTOCOL_TRANSITION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PROTOCOL_TRANSITION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PROTOCOL_TRANSITION__OWNER:
+			return isSetOwner();
+		case UMLPackage.PROTOCOL_TRANSITION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.PROTOCOL_TRANSITION__NAME:
+			return isSetName();
+		case UMLPackage.PROTOCOL_TRANSITION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.PROTOCOL_TRANSITION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.PROTOCOL_TRANSITION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.PROTOCOL_TRANSITION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.PROTOCOL_TRANSITION__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.PROTOCOL_TRANSITION__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.PROTOCOL_TRANSITION__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.PROTOCOL_TRANSITION__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.PROTOCOL_TRANSITION__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.PROTOCOL_TRANSITION__MEMBER:
+			return isSetMembers();
+		case UMLPackage.PROTOCOL_TRANSITION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.PROTOCOL_TRANSITION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.PROTOCOL_TRANSITION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.PROTOCOL_TRANSITION__EFFECT:
+			return basicGetEffect() != null;
+		case UMLPackage.PROTOCOL_TRANSITION__GUARD:
+			return basicGetGuard() != null;
+		case UMLPackage.PROTOCOL_TRANSITION__KIND:
+			return getKind() != KIND_EDEFAULT;
+		case UMLPackage.PROTOCOL_TRANSITION__REDEFINED_TRANSITION:
+			return basicGetRedefinedTransition() != null;
+		case UMLPackage.PROTOCOL_TRANSITION__SOURCE:
+			return basicGetSource() != null;
+		case UMLPackage.PROTOCOL_TRANSITION__TARGET:
+			return basicGetTarget() != null;
+		case UMLPackage.PROTOCOL_TRANSITION__TRIGGER:
+			return !getTriggers().isEmpty();
+		case UMLPackage.PROTOCOL_TRANSITION__CONTAINER:
+			return basicGetContainer() != null;
+		case UMLPackage.PROTOCOL_TRANSITION__POST_CONDITION:
+			return basicGetPostCondition() != null;
+		case UMLPackage.PROTOCOL_TRANSITION__PRE_CONDITION:
+			return basicGetPreCondition() != null;
+		case UMLPackage.PROTOCOL_TRANSITION__REFERRED:
+			return !getReferreds().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -854,232 +794,176 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.PROTOCOL_TRANSITION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.PROTOCOL_TRANSITION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.PROTOCOL_TRANSITION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.PROTOCOL_TRANSITION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.PROTOCOL_TRANSITION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_MODEL :
-				return getModel();
-			case UMLPackage.PROTOCOL_TRANSITION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.PROTOCOL_TRANSITION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.PROTOCOL_TRANSITION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.PROTOCOL_TRANSITION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.PROTOCOL_TRANSITION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.PROTOCOL_TRANSITION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.PROTOCOL_TRANSITION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.PROTOCOL_TRANSITION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.PROTOCOL_TRANSITION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.PROTOCOL_TRANSITION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.PROTOCOL_TRANSITION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.PROTOCOL_TRANSITION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.PROTOCOL_TRANSITION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PROTOCOL_TRANSITION___SEPARATOR :
-				return separator();
-			case UMLPackage.PROTOCOL_TRANSITION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.PROTOCOL_TRANSITION___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.PROTOCOL_TRANSITION___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.PROTOCOL_TRANSITION___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.PROTOCOL_TRANSITION___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_STATE_IS_EXTERNAL__DIAGNOSTICCHAIN_MAP :
-				return validateStateIsExternal(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_JOIN_SEGMENT_GUARDS__DIAGNOSTICCHAIN_MAP :
-				return validateJoinSegmentGuards(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_STATE_IS_INTERNAL__DIAGNOSTICCHAIN_MAP :
-				return validateStateIsInternal(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_OUTGOING_PSEUDOSTATES__DIAGNOSTICCHAIN_MAP :
-				return validateOutgoingPseudostates(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_JOIN_SEGMENT_STATE__DIAGNOSTICCHAIN_MAP :
-				return validateJoinSegmentState(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_FORK_SEGMENT_STATE__DIAGNOSTICCHAIN_MAP :
-				return validateForkSegmentState(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_STATE_IS_LOCAL__DIAGNOSTICCHAIN_MAP :
-				return validateStateIsLocal((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_INITIAL_TRANSITION__DIAGNOSTICCHAIN_MAP :
-				return validateInitialTransition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_FORK_SEGMENT_GUARDS__DIAGNOSTICCHAIN_MAP :
-				return validateForkSegmentGuards(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___CONTAINING_STATE_MACHINE :
-				return containingStateMachine();
-			case UMLPackage.PROTOCOL_TRANSITION___REDEFINITION_CONTEXT :
-				return redefinitionContext();
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_REFERS_TO_OPERATION__DIAGNOSTICCHAIN_MAP :
-				return validateRefersToOperation(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_ASSOCIATED_ACTIONS__DIAGNOSTICCHAIN_MAP :
-				return validateAssociatedActions(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_BELONGS_TO_PSM__DIAGNOSTICCHAIN_MAP :
-				return validateBelongsToPsm((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PROTOCOL_TRANSITION___GET_REFERREDS :
-				return getReferreds();
+		case UMLPackage.PROTOCOL_TRANSITION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.PROTOCOL_TRANSITION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.PROTOCOL_TRANSITION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.PROTOCOL_TRANSITION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.PROTOCOL_TRANSITION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_MODEL:
+			return getModel();
+		case UMLPackage.PROTOCOL_TRANSITION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.PROTOCOL_TRANSITION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.PROTOCOL_TRANSITION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.PROTOCOL_TRANSITION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.PROTOCOL_TRANSITION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.PROTOCOL_TRANSITION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.PROTOCOL_TRANSITION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.PROTOCOL_TRANSITION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.PROTOCOL_TRANSITION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.PROTOCOL_TRANSITION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.PROTOCOL_TRANSITION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.PROTOCOL_TRANSITION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.PROTOCOL_TRANSITION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PROTOCOL_TRANSITION___SEPARATOR:
+			return separator();
+		case UMLPackage.PROTOCOL_TRANSITION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.PROTOCOL_TRANSITION___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.PROTOCOL_TRANSITION___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.PROTOCOL_TRANSITION___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.PROTOCOL_TRANSITION___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_STATE_IS_EXTERNAL__DIAGNOSTICCHAIN_MAP:
+			return validateStateIsExternal((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_JOIN_SEGMENT_GUARDS__DIAGNOSTICCHAIN_MAP:
+			return validateJoinSegmentGuards((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_STATE_IS_INTERNAL__DIAGNOSTICCHAIN_MAP:
+			return validateStateIsInternal((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_OUTGOING_PSEUDOSTATES__DIAGNOSTICCHAIN_MAP:
+			return validateOutgoingPseudostates((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_JOIN_SEGMENT_STATE__DIAGNOSTICCHAIN_MAP:
+			return validateJoinSegmentState((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_FORK_SEGMENT_STATE__DIAGNOSTICCHAIN_MAP:
+			return validateForkSegmentState((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_STATE_IS_LOCAL__DIAGNOSTICCHAIN_MAP:
+			return validateStateIsLocal((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_INITIAL_TRANSITION__DIAGNOSTICCHAIN_MAP:
+			return validateInitialTransition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_FORK_SEGMENT_GUARDS__DIAGNOSTICCHAIN_MAP:
+			return validateForkSegmentGuards((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___CONTAINING_STATE_MACHINE:
+			return containingStateMachine();
+		case UMLPackage.PROTOCOL_TRANSITION___REDEFINITION_CONTEXT:
+			return redefinitionContext();
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_REFERS_TO_OPERATION__DIAGNOSTICCHAIN_MAP:
+			return validateRefersToOperation((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_ASSOCIATED_ACTIONS__DIAGNOSTICCHAIN_MAP:
+			return validateAssociatedActions((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___VALIDATE_BELONGS_TO_PSM__DIAGNOSTICCHAIN_MAP:
+			return validateBelongsToPsm((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PROTOCOL_TRANSITION___GET_REFERREDS:
+			return getReferreds();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PseudostateImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PseudostateImpl.java
index 656b3f2..926cecf 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PseudostateImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/PseudostateImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,9 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Comment;
@@ -101,9 +105,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -112,9 +114,7 @@
 	 * @generated
 	 */
 	public PseudostateKind getKind() {
-		return (PseudostateKind) eDynamicGet(
-			UMLPackage.PSEUDOSTATE__KIND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PSEUDOSTATE__KIND, true, true);
+		return (PseudostateKind) eDynamicGet(UMLPackage.PSEUDOSTATE__KIND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PSEUDOSTATE__KIND, true, true);
 	}
 
 	/**
@@ -123,8 +123,7 @@
 	 * @generated
 	 */
 	public void setKind(PseudostateKind newKind) {
-		eDynamicSet(UMLPackage.PSEUDOSTATE__KIND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PSEUDOSTATE__KIND, newKind);
+		eDynamicSet(UMLPackage.PSEUDOSTATE__KIND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PSEUDOSTATE__KIND, newKind);
 	}
 
 	/**
@@ -133,9 +132,7 @@
 	 * @generated
 	 */
 	public StateMachine getStateMachine() {
-		return (StateMachine) eDynamicGet(
-			UMLPackage.PSEUDOSTATE__STATE_MACHINE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PSEUDOSTATE__STATE_MACHINE, true, true);
+		return (StateMachine) eDynamicGet(UMLPackage.PSEUDOSTATE__STATE_MACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PSEUDOSTATE__STATE_MACHINE, true, true);
 	}
 
 	/**
@@ -144,9 +141,7 @@
 	 * @generated
 	 */
 	public StateMachine basicGetStateMachine() {
-		return (StateMachine) eDynamicGet(
-			UMLPackage.PSEUDOSTATE__STATE_MACHINE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PSEUDOSTATE__STATE_MACHINE, false, true);
+		return (StateMachine) eDynamicGet(UMLPackage.PSEUDOSTATE__STATE_MACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PSEUDOSTATE__STATE_MACHINE, false, true);
 	}
 
 	/**
@@ -156,8 +151,7 @@
 	 */
 	public NotificationChain basicSetStateMachine(StateMachine newStateMachine,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newStateMachine,
-			UMLPackage.PSEUDOSTATE__STATE_MACHINE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newStateMachine, UMLPackage.PSEUDOSTATE__STATE_MACHINE, msgs);
 		return msgs;
 	}
 
@@ -167,9 +161,7 @@
 	 * @generated
 	 */
 	public void setStateMachine(StateMachine newStateMachine) {
-		eDynamicSet(
-			UMLPackage.PSEUDOSTATE__STATE_MACHINE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PSEUDOSTATE__STATE_MACHINE, newStateMachine);
+		eDynamicSet(UMLPackage.PSEUDOSTATE__STATE_MACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PSEUDOSTATE__STATE_MACHINE, newStateMachine);
 	}
 
 	/**
@@ -178,9 +170,7 @@
 	 * @generated
 	 */
 	public State getState() {
-		return (State) eDynamicGet(
-			UMLPackage.PSEUDOSTATE__STATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PSEUDOSTATE__STATE, true, true);
+		return (State) eDynamicGet(UMLPackage.PSEUDOSTATE__STATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PSEUDOSTATE__STATE, true, true);
 	}
 
 	/**
@@ -189,9 +179,7 @@
 	 * @generated
 	 */
 	public State basicGetState() {
-		return (State) eDynamicGet(
-			UMLPackage.PSEUDOSTATE__STATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PSEUDOSTATE__STATE, false, true);
+		return (State) eDynamicGet(UMLPackage.PSEUDOSTATE__STATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PSEUDOSTATE__STATE, false, true);
 	}
 
 	/**
@@ -201,8 +189,7 @@
 	 */
 	public NotificationChain basicSetState(State newState,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newState,
-			UMLPackage.PSEUDOSTATE__STATE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newState, UMLPackage.PSEUDOSTATE__STATE, msgs);
 		return msgs;
 	}
 
@@ -212,8 +199,7 @@
 	 * @generated
 	 */
 	public void setState(State newState) {
-		eDynamicSet(UMLPackage.PSEUDOSTATE__STATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.PSEUDOSTATE__STATE, newState);
+		eDynamicSet(UMLPackage.PSEUDOSTATE__STATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.PSEUDOSTATE__STATE, newState);
 	}
 
 	/**
@@ -223,8 +209,7 @@
 	 */
 	public boolean validateInitialVertex(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PseudostateOperations.validateInitialVertex(this, diagnostics,
-			context);
+		return PseudostateOperations.validateInitialVertex(this, diagnostics, context);
 	}
 
 	/**
@@ -234,8 +219,7 @@
 	 */
 	public boolean validateHistoryVertices(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PseudostateOperations.validateHistoryVertices(this, diagnostics,
-			context);
+		return PseudostateOperations.validateHistoryVertices(this, diagnostics, context);
 	}
 
 	/**
@@ -245,8 +229,7 @@
 	 */
 	public boolean validateJoinVertex(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PseudostateOperations.validateJoinVertex(this, diagnostics,
-			context);
+		return PseudostateOperations.validateJoinVertex(this, diagnostics, context);
 	}
 
 	/**
@@ -256,8 +239,7 @@
 	 */
 	public boolean validateTransitionsIncoming(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PseudostateOperations.validateTransitionsIncoming(this,
-			diagnostics, context);
+		return PseudostateOperations.validateTransitionsIncoming(this, diagnostics, context);
 	}
 
 	/**
@@ -267,8 +249,7 @@
 	 */
 	public boolean validateForkVertex(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PseudostateOperations.validateForkVertex(this, diagnostics,
-			context);
+		return PseudostateOperations.validateForkVertex(this, diagnostics, context);
 	}
 
 	/**
@@ -278,8 +259,7 @@
 	 */
 	public boolean validateTransitionsOutgoing(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PseudostateOperations.validateTransitionsOutgoing(this,
-			diagnostics, context);
+		return PseudostateOperations.validateTransitionsOutgoing(this, diagnostics, context);
 	}
 
 	/**
@@ -289,8 +269,7 @@
 	 */
 	public boolean validateJunctionVertex(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PseudostateOperations.validateJunctionVertex(this, diagnostics,
-			context);
+		return PseudostateOperations.validateJunctionVertex(this, diagnostics, context);
 	}
 
 	/**
@@ -300,8 +279,7 @@
 	 */
 	public boolean validateChoiceVertex(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PseudostateOperations.validateChoiceVertex(this, diagnostics,
-			context);
+		return PseudostateOperations.validateChoiceVertex(this, diagnostics, context);
 	}
 
 	/**
@@ -311,8 +289,7 @@
 	 */
 	public boolean validateOutgoingFromInitial(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return PseudostateOperations.validateOutgoingFromInitial(this,
-			diagnostics, context);
+		return PseudostateOperations.validateOutgoingFromInitial(this, diagnostics, context);
 	}
 
 	/**
@@ -325,21 +302,20 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PSEUDOSTATE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.PSEUDOSTATE__CONTAINER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetContainer((Region) otherEnd, msgs);
-			case UMLPackage.PSEUDOSTATE__STATE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetState((State) otherEnd, msgs);
-			case UMLPackage.PSEUDOSTATE__STATE_MACHINE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetStateMachine((StateMachine) otherEnd, msgs);
+		case UMLPackage.PSEUDOSTATE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.PSEUDOSTATE__CONTAINER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetContainer((Region) otherEnd, msgs);
+		case UMLPackage.PSEUDOSTATE__STATE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetState((State) otherEnd, msgs);
+		case UMLPackage.PSEUDOSTATE__STATE_MACHINE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetStateMachine((StateMachine) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -353,20 +329,18 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.PSEUDOSTATE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PSEUDOSTATE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.PSEUDOSTATE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.PSEUDOSTATE__CONTAINER :
-				return basicSetContainer(null, msgs);
-			case UMLPackage.PSEUDOSTATE__STATE :
-				return basicSetState(null, msgs);
-			case UMLPackage.PSEUDOSTATE__STATE_MACHINE :
-				return basicSetStateMachine(null, msgs);
+		case UMLPackage.PSEUDOSTATE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PSEUDOSTATE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.PSEUDOSTATE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.PSEUDOSTATE__CONTAINER:
+			return basicSetContainer(null, msgs);
+		case UMLPackage.PSEUDOSTATE__STATE:
+			return basicSetState(null, msgs);
+		case UMLPackage.PSEUDOSTATE__STATE_MACHINE:
+			return basicSetStateMachine(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -380,16 +354,12 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.PSEUDOSTATE__CONTAINER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.REGION__SUBVERTEX, Region.class, msgs);
-			case UMLPackage.PSEUDOSTATE__STATE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.STATE__CONNECTION_POINT, State.class, msgs);
-			case UMLPackage.PSEUDOSTATE__STATE_MACHINE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.STATE_MACHINE__CONNECTION_POINT,
-					StateMachine.class, msgs);
+		case UMLPackage.PSEUDOSTATE__CONTAINER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.REGION__SUBVERTEX, Region.class, msgs);
+		case UMLPackage.PSEUDOSTATE__STATE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.STATE__CONNECTION_POINT, State.class, msgs);
+		case UMLPackage.PSEUDOSTATE__STATE_MACHINE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.STATE_MACHINE__CONNECTION_POINT, StateMachine.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -402,50 +372,50 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.PSEUDOSTATE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.PSEUDOSTATE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.PSEUDOSTATE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.PSEUDOSTATE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.PSEUDOSTATE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.PSEUDOSTATE__NAME :
-				return getName();
-			case UMLPackage.PSEUDOSTATE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.PSEUDOSTATE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.PSEUDOSTATE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PSEUDOSTATE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.PSEUDOSTATE__CONTAINER :
-				if (resolve)
-					return getContainer();
-				return basicGetContainer();
-			case UMLPackage.PSEUDOSTATE__INCOMING :
-				return getIncomings();
-			case UMLPackage.PSEUDOSTATE__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.PSEUDOSTATE__STATE :
-				if (resolve)
-					return getState();
-				return basicGetState();
-			case UMLPackage.PSEUDOSTATE__KIND :
-				return getKind();
-			case UMLPackage.PSEUDOSTATE__STATE_MACHINE :
-				if (resolve)
-					return getStateMachine();
-				return basicGetStateMachine();
+		case UMLPackage.PSEUDOSTATE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.PSEUDOSTATE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.PSEUDOSTATE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.PSEUDOSTATE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.PSEUDOSTATE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.PSEUDOSTATE__NAME:
+			return getName();
+		case UMLPackage.PSEUDOSTATE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.PSEUDOSTATE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.PSEUDOSTATE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PSEUDOSTATE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.PSEUDOSTATE__CONTAINER:
+			if (resolve)
+				return getContainer();
+			return basicGetContainer();
+		case UMLPackage.PSEUDOSTATE__INCOMING:
+			return getIncomings();
+		case UMLPackage.PSEUDOSTATE__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.PSEUDOSTATE__STATE:
+			if (resolve)
+				return getState();
+			return basicGetState();
+		case UMLPackage.PSEUDOSTATE__KIND:
+			return getKind();
+		case UMLPackage.PSEUDOSTATE__STATE_MACHINE:
+			if (resolve)
+				return getStateMachine();
+			return basicGetStateMachine();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -459,37 +429,35 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.PSEUDOSTATE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.PSEUDOSTATE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.PSEUDOSTATE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.PSEUDOSTATE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.PSEUDOSTATE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.PSEUDOSTATE__CONTAINER :
-				setContainer((Region) newValue);
-				return;
-			case UMLPackage.PSEUDOSTATE__STATE :
-				setState((State) newValue);
-				return;
-			case UMLPackage.PSEUDOSTATE__KIND :
-				setKind((PseudostateKind) newValue);
-				return;
-			case UMLPackage.PSEUDOSTATE__STATE_MACHINE :
-				setStateMachine((StateMachine) newValue);
-				return;
+		case UMLPackage.PSEUDOSTATE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.PSEUDOSTATE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.PSEUDOSTATE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.PSEUDOSTATE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.PSEUDOSTATE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.PSEUDOSTATE__CONTAINER:
+			setContainer((Region) newValue);
+			return;
+		case UMLPackage.PSEUDOSTATE__STATE:
+			setState((State) newValue);
+			return;
+		case UMLPackage.PSEUDOSTATE__KIND:
+			setKind((PseudostateKind) newValue);
+			return;
+		case UMLPackage.PSEUDOSTATE__STATE_MACHINE:
+			setStateMachine((StateMachine) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -502,33 +470,33 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PSEUDOSTATE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.PSEUDOSTATE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.PSEUDOSTATE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.PSEUDOSTATE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.PSEUDOSTATE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.PSEUDOSTATE__CONTAINER :
-				setContainer((Region) null);
-				return;
-			case UMLPackage.PSEUDOSTATE__STATE :
-				setState((State) null);
-				return;
-			case UMLPackage.PSEUDOSTATE__KIND :
-				setKind(KIND_EDEFAULT);
-				return;
-			case UMLPackage.PSEUDOSTATE__STATE_MACHINE :
-				setStateMachine((StateMachine) null);
-				return;
+		case UMLPackage.PSEUDOSTATE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.PSEUDOSTATE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.PSEUDOSTATE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.PSEUDOSTATE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.PSEUDOSTATE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.PSEUDOSTATE__CONTAINER:
+			setContainer((Region) null);
+			return;
+		case UMLPackage.PSEUDOSTATE__STATE:
+			setState((State) null);
+			return;
+		case UMLPackage.PSEUDOSTATE__KIND:
+			setKind(KIND_EDEFAULT);
+			return;
+		case UMLPackage.PSEUDOSTATE__STATE_MACHINE:
+			setStateMachine((StateMachine) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -541,40 +509,38 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.PSEUDOSTATE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.PSEUDOSTATE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.PSEUDOSTATE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.PSEUDOSTATE__OWNER :
-				return isSetOwner();
-			case UMLPackage.PSEUDOSTATE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.PSEUDOSTATE__NAME :
-				return isSetName();
-			case UMLPackage.PSEUDOSTATE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.PSEUDOSTATE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.PSEUDOSTATE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.PSEUDOSTATE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.PSEUDOSTATE__CONTAINER :
-				return basicGetContainer() != null;
-			case UMLPackage.PSEUDOSTATE__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.PSEUDOSTATE__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.PSEUDOSTATE__STATE :
-				return basicGetState() != null;
-			case UMLPackage.PSEUDOSTATE__KIND :
-				return getKind() != KIND_EDEFAULT;
-			case UMLPackage.PSEUDOSTATE__STATE_MACHINE :
-				return basicGetStateMachine() != null;
+		case UMLPackage.PSEUDOSTATE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.PSEUDOSTATE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.PSEUDOSTATE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.PSEUDOSTATE__OWNER:
+			return isSetOwner();
+		case UMLPackage.PSEUDOSTATE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.PSEUDOSTATE__NAME:
+			return isSetName();
+		case UMLPackage.PSEUDOSTATE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.PSEUDOSTATE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.PSEUDOSTATE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.PSEUDOSTATE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.PSEUDOSTATE__CONTAINER:
+			return basicGetContainer() != null;
+		case UMLPackage.PSEUDOSTATE__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.PSEUDOSTATE__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.PSEUDOSTATE__STATE:
+			return basicGetState() != null;
+		case UMLPackage.PSEUDOSTATE__KIND:
+			return getKind() != KIND_EDEFAULT;
+		case UMLPackage.PSEUDOSTATE__STATE_MACHINE:
+			return basicGetStateMachine() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -589,167 +555,138 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.PSEUDOSTATE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.PSEUDOSTATE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.PSEUDOSTATE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.PSEUDOSTATE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.PSEUDOSTATE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___GET_MODEL :
-				return getModel();
-			case UMLPackage.PSEUDOSTATE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.PSEUDOSTATE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.PSEUDOSTATE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.PSEUDOSTATE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.PSEUDOSTATE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.PSEUDOSTATE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.PSEUDOSTATE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.PSEUDOSTATE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.PSEUDOSTATE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.PSEUDOSTATE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.PSEUDOSTATE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.PSEUDOSTATE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.PSEUDOSTATE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.PSEUDOSTATE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.PSEUDOSTATE___SEPARATOR :
-				return separator();
-			case UMLPackage.PSEUDOSTATE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.PSEUDOSTATE___CONTAINING_STATE_MACHINE :
-				return containingStateMachine();
-			case UMLPackage.PSEUDOSTATE___GET_INCOMINGS :
-				return getIncomings();
-			case UMLPackage.PSEUDOSTATE___GET_OUTGOINGS :
-				return getOutgoings();
-			case UMLPackage.PSEUDOSTATE___IS_CONTAINED_IN_STATE__STATE :
-				return isContainedInState((State) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___IS_CONTAINED_IN_REGION__REGION :
-				return isContainedInRegion((Region) arguments.get(0));
-			case UMLPackage.PSEUDOSTATE___VALIDATE_TRANSITIONS_OUTGOING__DIAGNOSTICCHAIN_MAP :
-				return validateTransitionsOutgoing(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___VALIDATE_CHOICE_VERTEX__DIAGNOSTICCHAIN_MAP :
-				return validateChoiceVertex((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___VALIDATE_OUTGOING_FROM_INITIAL__DIAGNOSTICCHAIN_MAP :
-				return validateOutgoingFromInitial(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___VALIDATE_JOIN_VERTEX__DIAGNOSTICCHAIN_MAP :
-				return validateJoinVertex((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___VALIDATE_JUNCTION_VERTEX__DIAGNOSTICCHAIN_MAP :
-				return validateJunctionVertex(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___VALIDATE_HISTORY_VERTICES__DIAGNOSTICCHAIN_MAP :
-				return validateHistoryVertices(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___VALIDATE_INITIAL_VERTEX__DIAGNOSTICCHAIN_MAP :
-				return validateInitialVertex((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___VALIDATE_FORK_VERTEX__DIAGNOSTICCHAIN_MAP :
-				return validateForkVertex((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.PSEUDOSTATE___VALIDATE_TRANSITIONS_INCOMING__DIAGNOSTICCHAIN_MAP :
-				return validateTransitionsIncoming(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.PSEUDOSTATE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.PSEUDOSTATE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.PSEUDOSTATE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.PSEUDOSTATE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___GET_MODEL:
+			return getModel();
+		case UMLPackage.PSEUDOSTATE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.PSEUDOSTATE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.PSEUDOSTATE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.PSEUDOSTATE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.PSEUDOSTATE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.PSEUDOSTATE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.PSEUDOSTATE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.PSEUDOSTATE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.PSEUDOSTATE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.PSEUDOSTATE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.PSEUDOSTATE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.PSEUDOSTATE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.PSEUDOSTATE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.PSEUDOSTATE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.PSEUDOSTATE___SEPARATOR:
+			return separator();
+		case UMLPackage.PSEUDOSTATE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.PSEUDOSTATE___CONTAINING_STATE_MACHINE:
+			return containingStateMachine();
+		case UMLPackage.PSEUDOSTATE___GET_INCOMINGS:
+			return getIncomings();
+		case UMLPackage.PSEUDOSTATE___GET_OUTGOINGS:
+			return getOutgoings();
+		case UMLPackage.PSEUDOSTATE___IS_CONTAINED_IN_STATE__STATE:
+			return isContainedInState((State) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___IS_CONTAINED_IN_REGION__REGION:
+			return isContainedInRegion((Region) arguments.get(0));
+		case UMLPackage.PSEUDOSTATE___VALIDATE_TRANSITIONS_OUTGOING__DIAGNOSTICCHAIN_MAP:
+			return validateTransitionsOutgoing((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___VALIDATE_CHOICE_VERTEX__DIAGNOSTICCHAIN_MAP:
+			return validateChoiceVertex((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___VALIDATE_OUTGOING_FROM_INITIAL__DIAGNOSTICCHAIN_MAP:
+			return validateOutgoingFromInitial((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___VALIDATE_JOIN_VERTEX__DIAGNOSTICCHAIN_MAP:
+			return validateJoinVertex((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___VALIDATE_JUNCTION_VERTEX__DIAGNOSTICCHAIN_MAP:
+			return validateJunctionVertex((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___VALIDATE_HISTORY_VERTICES__DIAGNOSTICCHAIN_MAP:
+			return validateHistoryVertices((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___VALIDATE_INITIAL_VERTEX__DIAGNOSTICCHAIN_MAP:
+			return validateInitialVertex((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___VALIDATE_FORK_VERTEX__DIAGNOSTICCHAIN_MAP:
+			return validateForkVertex((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.PSEUDOSTATE___VALIDATE_TRANSITIONS_INCOMING__DIAGNOSTICCHAIN_MAP:
+			return validateTransitionsIncoming((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -779,8 +716,9 @@
 	 */
 	@Override
 	public boolean isSetNamespace() {
-		return super.isSetNamespace() || eIsSet(UMLPackage.PSEUDOSTATE__STATE)
-			|| eIsSet(UMLPackage.PSEUDOSTATE__STATE_MACHINE);
+		return super.isSetNamespace()
+				|| eIsSet(UMLPackage.PSEUDOSTATE__STATE)
+				|| eIsSet(UMLPackage.PSEUDOSTATE__STATE_MACHINE);
 	}
 
 } //PseudostateImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/QualifierValueImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/QualifierValueImpl.java
index 62deb00..d9e38f6 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/QualifierValueImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/QualifierValueImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,11 +17,17 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+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;
@@ -74,9 +80,7 @@
 	 * @generated
 	 */
 	public Property getQualifier() {
-		return (Property) eDynamicGet(
-			UMLPackage.QUALIFIER_VALUE__QUALIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.QUALIFIER_VALUE__QUALIFIER, true, true);
+		return (Property) eDynamicGet(UMLPackage.QUALIFIER_VALUE__QUALIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.QUALIFIER_VALUE__QUALIFIER, true, true);
 	}
 
 	/**
@@ -85,9 +89,7 @@
 	 * @generated
 	 */
 	public Property basicGetQualifier() {
-		return (Property) eDynamicGet(
-			UMLPackage.QUALIFIER_VALUE__QUALIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.QUALIFIER_VALUE__QUALIFIER, false, true);
+		return (Property) eDynamicGet(UMLPackage.QUALIFIER_VALUE__QUALIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.QUALIFIER_VALUE__QUALIFIER, false, true);
 	}
 
 	/**
@@ -96,9 +98,7 @@
 	 * @generated
 	 */
 	public void setQualifier(Property newQualifier) {
-		eDynamicSet(
-			UMLPackage.QUALIFIER_VALUE__QUALIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.QUALIFIER_VALUE__QUALIFIER, newQualifier);
+		eDynamicSet(UMLPackage.QUALIFIER_VALUE__QUALIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.QUALIFIER_VALUE__QUALIFIER, newQualifier);
 	}
 
 	/**
@@ -107,9 +107,7 @@
 	 * @generated
 	 */
 	public InputPin getValue() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.QUALIFIER_VALUE__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.QUALIFIER_VALUE__VALUE, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.QUALIFIER_VALUE__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.QUALIFIER_VALUE__VALUE, true, true);
 	}
 
 	/**
@@ -118,9 +116,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetValue() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.QUALIFIER_VALUE__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.QUALIFIER_VALUE__VALUE, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.QUALIFIER_VALUE__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.QUALIFIER_VALUE__VALUE, false, true);
 	}
 
 	/**
@@ -129,8 +125,7 @@
 	 * @generated
 	 */
 	public void setValue(InputPin newValue) {
-		eDynamicSet(UMLPackage.QUALIFIER_VALUE__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.QUALIFIER_VALUE__VALUE, newValue);
+		eDynamicSet(UMLPackage.QUALIFIER_VALUE__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.QUALIFIER_VALUE__VALUE, newValue);
 	}
 
 	/**
@@ -140,8 +135,7 @@
 	 */
 	public boolean validateQualifierAttribute(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return QualifierValueOperations.validateQualifierAttribute(this,
-			diagnostics, context);
+		return QualifierValueOperations.validateQualifierAttribute(this, diagnostics, context);
 	}
 
 	/**
@@ -151,8 +145,7 @@
 	 */
 	public boolean validateTypeOfQualifier(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return QualifierValueOperations.validateTypeOfQualifier(this,
-			diagnostics, context);
+		return QualifierValueOperations.validateTypeOfQualifier(this, diagnostics, context);
 	}
 
 	/**
@@ -162,8 +155,7 @@
 	 */
 	public boolean validateMultiplicityOfQualifier(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return QualifierValueOperations.validateMultiplicityOfQualifier(this,
-			diagnostics, context);
+		return QualifierValueOperations.validateMultiplicityOfQualifier(this, diagnostics, context);
 	}
 
 	/**
@@ -174,24 +166,24 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.QUALIFIER_VALUE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.QUALIFIER_VALUE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.QUALIFIER_VALUE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.QUALIFIER_VALUE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.QUALIFIER_VALUE__QUALIFIER :
-				if (resolve)
-					return getQualifier();
-				return basicGetQualifier();
-			case UMLPackage.QUALIFIER_VALUE__VALUE :
-				if (resolve)
-					return getValue();
-				return basicGetValue();
+		case UMLPackage.QUALIFIER_VALUE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.QUALIFIER_VALUE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.QUALIFIER_VALUE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.QUALIFIER_VALUE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.QUALIFIER_VALUE__QUALIFIER:
+			if (resolve)
+				return getQualifier();
+			return basicGetQualifier();
+		case UMLPackage.QUALIFIER_VALUE__VALUE:
+			if (resolve)
+				return getValue();
+			return basicGetValue();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -205,22 +197,20 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.QUALIFIER_VALUE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.QUALIFIER_VALUE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.QUALIFIER_VALUE__QUALIFIER :
-				setQualifier((Property) newValue);
-				return;
-			case UMLPackage.QUALIFIER_VALUE__VALUE :
-				setValue((InputPin) newValue);
-				return;
+		case UMLPackage.QUALIFIER_VALUE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.QUALIFIER_VALUE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.QUALIFIER_VALUE__QUALIFIER:
+			setQualifier((Property) newValue);
+			return;
+		case UMLPackage.QUALIFIER_VALUE__VALUE:
+			setValue((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -233,18 +223,18 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.QUALIFIER_VALUE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.QUALIFIER_VALUE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.QUALIFIER_VALUE__QUALIFIER :
-				setQualifier((Property) null);
-				return;
-			case UMLPackage.QUALIFIER_VALUE__VALUE :
-				setValue((InputPin) null);
-				return;
+		case UMLPackage.QUALIFIER_VALUE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.QUALIFIER_VALUE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.QUALIFIER_VALUE__QUALIFIER:
+			setQualifier((Property) null);
+			return;
+		case UMLPackage.QUALIFIER_VALUE__VALUE:
+			setValue((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -257,18 +247,18 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.QUALIFIER_VALUE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.QUALIFIER_VALUE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.QUALIFIER_VALUE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.QUALIFIER_VALUE__OWNER :
-				return isSetOwner();
-			case UMLPackage.QUALIFIER_VALUE__QUALIFIER :
-				return basicGetQualifier() != null;
-			case UMLPackage.QUALIFIER_VALUE__VALUE :
-				return basicGetValue() != null;
+		case UMLPackage.QUALIFIER_VALUE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.QUALIFIER_VALUE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.QUALIFIER_VALUE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.QUALIFIER_VALUE__OWNER:
+			return isSetOwner();
+		case UMLPackage.QUALIFIER_VALUE__QUALIFIER:
+			return basicGetQualifier() != null;
+		case UMLPackage.QUALIFIER_VALUE__VALUE:
+			return basicGetValue() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -283,102 +273,88 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.QUALIFIER_VALUE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.QUALIFIER_VALUE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.QUALIFIER_VALUE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.QUALIFIER_VALUE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.QUALIFIER_VALUE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.QUALIFIER_VALUE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.QUALIFIER_VALUE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.QUALIFIER_VALUE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___GET_MODEL :
-				return getModel();
-			case UMLPackage.QUALIFIER_VALUE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.QUALIFIER_VALUE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.QUALIFIER_VALUE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.QUALIFIER_VALUE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.QUALIFIER_VALUE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.QUALIFIER_VALUE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.QUALIFIER_VALUE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.QUALIFIER_VALUE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.QUALIFIER_VALUE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.QUALIFIER_VALUE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.QUALIFIER_VALUE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.QUALIFIER_VALUE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.QUALIFIER_VALUE___VALIDATE_MULTIPLICITY_OF_QUALIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfQualifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.QUALIFIER_VALUE___VALIDATE_TYPE_OF_QUALIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfQualifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.QUALIFIER_VALUE___VALIDATE_QUALIFIER_ATTRIBUTE__DIAGNOSTICCHAIN_MAP :
-				return validateQualifierAttribute(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.QUALIFIER_VALUE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.QUALIFIER_VALUE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.QUALIFIER_VALUE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.QUALIFIER_VALUE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.QUALIFIER_VALUE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.QUALIFIER_VALUE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.QUALIFIER_VALUE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.QUALIFIER_VALUE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___GET_MODEL:
+			return getModel();
+		case UMLPackage.QUALIFIER_VALUE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.QUALIFIER_VALUE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.QUALIFIER_VALUE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.QUALIFIER_VALUE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.QUALIFIER_VALUE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.QUALIFIER_VALUE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.QUALIFIER_VALUE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.QUALIFIER_VALUE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.QUALIFIER_VALUE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.QUALIFIER_VALUE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.QUALIFIER_VALUE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.QUALIFIER_VALUE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.QUALIFIER_VALUE___VALIDATE_MULTIPLICITY_OF_QUALIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfQualifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.QUALIFIER_VALUE___VALIDATE_TYPE_OF_QUALIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfQualifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.QUALIFIER_VALUE___VALIDATE_QUALIFIER_ATTRIBUTE__DIAGNOSTICCHAIN_MAP:
+			return validateQualifierAttribute((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RaiseExceptionActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RaiseExceptionActionImpl.java
index dc3d38f..3c7735a 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RaiseExceptionActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RaiseExceptionActionImpl.java
@@ -1,18 +1,20 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -21,6 +23,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -92,19 +96,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.RAISE_EXCEPTION_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.RAISE_EXCEPTION_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.RAISE_EXCEPTION_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.RAISE_EXCEPTION_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -113,10 +111,7 @@
 	 * @generated
 	 */
 	public InputPin getException() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.RAISE_EXCEPTION_ACTION__EXCEPTION, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.RAISE_EXCEPTION_ACTION__EXCEPTION, true, true);
 	}
 
 	/**
@@ -125,10 +120,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetException() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.RAISE_EXCEPTION_ACTION__EXCEPTION, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.RAISE_EXCEPTION_ACTION__EXCEPTION, false, true);
 	}
 
 	/**
@@ -138,8 +130,7 @@
 	 */
 	public NotificationChain basicSetException(InputPin newException,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newException,
-			UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newException, UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION, msgs);
 		return msgs;
 	}
 
@@ -149,11 +140,7 @@
 	 * @generated
 	 */
 	public void setException(InputPin newException) {
-		eDynamicSet(
-			UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.RAISE_EXCEPTION_ACTION__EXCEPTION,
-			newException);
+		eDynamicSet(UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.RAISE_EXCEPTION_ACTION__EXCEPTION, newException);
 	}
 
 	/**
@@ -189,39 +176,30 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.RAISE_EXCEPTION_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.RAISE_EXCEPTION_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.RAISE_EXCEPTION_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.RAISE_EXCEPTION_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION :
-				return basicSetException(null, msgs);
+		case UMLPackage.RAISE_EXCEPTION_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RAISE_EXCEPTION_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.RAISE_EXCEPTION_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RAISE_EXCEPTION_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION:
+			return basicSetException(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -234,78 +212,78 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.RAISE_EXCEPTION_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__NAME :
-				return getName();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION :
-				if (resolve)
-					return getException();
-				return basicGetException();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__NAME:
+			return getName();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION:
+			if (resolve)
+				return getException();
+			return basicGetException();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -319,80 +297,70 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.RAISE_EXCEPTION_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION :
-				setException((InputPin) newValue);
-				return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION:
+			setException((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -405,60 +373,60 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.RAISE_EXCEPTION_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION :
-				setException((InputPin) null);
-				return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION:
+			setException((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -471,66 +439,64 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.RAISE_EXCEPTION_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.RAISE_EXCEPTION_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION :
-				return basicGetException() != null;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.RAISE_EXCEPTION_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION:
+			return basicGetException() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -543,8 +509,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -554,7 +519,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION);
+				|| eIsSet(UMLPackage.RAISE_EXCEPTION_ACTION__EXCEPTION);
 	}
 
 } //RaiseExceptionActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadExtentActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadExtentActionImpl.java
index 1fb3013..88617e3 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadExtentActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadExtentActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -106,19 +109,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						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>(OutputPin.class, this,
-			UMLPackage.READ_EXTENT_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.READ_EXTENT_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -127,9 +124,7 @@
 	 * @generated
 	 */
 	public OutputPin getResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_EXTENT_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_EXTENT_ACTION__RESULT, true, true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_EXTENT_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_EXTENT_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -138,9 +133,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_EXTENT_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_EXTENT_ACTION__RESULT, false, true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_EXTENT_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_EXTENT_ACTION__RESULT, false, true);
 	}
 
 	/**
@@ -150,8 +143,7 @@
 	 */
 	public NotificationChain basicSetResult(OutputPin newResult,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newResult,
-			UMLPackage.READ_EXTENT_ACTION__RESULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newResult, UMLPackage.READ_EXTENT_ACTION__RESULT, msgs);
 		return msgs;
 	}
 
@@ -161,9 +153,7 @@
 	 * @generated
 	 */
 	public void setResult(OutputPin newResult) {
-		eDynamicSet(
-			UMLPackage.READ_EXTENT_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_EXTENT_ACTION__RESULT, newResult);
+		eDynamicSet(UMLPackage.READ_EXTENT_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_EXTENT_ACTION__RESULT, newResult);
 	}
 
 	/**
@@ -172,8 +162,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setResult(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -188,9 +177,7 @@
 	 * @generated
 	 */
 	public Classifier getClassifier() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.READ_EXTENT_ACTION__CLASSIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_EXTENT_ACTION__CLASSIFIER, true, true);
+		return (Classifier) eDynamicGet(UMLPackage.READ_EXTENT_ACTION__CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_EXTENT_ACTION__CLASSIFIER, true, true);
 	}
 
 	/**
@@ -199,9 +186,7 @@
 	 * @generated
 	 */
 	public Classifier basicGetClassifier() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.READ_EXTENT_ACTION__CLASSIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_EXTENT_ACTION__CLASSIFIER, false, true);
+		return (Classifier) eDynamicGet(UMLPackage.READ_EXTENT_ACTION__CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_EXTENT_ACTION__CLASSIFIER, false, true);
 	}
 
 	/**
@@ -210,9 +195,7 @@
 	 * @generated
 	 */
 	public void setClassifier(Classifier newClassifier) {
-		eDynamicSet(
-			UMLPackage.READ_EXTENT_ACTION__CLASSIFIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_EXTENT_ACTION__CLASSIFIER, newClassifier);
+		eDynamicSet(UMLPackage.READ_EXTENT_ACTION__CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_EXTENT_ACTION__CLASSIFIER, newClassifier);
 	}
 
 	/**
@@ -222,8 +205,7 @@
 	 */
 	public boolean validateTypeIsClassifier(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadExtentActionOperations.validateTypeIsClassifier(this,
-			diagnostics, context);
+		return ReadExtentActionOperations.validateTypeIsClassifier(this, diagnostics, context);
 	}
 
 	/**
@@ -233,8 +215,7 @@
 	 */
 	public boolean validateMultiplicityOfResult(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadExtentActionOperations.validateMultiplicityOfResult(this,
-			diagnostics, context);
+		return ReadExtentActionOperations.validateMultiplicityOfResult(this, diagnostics, context);
 	}
 
 	/**
@@ -246,39 +227,30 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.READ_EXTENT_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_EXTENT_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_EXTENT_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.READ_EXTENT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_EXTENT_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.READ_EXTENT_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_EXTENT_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_EXTENT_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_EXTENT_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_EXTENT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_EXTENT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_EXTENT_ACTION__RESULT :
-				return basicSetResult(null, msgs);
+		case UMLPackage.READ_EXTENT_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_EXTENT_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_EXTENT_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.READ_EXTENT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_EXTENT_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.READ_EXTENT_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_EXTENT_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_EXTENT_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_EXTENT_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_EXTENT_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_EXTENT_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_EXTENT_ACTION__RESULT:
+			return basicSetResult(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -291,82 +263,82 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.READ_EXTENT_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.READ_EXTENT_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.READ_EXTENT_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.READ_EXTENT_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.READ_EXTENT_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.READ_EXTENT_ACTION__NAME :
-				return getName();
-			case UMLPackage.READ_EXTENT_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.READ_EXTENT_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.READ_EXTENT_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_EXTENT_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.READ_EXTENT_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.READ_EXTENT_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.READ_EXTENT_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.READ_EXTENT_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.READ_EXTENT_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.READ_EXTENT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.READ_EXTENT_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.READ_EXTENT_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.READ_EXTENT_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.READ_EXTENT_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.READ_EXTENT_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.READ_EXTENT_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.READ_EXTENT_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.READ_EXTENT_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.READ_EXTENT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.READ_EXTENT_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.READ_EXTENT_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.READ_EXTENT_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.READ_EXTENT_ACTION__CLASSIFIER :
-				if (resolve)
-					return getClassifier();
-				return basicGetClassifier();
-			case UMLPackage.READ_EXTENT_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
+		case UMLPackage.READ_EXTENT_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.READ_EXTENT_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.READ_EXTENT_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.READ_EXTENT_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.READ_EXTENT_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.READ_EXTENT_ACTION__NAME:
+			return getName();
+		case UMLPackage.READ_EXTENT_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.READ_EXTENT_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.READ_EXTENT_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_EXTENT_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.READ_EXTENT_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.READ_EXTENT_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.READ_EXTENT_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.READ_EXTENT_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.READ_EXTENT_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.READ_EXTENT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.READ_EXTENT_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.READ_EXTENT_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.READ_EXTENT_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.READ_EXTENT_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.READ_EXTENT_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.READ_EXTENT_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.READ_EXTENT_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.READ_EXTENT_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.READ_EXTENT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.READ_EXTENT_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.READ_EXTENT_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.READ_EXTENT_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.READ_EXTENT_ACTION__CLASSIFIER:
+			if (resolve)
+				return getClassifier();
+			return basicGetClassifier();
+		case UMLPackage.READ_EXTENT_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -380,83 +352,73 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.READ_EXTENT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__CLASSIFIER :
-				setClassifier((Classifier) newValue);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
+		case UMLPackage.READ_EXTENT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__CLASSIFIER:
+			setClassifier((Classifier) newValue);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -469,63 +431,63 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_EXTENT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__CLASSIFIER :
-				setClassifier((Classifier) null);
-				return;
-			case UMLPackage.READ_EXTENT_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
+		case UMLPackage.READ_EXTENT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__CLASSIFIER:
+			setClassifier((Classifier) null);
+			return;
+		case UMLPackage.READ_EXTENT_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -538,68 +500,66 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_EXTENT_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.READ_EXTENT_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.READ_EXTENT_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.READ_EXTENT_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.READ_EXTENT_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.READ_EXTENT_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.READ_EXTENT_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.READ_EXTENT_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.READ_EXTENT_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.READ_EXTENT_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.READ_EXTENT_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.READ_EXTENT_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.READ_EXTENT_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.READ_EXTENT_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.READ_EXTENT_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.READ_EXTENT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.READ_EXTENT_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.READ_EXTENT_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.READ_EXTENT_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.READ_EXTENT_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.READ_EXTENT_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.READ_EXTENT_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.READ_EXTENT_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.READ_EXTENT_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.READ_EXTENT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.READ_EXTENT_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.READ_EXTENT_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.READ_EXTENT_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.READ_EXTENT_ACTION__CLASSIFIER :
-				return basicGetClassifier() != null;
-			case UMLPackage.READ_EXTENT_ACTION__RESULT :
-				return basicGetResult() != null;
+		case UMLPackage.READ_EXTENT_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.READ_EXTENT_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.READ_EXTENT_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.READ_EXTENT_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.READ_EXTENT_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.READ_EXTENT_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.READ_EXTENT_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.READ_EXTENT_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.READ_EXTENT_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.READ_EXTENT_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.READ_EXTENT_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.READ_EXTENT_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.READ_EXTENT_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.READ_EXTENT_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.READ_EXTENT_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.READ_EXTENT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.READ_EXTENT_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.READ_EXTENT_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.READ_EXTENT_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.READ_EXTENT_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.READ_EXTENT_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.READ_EXTENT_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.READ_EXTENT_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.READ_EXTENT_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.READ_EXTENT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.READ_EXTENT_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.READ_EXTENT_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.READ_EXTENT_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.READ_EXTENT_ACTION__CLASSIFIER:
+			return basicGetClassifier() != null;
+		case UMLPackage.READ_EXTENT_ACTION__RESULT:
+			return basicGetResult() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -614,160 +574,134 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.READ_EXTENT_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_EXTENT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_EXTENT_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.READ_EXTENT_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.READ_EXTENT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.READ_EXTENT_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.READ_EXTENT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_EXTENT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.READ_EXTENT_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.READ_EXTENT_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.READ_EXTENT_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.READ_EXTENT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.READ_EXTENT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.READ_EXTENT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.READ_EXTENT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_EXTENT_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_EXTENT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.READ_EXTENT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.READ_EXTENT_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.READ_EXTENT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_EXTENT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_EXTENT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_EXTENT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.READ_EXTENT_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.READ_EXTENT_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.READ_EXTENT_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.READ_EXTENT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.READ_EXTENT_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_EXTENT_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.READ_EXTENT_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.READ_EXTENT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_EXTENT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_EXTENT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_EXTENT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_EXTENT_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.READ_EXTENT_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.READ_EXTENT_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.READ_EXTENT_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.READ_EXTENT_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.READ_EXTENT_ACTION___VALIDATE_TYPE_IS_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateTypeIsClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_EXTENT_ACTION___VALIDATE_MULTIPLICITY_OF_RESULT__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfResult(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_EXTENT_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_EXTENT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_EXTENT_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.READ_EXTENT_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.READ_EXTENT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.READ_EXTENT_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.READ_EXTENT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_EXTENT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.READ_EXTENT_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.READ_EXTENT_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.READ_EXTENT_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.READ_EXTENT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.READ_EXTENT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.READ_EXTENT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.READ_EXTENT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_EXTENT_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_EXTENT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.READ_EXTENT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.READ_EXTENT_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.READ_EXTENT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_EXTENT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_EXTENT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_EXTENT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.READ_EXTENT_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.READ_EXTENT_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.READ_EXTENT_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.READ_EXTENT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.READ_EXTENT_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_EXTENT_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.READ_EXTENT_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.READ_EXTENT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_EXTENT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_EXTENT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_EXTENT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_EXTENT_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.READ_EXTENT_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.READ_EXTENT_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.READ_EXTENT_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.READ_EXTENT_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.READ_EXTENT_ACTION___VALIDATE_TYPE_IS_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateTypeIsClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_EXTENT_ACTION___VALIDATE_MULTIPLICITY_OF_RESULT__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfResult((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -780,8 +714,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.READ_EXTENT_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.READ_EXTENT_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -791,7 +724,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.READ_EXTENT_ACTION__RESULT);
+				|| eIsSet(UMLPackage.READ_EXTENT_ACTION__RESULT);
 	}
 
 } //ReadExtentActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadIsClassifiedObjectActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadIsClassifiedObjectActionImpl.java
index 4f60bad..a6b37fb 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadIsClassifiedObjectActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadIsClassifiedObjectActionImpl.java
@@ -1,14 +1,14 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,6 +29,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -121,20 +124,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this,
-						UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTPUT,
-			OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -148,19 +144,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -169,11 +159,7 @@
 	 * @generated
 	 */
 	public boolean isDirect() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT,
-			true, true);
+		return (Boolean) eDynamicGet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT, true, true);
 	}
 
 	/**
@@ -182,11 +168,7 @@
 	 * @generated
 	 */
 	public void setIsDirect(boolean newIsDirect) {
-		eDynamicSet(
-			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT,
-			newIsDirect);
+		eDynamicSet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT, newIsDirect);
 	}
 
 	/**
@@ -195,11 +177,7 @@
 	 * @generated
 	 */
 	public Classifier getClassifier() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER,
-			true, true);
+		return (Classifier) eDynamicGet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER, true, true);
 	}
 
 	/**
@@ -208,11 +186,7 @@
 	 * @generated
 	 */
 	public Classifier basicGetClassifier() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER,
-			false, true);
+		return (Classifier) eDynamicGet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER, false, true);
 	}
 
 	/**
@@ -221,11 +195,7 @@
 	 * @generated
 	 */
 	public void setClassifier(Classifier newClassifier) {
-		eDynamicSet(
-			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER,
-			newClassifier);
+		eDynamicSet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER, newClassifier);
 	}
 
 	/**
@@ -234,11 +204,7 @@
 	 * @generated
 	 */
 	public OutputPin getResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT, true,
-			true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -247,11 +213,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT, false,
-			true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT, false, true);
 	}
 
 	/**
@@ -261,8 +223,7 @@
 	 */
 	public NotificationChain basicSetResult(OutputPin newResult,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newResult,
-			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newResult, UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT, msgs);
 		return msgs;
 	}
 
@@ -272,11 +233,7 @@
 	 * @generated
 	 */
 	public void setResult(OutputPin newResult) {
-		eDynamicSet(
-			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT,
-			newResult);
+		eDynamicSet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT, newResult);
 	}
 
 	/**
@@ -285,8 +242,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setResult(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -301,11 +257,7 @@
 	 * @generated
 	 */
 	public InputPin getObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT, true,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT, true, true);
 	}
 
 	/**
@@ -314,11 +266,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT, false,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT, false, true);
 	}
 
 	/**
@@ -328,8 +276,7 @@
 	 */
 	public NotificationChain basicSetObject(InputPin newObject,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newObject,
-			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newObject, UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT, msgs);
 		return msgs;
 	}
 
@@ -339,11 +286,7 @@
 	 * @generated
 	 */
 	public void setObject(InputPin newObject) {
-		eDynamicSet(
-			UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT,
-			newObject);
+		eDynamicSet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT, newObject);
 	}
 
 	/**
@@ -377,8 +320,7 @@
 	 */
 	public boolean validateMultiplicityOfInput(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadIsClassifiedObjectActionOperations
-			.validateMultiplicityOfInput(this, diagnostics, context);
+		return ReadIsClassifiedObjectActionOperations.validateMultiplicityOfInput(this, diagnostics, context);
 	}
 
 	/**
@@ -388,8 +330,7 @@
 	 */
 	public boolean validateNoType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadIsClassifiedObjectActionOperations.validateNoType(this,
-			diagnostics, context);
+		return ReadIsClassifiedObjectActionOperations.validateNoType(this, diagnostics, context);
 	}
 
 	/**
@@ -399,8 +340,7 @@
 	 */
 	public boolean validateMultiplicityOfOutput(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadIsClassifiedObjectActionOperations
-			.validateMultiplicityOfOutput(this, diagnostics, context);
+		return ReadIsClassifiedObjectActionOperations.validateMultiplicityOfOutput(this, diagnostics, context);
 	}
 
 	/**
@@ -410,8 +350,7 @@
 	 */
 	public boolean validateBooleanResult(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadIsClassifiedObjectActionOperations
-			.validateBooleanResult(this, diagnostics, context);
+		return ReadIsClassifiedObjectActionOperations.validateBooleanResult(this, diagnostics, context);
 	}
 
 	/**
@@ -423,41 +362,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT :
-				return basicSetObject(null, msgs);
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT :
-				return basicSetResult(null, msgs);
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT:
+			return basicSetObject(null, msgs);
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT:
+			return basicSetResult(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -470,88 +400,88 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME :
-				return getName();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER :
-				if (resolve)
-					return getClassifier();
-				return basicGetClassifier();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT :
-				return isDirect();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT :
-				if (resolve)
-					return getObject();
-				return basicGetObject();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME:
+			return getName();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER:
+			if (resolve)
+				return getClassifier();
+			return basicGetClassifier();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT:
+			return isDirect();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT:
+			if (resolve)
+				return getObject();
+			return basicGetObject();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -565,89 +495,79 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER :
-				setClassifier((Classifier) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT :
-				setIsDirect((Boolean) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT :
-				setObject((InputPin) newValue);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER:
+			setClassifier((Classifier) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT:
+			setIsDirect((Boolean) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT:
+			setObject((InputPin) newValue);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -660,69 +580,69 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER :
-				setClassifier((Classifier) null);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT :
-				setIsDirect(IS_DIRECT_EDEFAULT);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT :
-				setObject((InputPin) null);
-				return;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER:
+			setClassifier((Classifier) null);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT:
+			setIsDirect(IS_DIRECT_EDEFAULT);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT:
+			setObject((InputPin) null);
+			return;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -735,72 +655,70 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER :
-				return basicGetClassifier() != null;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT :
-				return isDirect() != IS_DIRECT_EDEFAULT;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT :
-				return basicGetObject() != null;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT :
-				return basicGetResult() != null;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__CLASSIFIER:
+			return basicGetClassifier() != null;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__IS_DIRECT:
+			return isDirect() != IS_DIRECT_EDEFAULT;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT:
+			return basicGetObject() != null;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT:
+			return basicGetResult() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -815,166 +733,138 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_NO_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateNoType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_MULTIPLICITY_OF_OUTPUT__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfOutput(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_BOOLEAN_RESULT__DIAGNOSTICCHAIN_MAP :
-				return validateBooleanResult((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_MULTIPLICITY_OF_INPUT__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfInput(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_NO_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateNoType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_MULTIPLICITY_OF_OUTPUT__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfOutput((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_BOOLEAN_RESULT__DIAGNOSTICCHAIN_MAP:
+			return validateBooleanResult((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION___VALIDATE_MULTIPLICITY_OF_INPUT__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfInput((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -987,7 +877,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT);
+				|| eIsSet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT);
 	}
 
 	/**
@@ -998,8 +888,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOutputs() <em>Output</em>}' reference list.
@@ -1009,8 +898,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1020,7 +908,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT);
+				|| eIsSet(UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION__OBJECT);
 	}
 
 } //ReadIsClassifiedObjectActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadLinkActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadLinkActionImpl.java
index 4e8a445..6cf3f21 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadLinkActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadLinkActionImpl.java
@@ -1,13 +1,13 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -107,18 +110,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this,
-						UMLPackage.READ_LINK_ACTION__OUTPUT, OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.READ_LINK_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.READ_LINK_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.READ_LINK_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -127,9 +125,7 @@
 	 * @generated
 	 */
 	public OutputPin getResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_LINK_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_ACTION__RESULT, true, true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_LINK_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -138,9 +134,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_LINK_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_ACTION__RESULT, false, true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_LINK_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_ACTION__RESULT, false, true);
 	}
 
 	/**
@@ -150,8 +144,7 @@
 	 */
 	public NotificationChain basicSetResult(OutputPin newResult,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newResult,
-			UMLPackage.READ_LINK_ACTION__RESULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newResult, UMLPackage.READ_LINK_ACTION__RESULT, msgs);
 		return msgs;
 	}
 
@@ -161,8 +154,7 @@
 	 * @generated
 	 */
 	public void setResult(OutputPin newResult) {
-		eDynamicSet(UMLPackage.READ_LINK_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_ACTION__RESULT, newResult);
+		eDynamicSet(UMLPackage.READ_LINK_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_ACTION__RESULT, newResult);
 	}
 
 	/**
@@ -171,8 +163,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setResult(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -188,8 +179,7 @@
 	 */
 	public boolean validateOneOpenEnd(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkActionOperations.validateOneOpenEnd(this, diagnostics,
-			context);
+		return ReadLinkActionOperations.validateOneOpenEnd(this, diagnostics, context);
 	}
 
 	/**
@@ -199,8 +189,7 @@
 	 */
 	public boolean validateTypeAndOrdering(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkActionOperations.validateTypeAndOrdering(this,
-			diagnostics, context);
+		return ReadLinkActionOperations.validateTypeAndOrdering(this, diagnostics, context);
 	}
 
 	/**
@@ -210,8 +199,7 @@
 	 */
 	public boolean validateCompatibleMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkActionOperations.validateCompatibleMultiplicity(this,
-			diagnostics, context);
+		return ReadLinkActionOperations.validateCompatibleMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -221,8 +209,7 @@
 	 */
 	public boolean validateNavigableOpenEnd(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkActionOperations.validateNavigableOpenEnd(this,
-			diagnostics, context);
+		return ReadLinkActionOperations.validateNavigableOpenEnd(this, diagnostics, context);
 	}
 
 	/**
@@ -241,8 +228,7 @@
 	 */
 	public boolean validateVisibility(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkActionOperations.validateVisibility(this, diagnostics,
-			context);
+		return ReadLinkActionOperations.validateVisibility(this, diagnostics, context);
 	}
 
 	/**
@@ -254,45 +240,34 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.READ_LINK_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.READ_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.READ_LINK_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_LINK_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_LINK_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_LINK_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_ACTION__END_DATA :
-				return ((InternalEList<?>) getEndData()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_LINK_ACTION__INPUT_VALUE :
-				return ((InternalEList<?>) getInputValues())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_ACTION__RESULT :
-				return basicSetResult(null, msgs);
+		case UMLPackage.READ_LINK_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.READ_LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.READ_LINK_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_ACTION__END_DATA:
+			return ((InternalEList<?>) getEndData()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_ACTION__INPUT_VALUE:
+			return ((InternalEList<?>) getInputValues()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_ACTION__RESULT:
+			return basicSetResult(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -305,82 +280,82 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.READ_LINK_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.READ_LINK_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.READ_LINK_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.READ_LINK_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.READ_LINK_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.READ_LINK_ACTION__NAME :
-				return getName();
-			case UMLPackage.READ_LINK_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.READ_LINK_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.READ_LINK_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_LINK_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.READ_LINK_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.READ_LINK_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.READ_LINK_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.READ_LINK_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.READ_LINK_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.READ_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.READ_LINK_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.READ_LINK_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.READ_LINK_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.READ_LINK_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.READ_LINK_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.READ_LINK_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.READ_LINK_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.READ_LINK_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.READ_LINK_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.READ_LINK_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.READ_LINK_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.READ_LINK_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.READ_LINK_ACTION__END_DATA :
-				return getEndData();
-			case UMLPackage.READ_LINK_ACTION__INPUT_VALUE :
-				return getInputValues();
-			case UMLPackage.READ_LINK_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
+		case UMLPackage.READ_LINK_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.READ_LINK_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.READ_LINK_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.READ_LINK_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.READ_LINK_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.READ_LINK_ACTION__NAME:
+			return getName();
+		case UMLPackage.READ_LINK_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.READ_LINK_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.READ_LINK_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_LINK_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.READ_LINK_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.READ_LINK_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.READ_LINK_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.READ_LINK_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.READ_LINK_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.READ_LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.READ_LINK_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.READ_LINK_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.READ_LINK_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.READ_LINK_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.READ_LINK_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.READ_LINK_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.READ_LINK_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.READ_LINK_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.READ_LINK_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.READ_LINK_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.READ_LINK_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.READ_LINK_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.READ_LINK_ACTION__END_DATA:
+			return getEndData();
+		case UMLPackage.READ_LINK_ACTION__INPUT_VALUE:
+			return getInputValues();
+		case UMLPackage.READ_LINK_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -394,90 +369,78 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.READ_LINK_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__END_DATA :
-				getEndData().clear();
-				getEndData()
-					.addAll((Collection<? extends LinkEndData>) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__INPUT_VALUE :
-				getInputValues().clear();
-				getInputValues()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.READ_LINK_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
+		case UMLPackage.READ_LINK_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__END_DATA:
+			getEndData().clear();
+			getEndData().addAll((Collection<? extends LinkEndData>) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__INPUT_VALUE:
+			getInputValues().clear();
+			getInputValues().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.READ_LINK_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -490,66 +453,66 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_LINK_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.READ_LINK_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.READ_LINK_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.READ_LINK_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.READ_LINK_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.READ_LINK_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.READ_LINK_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.READ_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.READ_LINK_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.READ_LINK_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.READ_LINK_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.READ_LINK_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.READ_LINK_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.READ_LINK_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.READ_LINK_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.READ_LINK_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.READ_LINK_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.READ_LINK_ACTION__END_DATA :
-				getEndData().clear();
-				return;
-			case UMLPackage.READ_LINK_ACTION__INPUT_VALUE :
-				getInputValues().clear();
-				return;
-			case UMLPackage.READ_LINK_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
+		case UMLPackage.READ_LINK_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.READ_LINK_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.READ_LINK_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.READ_LINK_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.READ_LINK_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.READ_LINK_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.READ_LINK_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.READ_LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.READ_LINK_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.READ_LINK_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.READ_LINK_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.READ_LINK_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.READ_LINK_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.READ_LINK_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.READ_LINK_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.READ_LINK_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.READ_LINK_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.READ_LINK_ACTION__END_DATA:
+			getEndData().clear();
+			return;
+		case UMLPackage.READ_LINK_ACTION__INPUT_VALUE:
+			getInputValues().clear();
+			return;
+		case UMLPackage.READ_LINK_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -562,70 +525,68 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_LINK_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.READ_LINK_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.READ_LINK_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.READ_LINK_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.READ_LINK_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.READ_LINK_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.READ_LINK_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.READ_LINK_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.READ_LINK_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.READ_LINK_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.READ_LINK_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.READ_LINK_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.READ_LINK_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.READ_LINK_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.READ_LINK_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.READ_LINK_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.READ_LINK_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.READ_LINK_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.READ_LINK_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.READ_LINK_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.READ_LINK_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.READ_LINK_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.READ_LINK_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.READ_LINK_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.READ_LINK_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.READ_LINK_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.READ_LINK_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.READ_LINK_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.READ_LINK_ACTION__END_DATA :
-				return !getEndData().isEmpty();
-			case UMLPackage.READ_LINK_ACTION__INPUT_VALUE :
-				return !getInputValues().isEmpty();
-			case UMLPackage.READ_LINK_ACTION__RESULT :
-				return basicGetResult() != null;
+		case UMLPackage.READ_LINK_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.READ_LINK_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.READ_LINK_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.READ_LINK_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.READ_LINK_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.READ_LINK_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.READ_LINK_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.READ_LINK_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.READ_LINK_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.READ_LINK_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.READ_LINK_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.READ_LINK_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.READ_LINK_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.READ_LINK_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.READ_LINK_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.READ_LINK_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.READ_LINK_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.READ_LINK_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.READ_LINK_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.READ_LINK_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.READ_LINK_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.READ_LINK_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.READ_LINK_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.READ_LINK_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.READ_LINK_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.READ_LINK_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.READ_LINK_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.READ_LINK_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.READ_LINK_ACTION__END_DATA:
+			return !getEndData().isEmpty();
+		case UMLPackage.READ_LINK_ACTION__INPUT_VALUE:
+			return !getInputValues().isEmpty();
+		case UMLPackage.READ_LINK_ACTION__RESULT:
+			return basicGetResult() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -640,184 +601,150 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.READ_LINK_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.READ_LINK_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.READ_LINK_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.READ_LINK_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.READ_LINK_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.READ_LINK_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.READ_LINK_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.READ_LINK_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.READ_LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.READ_LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.READ_LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.READ_LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.READ_LINK_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.READ_LINK_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.READ_LINK_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.READ_LINK_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.READ_LINK_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.READ_LINK_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_LINK_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.READ_LINK_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_LINK_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.READ_LINK_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.READ_LINK_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.READ_LINK_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.READ_LINK_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_SAME_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateSamePins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_SAME_ASSOCIATION__DIAGNOSTICCHAIN_MAP :
-				return validateSameAssociation(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP :
-				return validateNotStatic((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___ASSOCIATION :
-				return association();
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_TYPE_AND_ORDERING__DIAGNOSTICCHAIN_MAP :
-				return validateTypeAndOrdering(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_COMPATIBLE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateCompatibleMultiplicity(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateVisibility((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_ONE_OPEN_END__DIAGNOSTICCHAIN_MAP :
-				return validateOneOpenEnd((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___VALIDATE_NAVIGABLE_OPEN_END__DIAGNOSTICCHAIN_MAP :
-				return validateNavigableOpenEnd(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_ACTION___OPEN_END :
-				return openEnd();
+		case UMLPackage.READ_LINK_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.READ_LINK_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.READ_LINK_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.READ_LINK_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.READ_LINK_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.READ_LINK_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.READ_LINK_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.READ_LINK_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.READ_LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.READ_LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.READ_LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.READ_LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.READ_LINK_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.READ_LINK_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.READ_LINK_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.READ_LINK_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.READ_LINK_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.READ_LINK_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_LINK_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.READ_LINK_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_LINK_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.READ_LINK_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.READ_LINK_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.READ_LINK_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.READ_LINK_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_SAME_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateSamePins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_SAME_ASSOCIATION__DIAGNOSTICCHAIN_MAP:
+			return validateSameAssociation((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP:
+			return validateNotStatic((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___ASSOCIATION:
+			return association();
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_TYPE_AND_ORDERING__DIAGNOSTICCHAIN_MAP:
+			return validateTypeAndOrdering((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_COMPATIBLE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateCompatibleMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_ONE_OPEN_END__DIAGNOSTICCHAIN_MAP:
+			return validateOneOpenEnd((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___VALIDATE_NAVIGABLE_OPEN_END__DIAGNOSTICCHAIN_MAP:
+			return validateNavigableOpenEnd((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_ACTION___OPEN_END:
+			return openEnd();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -830,8 +757,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.READ_LINK_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.READ_LINK_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -841,7 +767,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.READ_LINK_ACTION__RESULT);
+				|| eIsSet(UMLPackage.READ_LINK_ACTION__RESULT);
 	}
 
 } //ReadLinkActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadLinkObjectEndActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadLinkObjectEndActionImpl.java
index 595c353..35d2e74 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadLinkObjectEndActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadLinkObjectEndActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -109,19 +112,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.READ_LINK_OBJECT_END_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.READ_LINK_OBJECT_END_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.READ_LINK_OBJECT_END_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.READ_LINK_OBJECT_END_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -135,19 +132,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this,
-						UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -156,11 +147,7 @@
 	 * @generated
 	 */
 	public InputPin getObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__OBJECT, true,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__OBJECT, true, true);
 	}
 
 	/**
@@ -169,11 +156,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__OBJECT, false,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__OBJECT, false, true);
 	}
 
 	/**
@@ -183,8 +166,7 @@
 	 */
 	public NotificationChain basicSetObject(InputPin newObject,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newObject,
-			UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newObject, UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT, msgs);
 		return msgs;
 	}
 
@@ -194,10 +176,7 @@
 	 * @generated
 	 */
 	public void setObject(InputPin newObject) {
-		eDynamicSet(
-			UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__OBJECT, newObject);
+		eDynamicSet(UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__OBJECT, newObject);
 	}
 
 	/**
@@ -230,9 +209,7 @@
 	 * @generated
 	 */
 	public Property getEnd() {
-		return (Property) eDynamicGet(
-			UMLPackage.READ_LINK_OBJECT_END_ACTION__END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__END, true, true);
+		return (Property) eDynamicGet(UMLPackage.READ_LINK_OBJECT_END_ACTION__END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__END, true, true);
 	}
 
 	/**
@@ -241,9 +218,7 @@
 	 * @generated
 	 */
 	public Property basicGetEnd() {
-		return (Property) eDynamicGet(
-			UMLPackage.READ_LINK_OBJECT_END_ACTION__END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__END, false, true);
+		return (Property) eDynamicGet(UMLPackage.READ_LINK_OBJECT_END_ACTION__END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__END, false, true);
 	}
 
 	/**
@@ -252,9 +227,7 @@
 	 * @generated
 	 */
 	public void setEnd(Property newEnd) {
-		eDynamicSet(
-			UMLPackage.READ_LINK_OBJECT_END_ACTION__END - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__END, newEnd);
+		eDynamicSet(UMLPackage.READ_LINK_OBJECT_END_ACTION__END - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__END, newEnd);
 	}
 
 	/**
@@ -263,11 +236,7 @@
 	 * @generated
 	 */
 	public OutputPin getResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__RESULT, true,
-			true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -276,11 +245,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__RESULT, false,
-			true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__RESULT, false, true);
 	}
 
 	/**
@@ -290,8 +255,7 @@
 	 */
 	public NotificationChain basicSetResult(OutputPin newResult,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newResult,
-			UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newResult, UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT, msgs);
 		return msgs;
 	}
 
@@ -301,10 +265,7 @@
 	 * @generated
 	 */
 	public void setResult(OutputPin newResult) {
-		eDynamicSet(
-			UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__RESULT, newResult);
+		eDynamicSet(UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_ACTION__RESULT, newResult);
 	}
 
 	/**
@@ -313,8 +274,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setResult(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -330,8 +290,7 @@
 	 */
 	public boolean validateProperty(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkObjectEndActionOperations.validateProperty(this,
-			diagnostics, context);
+		return ReadLinkObjectEndActionOperations.validateProperty(this, diagnostics, context);
 	}
 
 	/**
@@ -341,8 +300,7 @@
 	 */
 	public boolean validateAssociationOfAssociation(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkObjectEndActionOperations
-			.validateAssociationOfAssociation(this, diagnostics, context);
+		return ReadLinkObjectEndActionOperations.validateAssociationOfAssociation(this, diagnostics, context);
 	}
 
 	/**
@@ -352,8 +310,7 @@
 	 */
 	public boolean validateEndsOfAssociation(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkObjectEndActionOperations.validateEndsOfAssociation(this,
-			diagnostics, context);
+		return ReadLinkObjectEndActionOperations.validateEndsOfAssociation(this, diagnostics, context);
 	}
 
 	/**
@@ -363,8 +320,7 @@
 	 */
 	public boolean validateTypeOfObject(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkObjectEndActionOperations.validateTypeOfObject(this,
-			diagnostics, context);
+		return ReadLinkObjectEndActionOperations.validateTypeOfObject(this, diagnostics, context);
 	}
 
 	/**
@@ -374,8 +330,7 @@
 	 */
 	public boolean validateMultiplicityOfObject(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkObjectEndActionOperations
-			.validateMultiplicityOfObject(this, diagnostics, context);
+		return ReadLinkObjectEndActionOperations.validateMultiplicityOfObject(this, diagnostics, context);
 	}
 
 	/**
@@ -385,8 +340,7 @@
 	 */
 	public boolean validateTypeOfResult(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkObjectEndActionOperations.validateTypeOfResult(this,
-			diagnostics, context);
+		return ReadLinkObjectEndActionOperations.validateTypeOfResult(this, diagnostics, context);
 	}
 
 	/**
@@ -396,8 +350,7 @@
 	 */
 	public boolean validateMultiplicityOfResult(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkObjectEndActionOperations
-			.validateMultiplicityOfResult(this, diagnostics, context);
+		return ReadLinkObjectEndActionOperations.validateMultiplicityOfResult(this, diagnostics, context);
 	}
 
 	/**
@@ -409,41 +362,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT :
-				return basicSetObject(null, msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT :
-				return basicSetResult(null, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT:
+			return basicSetObject(null, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT:
+			return basicSetResult(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -456,86 +400,86 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME :
-				return getName();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__END :
-				if (resolve)
-					return getEnd();
-				return basicGetEnd();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT :
-				if (resolve)
-					return getObject();
-				return basicGetObject();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME:
+			return getName();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__END:
+			if (resolve)
+				return getEnd();
+			return basicGetEnd();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT:
+			if (resolve)
+				return getObject();
+			return basicGetObject();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -549,86 +493,76 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__END :
-				setEnd((Property) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT :
-				setObject((InputPin) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__END:
+			setEnd((Property) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT:
+			setObject((InputPin) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -641,66 +575,66 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__END :
-				setEnd((Property) null);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT :
-				setObject((InputPin) null);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__END:
+			setEnd((Property) null);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT:
+			setObject((InputPin) null);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -713,70 +647,68 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__END :
-				return basicGetEnd() != null;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT :
-				return basicGetObject() != null;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT :
-				return basicGetResult() != null;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__END:
+			return basicGetEnd() != null;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT:
+			return basicGetObject() != null;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT:
+			return basicGetResult() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -791,177 +723,144 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_PROPERTY__DIAGNOSTICCHAIN_MAP :
-				return validateProperty((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_MULTIPLICITY_OF_OBJECT__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfObject(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_ENDS_OF_ASSOCIATION__DIAGNOSTICCHAIN_MAP :
-				return validateEndsOfAssociation(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_TYPE_OF_RESULT__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfResult((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_MULTIPLICITY_OF_RESULT__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfResult(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_TYPE_OF_OBJECT__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfObject((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_ASSOCIATION_OF_ASSOCIATION__DIAGNOSTICCHAIN_MAP :
-				return validateAssociationOfAssociation(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_PROPERTY__DIAGNOSTICCHAIN_MAP:
+			return validateProperty((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_MULTIPLICITY_OF_OBJECT__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfObject((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_ENDS_OF_ASSOCIATION__DIAGNOSTICCHAIN_MAP:
+			return validateEndsOfAssociation((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_TYPE_OF_RESULT__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfResult((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_MULTIPLICITY_OF_RESULT__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfResult((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_TYPE_OF_OBJECT__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfObject((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION___VALIDATE_ASSOCIATION_OF_ASSOCIATION__DIAGNOSTICCHAIN_MAP:
+			return validateAssociationOfAssociation((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -974,8 +873,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -985,7 +883,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT);
+				|| eIsSet(UMLPackage.READ_LINK_OBJECT_END_ACTION__OBJECT);
 	}
 
 	/**
@@ -996,8 +894,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1007,7 +904,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT);
+				|| eIsSet(UMLPackage.READ_LINK_OBJECT_END_ACTION__RESULT);
 	}
 
 } //ReadLinkObjectEndActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadLinkObjectEndQualifierActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadLinkObjectEndQualifierActionImpl.java
index 02c4009..4d42fb9 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadLinkObjectEndQualifierActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadLinkObjectEndQualifierActionImpl.java
@@ -1,13 +1,13 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -109,20 +112,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INPUT,
-			INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -136,20 +132,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this,
-						UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTPUT,
-			OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -158,11 +147,7 @@
 	 * @generated
 	 */
 	public InputPin getObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT,
-			true, true);
+		return (InputPin) eDynamicGet(UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT, true, true);
 	}
 
 	/**
@@ -171,11 +156,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT,
-			false, true);
+		return (InputPin) eDynamicGet(UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT, false, true);
 	}
 
 	/**
@@ -185,8 +166,7 @@
 	 */
 	public NotificationChain basicSetObject(InputPin newObject,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newObject,
-			UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newObject, UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT, msgs);
 		return msgs;
 	}
 
@@ -196,11 +176,7 @@
 	 * @generated
 	 */
 	public void setObject(InputPin newObject) {
-		eDynamicSet(
-			UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT,
-			newObject);
+		eDynamicSet(UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT, newObject);
 	}
 
 	/**
@@ -233,11 +209,7 @@
 	 * @generated
 	 */
 	public OutputPin getResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT,
-			true, true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -246,11 +218,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT,
-			false, true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT, false, true);
 	}
 
 	/**
@@ -260,8 +228,7 @@
 	 */
 	public NotificationChain basicSetResult(OutputPin newResult,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newResult,
-			UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newResult, UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT, msgs);
 		return msgs;
 	}
 
@@ -271,11 +238,7 @@
 	 * @generated
 	 */
 	public void setResult(OutputPin newResult) {
-		eDynamicSet(
-			UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT,
-			newResult);
+		eDynamicSet(UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT, newResult);
 	}
 
 	/**
@@ -284,8 +247,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setResult(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -300,11 +262,7 @@
 	 * @generated
 	 */
 	public Property getQualifier() {
-		return (Property) eDynamicGet(
-			UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER,
-			true, true);
+		return (Property) eDynamicGet(UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER, true, true);
 	}
 
 	/**
@@ -313,11 +271,7 @@
 	 * @generated
 	 */
 	public Property basicGetQualifier() {
-		return (Property) eDynamicGet(
-			UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER,
-			false, true);
+		return (Property) eDynamicGet(UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER, false, true);
 	}
 
 	/**
@@ -326,11 +280,7 @@
 	 * @generated
 	 */
 	public void setQualifier(Property newQualifier) {
-		eDynamicSet(
-			UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER,
-			newQualifier);
+		eDynamicSet(UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER, newQualifier);
 	}
 
 	/**
@@ -340,8 +290,7 @@
 	 */
 	public boolean validateQualifierAttribute(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkObjectEndQualifierActionOperations
-			.validateQualifierAttribute(this, diagnostics, context);
+		return ReadLinkObjectEndQualifierActionOperations.validateQualifierAttribute(this, diagnostics, context);
 	}
 
 	/**
@@ -351,8 +300,7 @@
 	 */
 	public boolean validateAssociationOfAssociation(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkObjectEndQualifierActionOperations
-			.validateAssociationOfAssociation(this, diagnostics, context);
+		return ReadLinkObjectEndQualifierActionOperations.validateAssociationOfAssociation(this, diagnostics, context);
 	}
 
 	/**
@@ -362,8 +310,7 @@
 	 */
 	public boolean validateEndsOfAssociation(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkObjectEndQualifierActionOperations
-			.validateEndsOfAssociation(this, diagnostics, context);
+		return ReadLinkObjectEndQualifierActionOperations.validateEndsOfAssociation(this, diagnostics, context);
 	}
 
 	/**
@@ -373,8 +320,7 @@
 	 */
 	public boolean validateTypeOfObject(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkObjectEndQualifierActionOperations
-			.validateTypeOfObject(this, diagnostics, context);
+		return ReadLinkObjectEndQualifierActionOperations.validateTypeOfObject(this, diagnostics, context);
 	}
 
 	/**
@@ -384,8 +330,7 @@
 	 */
 	public boolean validateMultiplicityOfQualifier(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkObjectEndQualifierActionOperations
-			.validateMultiplicityOfQualifier(this, diagnostics, context);
+		return ReadLinkObjectEndQualifierActionOperations.validateMultiplicityOfQualifier(this, diagnostics, context);
 	}
 
 	/**
@@ -395,8 +340,7 @@
 	 */
 	public boolean validateMultiplicityOfObject(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkObjectEndQualifierActionOperations
-			.validateMultiplicityOfObject(this, diagnostics, context);
+		return ReadLinkObjectEndQualifierActionOperations.validateMultiplicityOfObject(this, diagnostics, context);
 	}
 
 	/**
@@ -406,8 +350,7 @@
 	 */
 	public boolean validateSameType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkObjectEndQualifierActionOperations.validateSameType(this,
-			diagnostics, context);
+		return ReadLinkObjectEndQualifierActionOperations.validateSameType(this, diagnostics, context);
 	}
 
 	/**
@@ -417,8 +360,7 @@
 	 */
 	public boolean validateMultiplicityOfResult(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadLinkObjectEndQualifierActionOperations
-			.validateMultiplicityOfResult(this, diagnostics, context);
+		return ReadLinkObjectEndQualifierActionOperations.validateMultiplicityOfResult(this, diagnostics, context);
 	}
 
 	/**
@@ -430,41 +372,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.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_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.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 :
-				return basicSetResult(null, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).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_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).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:
+			return basicSetResult(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -477,86 +410,86 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME :
-				return getName();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT :
-				if (resolve)
-					return getObject();
-				return basicGetObject();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER :
-				if (resolve)
-					return getQualifier();
-				return basicGetQualifier();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME:
+			return getName();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT:
+			if (resolve)
+				return getObject();
+			return basicGetObject();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER:
+			if (resolve)
+				return getQualifier();
+			return basicGetQualifier();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -570,86 +503,76 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT :
-				setObject((InputPin) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER :
-				setQualifier((Property) newValue);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT:
+			setObject((InputPin) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER:
+			setQualifier((Property) newValue);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -662,66 +585,66 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT :
-				setObject((InputPin) null);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER :
-				setQualifier((Property) null);
-				return;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT:
+			setObject((InputPin) null);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER:
+			setQualifier((Property) null);
+			return;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -734,70 +657,68 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT :
-				return basicGetObject() != null;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER :
-				return basicGetQualifier() != null;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT :
-				return basicGetResult() != null;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT:
+			return basicGetObject() != null;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__QUALIFIER:
+			return basicGetQualifier() != null;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT:
+			return basicGetResult() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -812,182 +733,146 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_MULTIPLICITY_OF_OBJECT__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfObject(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_TYPE_OF_OBJECT__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfObject((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_MULTIPLICITY_OF_QUALIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfQualifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_ENDS_OF_ASSOCIATION__DIAGNOSTICCHAIN_MAP :
-				return validateEndsOfAssociation(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_MULTIPLICITY_OF_RESULT__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfResult(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_SAME_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSameType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_ASSOCIATION_OF_ASSOCIATION__DIAGNOSTICCHAIN_MAP :
-				return validateAssociationOfAssociation(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_QUALIFIER_ATTRIBUTE__DIAGNOSTICCHAIN_MAP :
-				return validateQualifierAttribute(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_MULTIPLICITY_OF_OBJECT__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfObject((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_TYPE_OF_OBJECT__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfObject((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_MULTIPLICITY_OF_QUALIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfQualifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_ENDS_OF_ASSOCIATION__DIAGNOSTICCHAIN_MAP:
+			return validateEndsOfAssociation((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_MULTIPLICITY_OF_RESULT__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfResult((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_SAME_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSameType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_ASSOCIATION_OF_ASSOCIATION__DIAGNOSTICCHAIN_MAP:
+			return validateAssociationOfAssociation((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION___VALIDATE_QUALIFIER_ATTRIBUTE__DIAGNOSTICCHAIN_MAP:
+			return validateQualifierAttribute((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1000,8 +885,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1011,7 +895,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT);
+				|| eIsSet(UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__OBJECT);
 	}
 
 	/**
@@ -1022,8 +906,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1033,7 +916,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT);
+				|| eIsSet(UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION__RESULT);
 	}
 
 } //ReadLinkObjectEndQualifierActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadSelfActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadSelfActionImpl.java
index 1f5506d..0d206c4 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadSelfActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadSelfActionImpl.java
@@ -1,13 +1,13 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -104,18 +107,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this,
-						UMLPackage.READ_SELF_ACTION__OUTPUT, OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.READ_SELF_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.READ_SELF_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.READ_SELF_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -124,9 +122,7 @@
 	 * @generated
 	 */
 	public OutputPin getResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_SELF_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_SELF_ACTION__RESULT, true, true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_SELF_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_SELF_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -135,9 +131,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_SELF_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_SELF_ACTION__RESULT, false, true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_SELF_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_SELF_ACTION__RESULT, false, true);
 	}
 
 	/**
@@ -147,8 +141,7 @@
 	 */
 	public NotificationChain basicSetResult(OutputPin newResult,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newResult,
-			UMLPackage.READ_SELF_ACTION__RESULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newResult, UMLPackage.READ_SELF_ACTION__RESULT, msgs);
 		return msgs;
 	}
 
@@ -158,8 +151,7 @@
 	 * @generated
 	 */
 	public void setResult(OutputPin newResult) {
-		eDynamicSet(UMLPackage.READ_SELF_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_SELF_ACTION__RESULT, newResult);
+		eDynamicSet(UMLPackage.READ_SELF_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_SELF_ACTION__RESULT, newResult);
 	}
 
 	/**
@@ -168,8 +160,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setResult(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -185,8 +176,7 @@
 	 */
 	public boolean validateContained(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadSelfActionOperations.validateContained(this, diagnostics,
-			context);
+		return ReadSelfActionOperations.validateContained(this, diagnostics, context);
 	}
 
 	/**
@@ -196,8 +186,7 @@
 	 */
 	public boolean validateNotStatic(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadSelfActionOperations.validateNotStatic(this, diagnostics,
-			context);
+		return ReadSelfActionOperations.validateNotStatic(this, diagnostics, context);
 	}
 
 	/**
@@ -207,8 +196,7 @@
 	 */
 	public boolean validateType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadSelfActionOperations.validateType(this, diagnostics,
-			context);
+		return ReadSelfActionOperations.validateType(this, diagnostics, context);
 	}
 
 	/**
@@ -218,8 +206,7 @@
 	 */
 	public boolean validateMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadSelfActionOperations.validateMultiplicity(this, diagnostics,
-			context);
+		return ReadSelfActionOperations.validateMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -231,39 +218,30 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.READ_SELF_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_SELF_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_SELF_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.READ_SELF_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_SELF_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.READ_SELF_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_SELF_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_SELF_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_SELF_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_SELF_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_SELF_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_SELF_ACTION__RESULT :
-				return basicSetResult(null, msgs);
+		case UMLPackage.READ_SELF_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_SELF_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_SELF_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.READ_SELF_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_SELF_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.READ_SELF_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_SELF_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_SELF_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_SELF_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_SELF_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_SELF_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_SELF_ACTION__RESULT:
+			return basicSetResult(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -276,78 +254,78 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.READ_SELF_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.READ_SELF_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.READ_SELF_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.READ_SELF_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.READ_SELF_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.READ_SELF_ACTION__NAME :
-				return getName();
-			case UMLPackage.READ_SELF_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.READ_SELF_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.READ_SELF_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_SELF_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.READ_SELF_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.READ_SELF_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.READ_SELF_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.READ_SELF_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.READ_SELF_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.READ_SELF_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.READ_SELF_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.READ_SELF_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.READ_SELF_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.READ_SELF_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.READ_SELF_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.READ_SELF_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.READ_SELF_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.READ_SELF_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.READ_SELF_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.READ_SELF_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.READ_SELF_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.READ_SELF_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.READ_SELF_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
+		case UMLPackage.READ_SELF_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.READ_SELF_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.READ_SELF_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.READ_SELF_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.READ_SELF_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.READ_SELF_ACTION__NAME:
+			return getName();
+		case UMLPackage.READ_SELF_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.READ_SELF_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.READ_SELF_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_SELF_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.READ_SELF_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.READ_SELF_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.READ_SELF_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.READ_SELF_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.READ_SELF_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.READ_SELF_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.READ_SELF_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.READ_SELF_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.READ_SELF_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.READ_SELF_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.READ_SELF_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.READ_SELF_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.READ_SELF_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.READ_SELF_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.READ_SELF_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.READ_SELF_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.READ_SELF_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.READ_SELF_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.READ_SELF_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -361,80 +339,70 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.READ_SELF_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_SELF_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
+		case UMLPackage.READ_SELF_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_SELF_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -447,60 +415,60 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_SELF_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.READ_SELF_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.READ_SELF_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.READ_SELF_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.READ_SELF_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.READ_SELF_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.READ_SELF_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.READ_SELF_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.READ_SELF_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.READ_SELF_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.READ_SELF_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.READ_SELF_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.READ_SELF_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.READ_SELF_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.READ_SELF_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.READ_SELF_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.READ_SELF_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.READ_SELF_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
+		case UMLPackage.READ_SELF_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.READ_SELF_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.READ_SELF_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.READ_SELF_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.READ_SELF_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.READ_SELF_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.READ_SELF_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.READ_SELF_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.READ_SELF_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.READ_SELF_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.READ_SELF_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.READ_SELF_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.READ_SELF_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.READ_SELF_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.READ_SELF_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.READ_SELF_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.READ_SELF_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.READ_SELF_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -513,66 +481,64 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_SELF_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.READ_SELF_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.READ_SELF_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.READ_SELF_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.READ_SELF_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.READ_SELF_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.READ_SELF_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.READ_SELF_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.READ_SELF_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.READ_SELF_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.READ_SELF_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.READ_SELF_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.READ_SELF_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.READ_SELF_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.READ_SELF_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.READ_SELF_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.READ_SELF_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.READ_SELF_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.READ_SELF_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.READ_SELF_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.READ_SELF_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.READ_SELF_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.READ_SELF_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.READ_SELF_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.READ_SELF_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.READ_SELF_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.READ_SELF_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.READ_SELF_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.READ_SELF_ACTION__RESULT :
-				return basicGetResult() != null;
+		case UMLPackage.READ_SELF_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.READ_SELF_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.READ_SELF_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.READ_SELF_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.READ_SELF_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.READ_SELF_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.READ_SELF_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.READ_SELF_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.READ_SELF_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.READ_SELF_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.READ_SELF_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.READ_SELF_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.READ_SELF_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.READ_SELF_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.READ_SELF_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.READ_SELF_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.READ_SELF_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.READ_SELF_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.READ_SELF_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.READ_SELF_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.READ_SELF_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.READ_SELF_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.READ_SELF_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.READ_SELF_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.READ_SELF_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.READ_SELF_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.READ_SELF_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.READ_SELF_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.READ_SELF_ACTION__RESULT:
+			return basicGetResult() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -587,164 +553,138 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.READ_SELF_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_SELF_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_SELF_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.READ_SELF_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.READ_SELF_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.READ_SELF_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.READ_SELF_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_SELF_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.READ_SELF_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.READ_SELF_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.READ_SELF_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.READ_SELF_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.READ_SELF_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.READ_SELF_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.READ_SELF_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_SELF_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_SELF_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.READ_SELF_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.READ_SELF_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.READ_SELF_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_SELF_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_SELF_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_SELF_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.READ_SELF_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.READ_SELF_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.READ_SELF_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.READ_SELF_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.READ_SELF_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_SELF_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.READ_SELF_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.READ_SELF_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_SELF_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_SELF_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_SELF_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_SELF_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.READ_SELF_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.READ_SELF_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.READ_SELF_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.READ_SELF_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.READ_SELF_ACTION___VALIDATE_CONTAINED__DIAGNOSTICCHAIN_MAP :
-				return validateContained((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_SELF_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_SELF_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP :
-				return validateNotStatic((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_SELF_ACTION___VALIDATE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.READ_SELF_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.READ_SELF_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.READ_SELF_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.READ_SELF_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.READ_SELF_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.READ_SELF_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.READ_SELF_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.READ_SELF_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.READ_SELF_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.READ_SELF_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.READ_SELF_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.READ_SELF_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.READ_SELF_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.READ_SELF_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.READ_SELF_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.READ_SELF_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.READ_SELF_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.READ_SELF_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_SELF_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.READ_SELF_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.READ_SELF_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_SELF_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.READ_SELF_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.READ_SELF_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.READ_SELF_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.READ_SELF_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.READ_SELF_ACTION___VALIDATE_CONTAINED__DIAGNOSTICCHAIN_MAP:
+			return validateContained((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP:
+			return validateNotStatic((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_SELF_ACTION___VALIDATE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -757,8 +697,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.READ_SELF_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.READ_SELF_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -768,7 +707,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.READ_SELF_ACTION__RESULT);
+				|| eIsSet(UMLPackage.READ_SELF_ACTION__RESULT);
 	}
 
 } //ReadSelfActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadStructuralFeatureActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadStructuralFeatureActionImpl.java
index 5f0ccb6..a074ce6 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadStructuralFeatureActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadStructuralFeatureActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -106,19 +109,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this,
-						UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -127,11 +124,7 @@
 	 * @generated
 	 */
 	public OutputPin getResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_STRUCTURAL_FEATURE_ACTION__RESULT, true,
-			true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_STRUCTURAL_FEATURE_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -140,11 +133,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_STRUCTURAL_FEATURE_ACTION__RESULT, false,
-			true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_STRUCTURAL_FEATURE_ACTION__RESULT, false, true);
 	}
 
 	/**
@@ -154,8 +143,7 @@
 	 */
 	public NotificationChain basicSetResult(OutputPin newResult,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newResult,
-			UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newResult, UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT, msgs);
 		return msgs;
 	}
 
@@ -165,11 +153,7 @@
 	 * @generated
 	 */
 	public void setResult(OutputPin newResult) {
-		eDynamicSet(
-			UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_STRUCTURAL_FEATURE_ACTION__RESULT,
-			newResult);
+		eDynamicSet(UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_STRUCTURAL_FEATURE_ACTION__RESULT, newResult);
 	}
 
 	/**
@@ -178,8 +162,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setResult(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -195,8 +178,7 @@
 	 */
 	public boolean validateTypeAndOrdering(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadStructuralFeatureActionOperations
-			.validateTypeAndOrdering(this, diagnostics, context);
+		return ReadStructuralFeatureActionOperations.validateTypeAndOrdering(this, diagnostics, context);
 	}
 
 	/**
@@ -207,8 +189,7 @@
 	@Override
 	public boolean validateMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadStructuralFeatureActionOperations.validateMultiplicity(this,
-			diagnostics, context);
+		return ReadStructuralFeatureActionOperations.validateMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -220,41 +201,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OBJECT :
-				return basicSetObject(null, msgs);
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT :
-				return basicSetResult(null, msgs);
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OBJECT:
+			return basicSetObject(null, msgs);
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT:
+			return basicSetResult(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -267,86 +239,86 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME :
-				return getName();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OBJECT :
-				if (resolve)
-					return getObject();
-				return basicGetObject();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				if (resolve)
-					return getStructuralFeature();
-				return basicGetStructuralFeature();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME:
+			return getName();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OBJECT:
+			if (resolve)
+				return getObject();
+			return basicGetObject();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			if (resolve)
+				return getStructuralFeature();
+			return basicGetStructuralFeature();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -360,86 +332,76 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OBJECT :
-				setObject((InputPin) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				setStructuralFeature((StructuralFeature) newValue);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OBJECT:
+			setObject((InputPin) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			setStructuralFeature((StructuralFeature) newValue);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -452,66 +414,66 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OBJECT :
-				setObject((InputPin) null);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				setStructuralFeature((StructuralFeature) null);
-				return;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OBJECT:
+			setObject((InputPin) null);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			setStructuralFeature((StructuralFeature) null);
+			return;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -524,70 +486,68 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OBJECT :
-				return basicGetObject() != null;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				return basicGetStructuralFeature() != null;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT :
-				return basicGetResult() != null;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__OBJECT:
+			return basicGetObject() != null;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			return basicGetStructuralFeature() != null;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT:
+			return basicGetResult() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -602,172 +562,142 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_OBJECT_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateObjectType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateVisibility((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP :
-				return validateNotStatic((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_ONE_FEATURING_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateOneFeaturingClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_TYPE_AND_ORDERING__DIAGNOSTICCHAIN_MAP :
-				return validateTypeAndOrdering(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_OBJECT_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateObjectType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP:
+			return validateNotStatic((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_ONE_FEATURING_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateOneFeaturingClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION___VALIDATE_TYPE_AND_ORDERING__DIAGNOSTICCHAIN_MAP:
+			return validateTypeAndOrdering((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -780,8 +710,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -791,7 +720,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT);
+				|| eIsSet(UMLPackage.READ_STRUCTURAL_FEATURE_ACTION__RESULT);
 	}
 
 } //ReadStructuralFeatureActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadVariableActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadVariableActionImpl.java
index 637420b..b35c6e3 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadVariableActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReadVariableActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -105,19 +108,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this,
-						UMLPackage.READ_VARIABLE_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.READ_VARIABLE_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.READ_VARIABLE_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.READ_VARIABLE_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -126,9 +123,7 @@
 	 * @generated
 	 */
 	public OutputPin getResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_VARIABLE_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_VARIABLE_ACTION__RESULT, true, true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_VARIABLE_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_VARIABLE_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -137,9 +132,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.READ_VARIABLE_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_VARIABLE_ACTION__RESULT, false, true);
+		return (OutputPin) eDynamicGet(UMLPackage.READ_VARIABLE_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_VARIABLE_ACTION__RESULT, false, true);
 	}
 
 	/**
@@ -149,8 +142,7 @@
 	 */
 	public NotificationChain basicSetResult(OutputPin newResult,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newResult,
-			UMLPackage.READ_VARIABLE_ACTION__RESULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newResult, UMLPackage.READ_VARIABLE_ACTION__RESULT, msgs);
 		return msgs;
 	}
 
@@ -160,9 +152,7 @@
 	 * @generated
 	 */
 	public void setResult(OutputPin newResult) {
-		eDynamicSet(
-			UMLPackage.READ_VARIABLE_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.READ_VARIABLE_ACTION__RESULT, newResult);
+		eDynamicSet(UMLPackage.READ_VARIABLE_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.READ_VARIABLE_ACTION__RESULT, newResult);
 	}
 
 	/**
@@ -171,8 +161,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setResult(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -188,8 +177,7 @@
 	 */
 	public boolean validateTypeAndOrdering(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadVariableActionOperations.validateTypeAndOrdering(this,
-			diagnostics, context);
+		return ReadVariableActionOperations.validateTypeAndOrdering(this, diagnostics, context);
 	}
 
 	/**
@@ -199,8 +187,7 @@
 	 */
 	public boolean validateCompatibleMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReadVariableActionOperations.validateCompatibleMultiplicity(this,
-			diagnostics, context);
+		return ReadVariableActionOperations.validateCompatibleMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -212,39 +199,30 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.READ_VARIABLE_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_VARIABLE_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_VARIABLE_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.READ_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_VARIABLE_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.READ_VARIABLE_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_VARIABLE_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_VARIABLE_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_VARIABLE_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.READ_VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_VARIABLE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.READ_VARIABLE_ACTION__RESULT :
-				return basicSetResult(null, msgs);
+		case UMLPackage.READ_VARIABLE_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_VARIABLE_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_VARIABLE_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.READ_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_VARIABLE_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.READ_VARIABLE_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_VARIABLE_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_VARIABLE_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_VARIABLE_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_VARIABLE_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_VARIABLE_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.READ_VARIABLE_ACTION__RESULT:
+			return basicSetResult(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -257,82 +235,82 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.READ_VARIABLE_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.READ_VARIABLE_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.READ_VARIABLE_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.READ_VARIABLE_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.READ_VARIABLE_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.READ_VARIABLE_ACTION__NAME :
-				return getName();
-			case UMLPackage.READ_VARIABLE_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.READ_VARIABLE_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.READ_VARIABLE_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_VARIABLE_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.READ_VARIABLE_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.READ_VARIABLE_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.READ_VARIABLE_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.READ_VARIABLE_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.READ_VARIABLE_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.READ_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.READ_VARIABLE_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.READ_VARIABLE_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.READ_VARIABLE_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.READ_VARIABLE_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.READ_VARIABLE_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.READ_VARIABLE_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.READ_VARIABLE_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.READ_VARIABLE_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.READ_VARIABLE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.READ_VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.READ_VARIABLE_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.READ_VARIABLE_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.READ_VARIABLE_ACTION__VARIABLE :
-				if (resolve)
-					return getVariable();
-				return basicGetVariable();
-			case UMLPackage.READ_VARIABLE_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
+		case UMLPackage.READ_VARIABLE_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.READ_VARIABLE_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.READ_VARIABLE_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.READ_VARIABLE_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.READ_VARIABLE_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.READ_VARIABLE_ACTION__NAME:
+			return getName();
+		case UMLPackage.READ_VARIABLE_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.READ_VARIABLE_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.READ_VARIABLE_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_VARIABLE_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.READ_VARIABLE_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.READ_VARIABLE_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.READ_VARIABLE_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.READ_VARIABLE_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.READ_VARIABLE_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.READ_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.READ_VARIABLE_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.READ_VARIABLE_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.READ_VARIABLE_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.READ_VARIABLE_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.READ_VARIABLE_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.READ_VARIABLE_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.READ_VARIABLE_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.READ_VARIABLE_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.READ_VARIABLE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.READ_VARIABLE_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.READ_VARIABLE_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.READ_VARIABLE_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.READ_VARIABLE_ACTION__VARIABLE:
+			if (resolve)
+				return getVariable();
+			return basicGetVariable();
+		case UMLPackage.READ_VARIABLE_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -346,83 +324,73 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.READ_VARIABLE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__VARIABLE :
-				setVariable((Variable) newValue);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
+		case UMLPackage.READ_VARIABLE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__VARIABLE:
+			setVariable((Variable) newValue);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -435,63 +403,63 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_VARIABLE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__VARIABLE :
-				setVariable((Variable) null);
-				return;
-			case UMLPackage.READ_VARIABLE_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
+		case UMLPackage.READ_VARIABLE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__VARIABLE:
+			setVariable((Variable) null);
+			return;
+		case UMLPackage.READ_VARIABLE_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -504,68 +472,66 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.READ_VARIABLE_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.READ_VARIABLE_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.READ_VARIABLE_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.READ_VARIABLE_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.READ_VARIABLE_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.READ_VARIABLE_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.READ_VARIABLE_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.READ_VARIABLE_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.READ_VARIABLE_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.READ_VARIABLE_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.READ_VARIABLE_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.READ_VARIABLE_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.READ_VARIABLE_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.READ_VARIABLE_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.READ_VARIABLE_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.READ_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.READ_VARIABLE_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.READ_VARIABLE_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.READ_VARIABLE_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.READ_VARIABLE_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.READ_VARIABLE_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.READ_VARIABLE_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.READ_VARIABLE_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.READ_VARIABLE_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.READ_VARIABLE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.READ_VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.READ_VARIABLE_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.READ_VARIABLE_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.READ_VARIABLE_ACTION__VARIABLE :
-				return basicGetVariable() != null;
-			case UMLPackage.READ_VARIABLE_ACTION__RESULT :
-				return basicGetResult() != null;
+		case UMLPackage.READ_VARIABLE_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.READ_VARIABLE_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.READ_VARIABLE_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.READ_VARIABLE_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.READ_VARIABLE_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.READ_VARIABLE_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.READ_VARIABLE_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.READ_VARIABLE_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.READ_VARIABLE_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.READ_VARIABLE_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.READ_VARIABLE_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.READ_VARIABLE_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.READ_VARIABLE_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.READ_VARIABLE_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.READ_VARIABLE_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.READ_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.READ_VARIABLE_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.READ_VARIABLE_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.READ_VARIABLE_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.READ_VARIABLE_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.READ_VARIABLE_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.READ_VARIABLE_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.READ_VARIABLE_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.READ_VARIABLE_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.READ_VARIABLE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.READ_VARIABLE_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.READ_VARIABLE_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.READ_VARIABLE_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.READ_VARIABLE_ACTION__VARIABLE:
+			return basicGetVariable() != null;
+		case UMLPackage.READ_VARIABLE_ACTION__RESULT:
+			return basicGetResult() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -580,164 +546,136 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.READ_VARIABLE_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_VARIABLE_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.READ_VARIABLE_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.READ_VARIABLE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.READ_VARIABLE_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.READ_VARIABLE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_VARIABLE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.READ_VARIABLE_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.READ_VARIABLE_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.READ_VARIABLE_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.READ_VARIABLE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.READ_VARIABLE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.READ_VARIABLE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.READ_VARIABLE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_VARIABLE_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.READ_VARIABLE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.READ_VARIABLE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.READ_VARIABLE_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_VARIABLE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.READ_VARIABLE_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.READ_VARIABLE_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.READ_VARIABLE_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.READ_VARIABLE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.READ_VARIABLE_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.READ_VARIABLE_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.READ_VARIABLE_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_VARIABLE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.READ_VARIABLE_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.READ_VARIABLE_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.READ_VARIABLE_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.READ_VARIABLE_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.READ_VARIABLE_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_SCOPE_OF_VARIABLE__DIAGNOSTICCHAIN_MAP :
-				return validateScopeOfVariable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_TYPE_AND_ORDERING__DIAGNOSTICCHAIN_MAP :
-				return validateTypeAndOrdering(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_COMPATIBLE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateCompatibleMultiplicity(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_VARIABLE_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_VARIABLE_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.READ_VARIABLE_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.READ_VARIABLE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.READ_VARIABLE_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.READ_VARIABLE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_VARIABLE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.READ_VARIABLE_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.READ_VARIABLE_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.READ_VARIABLE_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.READ_VARIABLE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.READ_VARIABLE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.READ_VARIABLE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.READ_VARIABLE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_VARIABLE_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.READ_VARIABLE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.READ_VARIABLE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.READ_VARIABLE_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_VARIABLE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.READ_VARIABLE_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.READ_VARIABLE_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.READ_VARIABLE_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.READ_VARIABLE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.READ_VARIABLE_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.READ_VARIABLE_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.READ_VARIABLE_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_VARIABLE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.READ_VARIABLE_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.READ_VARIABLE_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.READ_VARIABLE_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.READ_VARIABLE_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.READ_VARIABLE_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_SCOPE_OF_VARIABLE__DIAGNOSTICCHAIN_MAP:
+			return validateScopeOfVariable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_TYPE_AND_ORDERING__DIAGNOSTICCHAIN_MAP:
+			return validateTypeAndOrdering((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.READ_VARIABLE_ACTION___VALIDATE_COMPATIBLE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateCompatibleMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -750,8 +688,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.READ_VARIABLE_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.READ_VARIABLE_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -761,7 +698,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.READ_VARIABLE_ACTION__RESULT);
+				|| eIsSet(UMLPackage.READ_VARIABLE_ACTION__RESULT);
 	}
 
 } //ReadVariableActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RealizationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RealizationImpl.java
index 1396514..cb54231 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RealizationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RealizationImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReceptionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReceptionImpl.java
index e32e0be..b295de2 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReceptionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReceptionImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,11 +18,17 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+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;
@@ -87,9 +93,7 @@
 	 * @generated
 	 */
 	public Signal getSignal() {
-		return (Signal) eDynamicGet(
-			UMLPackage.RECEPTION__SIGNAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.RECEPTION__SIGNAL, true, true);
+		return (Signal) eDynamicGet(UMLPackage.RECEPTION__SIGNAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.RECEPTION__SIGNAL, true, true);
 	}
 
 	/**
@@ -98,9 +102,7 @@
 	 * @generated
 	 */
 	public Signal basicGetSignal() {
-		return (Signal) eDynamicGet(
-			UMLPackage.RECEPTION__SIGNAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.RECEPTION__SIGNAL, false, true);
+		return (Signal) eDynamicGet(UMLPackage.RECEPTION__SIGNAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.RECEPTION__SIGNAL, false, true);
 	}
 
 	/**
@@ -109,8 +111,7 @@
 	 * @generated
 	 */
 	public void setSignal(Signal newSignal) {
-		eDynamicSet(UMLPackage.RECEPTION__SIGNAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.RECEPTION__SIGNAL, newSignal);
+		eDynamicSet(UMLPackage.RECEPTION__SIGNAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.RECEPTION__SIGNAL, newSignal);
 	}
 
 	/**
@@ -120,8 +121,7 @@
 	 */
 	public boolean validateSameNameAsSignal(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReceptionOperations.validateSameNameAsSignal(this, diagnostics,
-			context);
+		return ReceptionOperations.validateSameNameAsSignal(this, diagnostics, context);
 	}
 
 	/**
@@ -131,8 +131,7 @@
 	 */
 	public boolean validateSameStructureAsSignal(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReceptionOperations.validateSameStructureAsSignal(this,
-			diagnostics, context);
+		return ReceptionOperations.validateSameStructureAsSignal(this, diagnostics, context);
 	}
 
 	/**
@@ -143,70 +142,70 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.RECEPTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.RECEPTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.RECEPTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.RECEPTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.RECEPTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.RECEPTION__NAME :
-				return getName();
-			case UMLPackage.RECEPTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.RECEPTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.RECEPTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.RECEPTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.RECEPTION__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.RECEPTION__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.RECEPTION__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.RECEPTION__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.RECEPTION__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.RECEPTION__MEMBER :
-				return getMembers();
-			case UMLPackage.RECEPTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.RECEPTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.RECEPTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.RECEPTION__FEATURING_CLASSIFIER :
-				return getFeaturingClassifiers();
-			case UMLPackage.RECEPTION__IS_STATIC :
-				return isStatic();
-			case UMLPackage.RECEPTION__CONCURRENCY :
-				return getConcurrency();
-			case UMLPackage.RECEPTION__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.RECEPTION__METHOD :
-				return getMethods();
-			case UMLPackage.RECEPTION__OWNED_PARAMETER :
-				return getOwnedParameters();
-			case UMLPackage.RECEPTION__OWNED_PARAMETER_SET :
-				return getOwnedParameterSets();
-			case UMLPackage.RECEPTION__RAISED_EXCEPTION :
-				return getRaisedExceptions();
-			case UMLPackage.RECEPTION__SIGNAL :
-				if (resolve)
-					return getSignal();
-				return basicGetSignal();
+		case UMLPackage.RECEPTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.RECEPTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.RECEPTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.RECEPTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.RECEPTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.RECEPTION__NAME:
+			return getName();
+		case UMLPackage.RECEPTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.RECEPTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.RECEPTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.RECEPTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.RECEPTION__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.RECEPTION__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.RECEPTION__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.RECEPTION__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.RECEPTION__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.RECEPTION__MEMBER:
+			return getMembers();
+		case UMLPackage.RECEPTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.RECEPTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.RECEPTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.RECEPTION__FEATURING_CLASSIFIER:
+			return getFeaturingClassifiers();
+		case UMLPackage.RECEPTION__IS_STATIC:
+			return isStatic();
+		case UMLPackage.RECEPTION__CONCURRENCY:
+			return getConcurrency();
+		case UMLPackage.RECEPTION__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.RECEPTION__METHOD:
+			return getMethods();
+		case UMLPackage.RECEPTION__OWNED_PARAMETER:
+			return getOwnedParameters();
+		case UMLPackage.RECEPTION__OWNED_PARAMETER_SET:
+			return getOwnedParameterSets();
+		case UMLPackage.RECEPTION__RAISED_EXCEPTION:
+			return getRaisedExceptions();
+		case UMLPackage.RECEPTION__SIGNAL:
+			if (resolve)
+				return getSignal();
+			return basicGetSignal();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -220,74 +219,66 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.RECEPTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.RECEPTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.RECEPTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.RECEPTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.RECEPTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.RECEPTION__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.RECEPTION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.RECEPTION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.RECEPTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.RECEPTION__IS_STATIC :
-				setIsStatic((Boolean) newValue);
-				return;
-			case UMLPackage.RECEPTION__CONCURRENCY :
-				setConcurrency((CallConcurrencyKind) newValue);
-				return;
-			case UMLPackage.RECEPTION__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.RECEPTION__METHOD :
-				getMethods().clear();
-				getMethods().addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.RECEPTION__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				getOwnedParameters()
-					.addAll((Collection<? extends Parameter>) newValue);
-				return;
-			case UMLPackage.RECEPTION__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				getOwnedParameterSets()
-					.addAll((Collection<? extends ParameterSet>) newValue);
-				return;
-			case UMLPackage.RECEPTION__RAISED_EXCEPTION :
-				getRaisedExceptions().clear();
-				getRaisedExceptions()
-					.addAll((Collection<? extends Type>) newValue);
-				return;
-			case UMLPackage.RECEPTION__SIGNAL :
-				setSignal((Signal) newValue);
-				return;
+		case UMLPackage.RECEPTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.RECEPTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.RECEPTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.RECEPTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.RECEPTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.RECEPTION__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.RECEPTION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.RECEPTION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.RECEPTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.RECEPTION__IS_STATIC:
+			setIsStatic((Boolean) newValue);
+			return;
+		case UMLPackage.RECEPTION__CONCURRENCY:
+			setConcurrency((CallConcurrencyKind) newValue);
+			return;
+		case UMLPackage.RECEPTION__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.RECEPTION__METHOD:
+			getMethods().clear();
+			getMethods().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.RECEPTION__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			getOwnedParameters().addAll((Collection<? extends Parameter>) newValue);
+			return;
+		case UMLPackage.RECEPTION__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			getOwnedParameterSets().addAll((Collection<? extends ParameterSet>) newValue);
+			return;
+		case UMLPackage.RECEPTION__RAISED_EXCEPTION:
+			getRaisedExceptions().clear();
+			getRaisedExceptions().addAll((Collection<? extends Type>) newValue);
+			return;
+		case UMLPackage.RECEPTION__SIGNAL:
+			setSignal((Signal) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -300,57 +291,57 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.RECEPTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.RECEPTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.RECEPTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.RECEPTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.RECEPTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.RECEPTION__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.RECEPTION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.RECEPTION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.RECEPTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.RECEPTION__IS_STATIC :
-				setIsStatic(IS_STATIC_EDEFAULT);
-				return;
-			case UMLPackage.RECEPTION__CONCURRENCY :
-				setConcurrency(CONCURRENCY_EDEFAULT);
-				return;
-			case UMLPackage.RECEPTION__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.RECEPTION__METHOD :
-				getMethods().clear();
-				return;
-			case UMLPackage.RECEPTION__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				return;
-			case UMLPackage.RECEPTION__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				return;
-			case UMLPackage.RECEPTION__RAISED_EXCEPTION :
-				getRaisedExceptions().clear();
-				return;
-			case UMLPackage.RECEPTION__SIGNAL :
-				setSignal((Signal) null);
-				return;
+		case UMLPackage.RECEPTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.RECEPTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.RECEPTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.RECEPTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.RECEPTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.RECEPTION__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.RECEPTION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.RECEPTION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.RECEPTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.RECEPTION__IS_STATIC:
+			setIsStatic(IS_STATIC_EDEFAULT);
+			return;
+		case UMLPackage.RECEPTION__CONCURRENCY:
+			setConcurrency(CONCURRENCY_EDEFAULT);
+			return;
+		case UMLPackage.RECEPTION__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.RECEPTION__METHOD:
+			getMethods().clear();
+			return;
+		case UMLPackage.RECEPTION__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			return;
+		case UMLPackage.RECEPTION__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			return;
+		case UMLPackage.RECEPTION__RAISED_EXCEPTION:
+			getRaisedExceptions().clear();
+			return;
+		case UMLPackage.RECEPTION__SIGNAL:
+			setSignal((Signal) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -363,64 +354,62 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.RECEPTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.RECEPTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.RECEPTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.RECEPTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.RECEPTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.RECEPTION__NAME :
-				return isSetName();
-			case UMLPackage.RECEPTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.RECEPTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.RECEPTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.RECEPTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.RECEPTION__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.RECEPTION__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.RECEPTION__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.RECEPTION__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.RECEPTION__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.RECEPTION__MEMBER :
-				return isSetMembers();
-			case UMLPackage.RECEPTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.RECEPTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.RECEPTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.RECEPTION__FEATURING_CLASSIFIER :
-				return isSetFeaturingClassifiers();
-			case UMLPackage.RECEPTION__IS_STATIC :
-				return isStatic() != IS_STATIC_EDEFAULT;
-			case UMLPackage.RECEPTION__CONCURRENCY :
-				return getConcurrency() != CONCURRENCY_EDEFAULT;
-			case UMLPackage.RECEPTION__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.RECEPTION__METHOD :
-				return !getMethods().isEmpty();
-			case UMLPackage.RECEPTION__OWNED_PARAMETER :
-				return !getOwnedParameters().isEmpty();
-			case UMLPackage.RECEPTION__OWNED_PARAMETER_SET :
-				return !getOwnedParameterSets().isEmpty();
-			case UMLPackage.RECEPTION__RAISED_EXCEPTION :
-				return !getRaisedExceptions().isEmpty();
-			case UMLPackage.RECEPTION__SIGNAL :
-				return basicGetSignal() != null;
+		case UMLPackage.RECEPTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.RECEPTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.RECEPTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.RECEPTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.RECEPTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.RECEPTION__NAME:
+			return isSetName();
+		case UMLPackage.RECEPTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.RECEPTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.RECEPTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.RECEPTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.RECEPTION__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.RECEPTION__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.RECEPTION__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.RECEPTION__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.RECEPTION__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.RECEPTION__MEMBER:
+			return isSetMembers();
+		case UMLPackage.RECEPTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.RECEPTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.RECEPTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.RECEPTION__FEATURING_CLASSIFIER:
+			return isSetFeaturingClassifiers();
+		case UMLPackage.RECEPTION__IS_STATIC:
+			return isStatic() != IS_STATIC_EDEFAULT;
+		case UMLPackage.RECEPTION__CONCURRENCY:
+			return getConcurrency() != CONCURRENCY_EDEFAULT;
+		case UMLPackage.RECEPTION__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.RECEPTION__METHOD:
+			return !getMethods().isEmpty();
+		case UMLPackage.RECEPTION__OWNED_PARAMETER:
+			return !getOwnedParameters().isEmpty();
+		case UMLPackage.RECEPTION__OWNED_PARAMETER_SET:
+			return !getOwnedParameterSets().isEmpty();
+		case UMLPackage.RECEPTION__RAISED_EXCEPTION:
+			return !getRaisedExceptions().isEmpty();
+		case UMLPackage.RECEPTION__SIGNAL:
+			return basicGetSignal() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -435,199 +424,158 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.RECEPTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.RECEPTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECEPTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECEPTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.RECEPTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.RECEPTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.RECEPTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.RECEPTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.RECEPTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.RECEPTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.RECEPTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.RECEPTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.RECEPTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.RECEPTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.RECEPTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.RECEPTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.RECEPTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.RECEPTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.RECEPTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.RECEPTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.RECEPTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.RECEPTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.RECEPTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.RECEPTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.RECEPTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.RECEPTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.RECEPTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.RECEPTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.RECEPTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.RECEPTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.RECEPTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.RECEPTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.RECEPTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.RECEPTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.RECEPTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.RECEPTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.RECEPTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.RECEPTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECEPTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECEPTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECEPTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.RECEPTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.RECEPTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.RECEPTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.RECEPTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.RECEPTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.RECEPTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.RECEPTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.RECEPTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.RECEPTION___SEPARATOR :
-				return separator();
-			case UMLPackage.RECEPTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.RECEPTION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECEPTION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECEPTION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECEPTION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.RECEPTION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.RECEPTION___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.RECEPTION___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.RECEPTION___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.RECEPTION___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.RECEPTION___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.RECEPTION___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.RECEPTION___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.RECEPTION___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.RECEPTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECEPTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECEPTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECEPTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.RECEPTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.RECEPTION___VALIDATE_ABSTRACT_NO_METHOD__DIAGNOSTICCHAIN_MAP :
-				return validateAbstractNoMethod(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECEPTION___CREATE_RETURN_RESULT__STRING_TYPE :
-				return createReturnResult((String) arguments.get(0),
-					(Type) arguments.get(1));
-			case UMLPackage.RECEPTION___INPUT_PARAMETERS :
-				return inputParameters();
-			case UMLPackage.RECEPTION___OUTPUT_PARAMETERS :
-				return outputParameters();
-			case UMLPackage.RECEPTION___VALIDATE_SAME_NAME_AS_SIGNAL__DIAGNOSTICCHAIN_MAP :
-				return validateSameNameAsSignal(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECEPTION___VALIDATE_SAME_STRUCTURE_AS_SIGNAL__DIAGNOSTICCHAIN_MAP :
-				return validateSameStructureAsSignal(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECEPTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.RECEPTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECEPTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECEPTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.RECEPTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.RECEPTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.RECEPTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.RECEPTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.RECEPTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.RECEPTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.RECEPTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.RECEPTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.RECEPTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.RECEPTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.RECEPTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.RECEPTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.RECEPTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.RECEPTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.RECEPTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.RECEPTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.RECEPTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.RECEPTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.RECEPTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.RECEPTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.RECEPTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.RECEPTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.RECEPTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.RECEPTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.RECEPTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.RECEPTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.RECEPTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.RECEPTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.RECEPTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.RECEPTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.RECEPTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.RECEPTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.RECEPTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.RECEPTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECEPTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECEPTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECEPTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.RECEPTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.RECEPTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.RECEPTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.RECEPTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.RECEPTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.RECEPTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.RECEPTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.RECEPTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.RECEPTION___SEPARATOR:
+			return separator();
+		case UMLPackage.RECEPTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.RECEPTION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECEPTION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECEPTION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECEPTION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.RECEPTION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.RECEPTION___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.RECEPTION___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.RECEPTION___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.RECEPTION___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.RECEPTION___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.RECEPTION___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.RECEPTION___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.RECEPTION___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.RECEPTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECEPTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECEPTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECEPTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.RECEPTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.RECEPTION___VALIDATE_ABSTRACT_NO_METHOD__DIAGNOSTICCHAIN_MAP:
+			return validateAbstractNoMethod((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECEPTION___CREATE_RETURN_RESULT__STRING_TYPE:
+			return createReturnResult((String) arguments.get(0), (Type) arguments.get(1));
+		case UMLPackage.RECEPTION___INPUT_PARAMETERS:
+			return inputParameters();
+		case UMLPackage.RECEPTION___OUTPUT_PARAMETERS:
+			return outputParameters();
+		case UMLPackage.RECEPTION___VALIDATE_SAME_NAME_AS_SIGNAL__DIAGNOSTICCHAIN_MAP:
+			return validateSameNameAsSignal((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECEPTION___VALIDATE_SAME_STRUCTURE_AS_SIGNAL__DIAGNOSTICCHAIN_MAP:
+			return validateSameStructureAsSignal((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReclassifyObjectActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReclassifyObjectActionImpl.java
index e550b82..27c5ec2 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReclassifyObjectActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReclassifyObjectActionImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,8 +29,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -119,19 +123,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.RECLASSIFY_OBJECT_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.RECLASSIFY_OBJECT_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.RECLASSIFY_OBJECT_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.RECLASSIFY_OBJECT_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -140,11 +138,7 @@
 	 * @generated
 	 */
 	public boolean isReplaceAll() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL, true,
-			true);
+		return (Boolean) eDynamicGet(UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL, true, true);
 	}
 
 	/**
@@ -153,11 +147,7 @@
 	 * @generated
 	 */
 	public void setIsReplaceAll(boolean newIsReplaceAll) {
-		eDynamicSet(
-			UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL,
-			newIsReplaceAll);
+		eDynamicSet(UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL, newIsReplaceAll);
 	}
 
 	/**
@@ -167,11 +157,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Classifier> getOldClassifiers() {
-		return (EList<Classifier>) eDynamicGet(
-			UMLPackage.RECLASSIFY_OBJECT_ACTION__OLD_CLASSIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.RECLASSIFY_OBJECT_ACTION__OLD_CLASSIFIER, true,
-			true);
+		return (EList<Classifier>) eDynamicGet(UMLPackage.RECLASSIFY_OBJECT_ACTION__OLD_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.RECLASSIFY_OBJECT_ACTION__OLD_CLASSIFIER, true, true);
 	}
 
 	/**
@@ -190,12 +176,10 @@
 	 */
 	public Classifier getOldClassifier(String name, boolean ignoreCase,
 			EClass eClass) {
-		oldClassifierLoop : for (Classifier oldClassifier : getOldClassifiers()) {
+		oldClassifierLoop: for (Classifier oldClassifier : getOldClassifiers()) {
 			if (eClass != null && !eClass.isInstance(oldClassifier))
 				continue oldClassifierLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(oldClassifier.getName())
-				: name.equals(oldClassifier.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(oldClassifier.getName()) : name.equals(oldClassifier.getName())))
 				continue oldClassifierLoop;
 			return oldClassifier;
 		}
@@ -209,11 +193,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Classifier> getNewClassifiers() {
-		return (EList<Classifier>) eDynamicGet(
-			UMLPackage.RECLASSIFY_OBJECT_ACTION__NEW_CLASSIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.RECLASSIFY_OBJECT_ACTION__NEW_CLASSIFIER, true,
-			true);
+		return (EList<Classifier>) eDynamicGet(UMLPackage.RECLASSIFY_OBJECT_ACTION__NEW_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.RECLASSIFY_OBJECT_ACTION__NEW_CLASSIFIER, true, true);
 	}
 
 	/**
@@ -232,12 +212,10 @@
 	 */
 	public Classifier getNewClassifier(String name, boolean ignoreCase,
 			EClass eClass) {
-		newClassifierLoop : for (Classifier newClassifier : getNewClassifiers()) {
+		newClassifierLoop: for (Classifier newClassifier : getNewClassifiers()) {
 			if (eClass != null && !eClass.isInstance(newClassifier))
 				continue newClassifierLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(newClassifier.getName())
-				: name.equals(newClassifier.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(newClassifier.getName()) : name.equals(newClassifier.getName())))
 				continue newClassifierLoop;
 			return newClassifier;
 		}
@@ -250,9 +228,7 @@
 	 * @generated
 	 */
 	public InputPin getObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.RECLASSIFY_OBJECT_ACTION__OBJECT, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.RECLASSIFY_OBJECT_ACTION__OBJECT, true, true);
 	}
 
 	/**
@@ -261,9 +237,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.RECLASSIFY_OBJECT_ACTION__OBJECT, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.RECLASSIFY_OBJECT_ACTION__OBJECT, false, true);
 	}
 
 	/**
@@ -273,8 +247,7 @@
 	 */
 	public NotificationChain basicSetObject(InputPin newObject,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newObject,
-			UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newObject, UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT, msgs);
 		return msgs;
 	}
 
@@ -284,9 +257,7 @@
 	 * @generated
 	 */
 	public void setObject(InputPin newObject) {
-		eDynamicSet(
-			UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.RECLASSIFY_OBJECT_ACTION__OBJECT, newObject);
+		eDynamicSet(UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.RECLASSIFY_OBJECT_ACTION__OBJECT, newObject);
 	}
 
 	/**
@@ -320,8 +291,7 @@
 	 */
 	public boolean validateClassifierNotAbstract(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReclassifyObjectActionOperations
-			.validateClassifierNotAbstract(this, diagnostics, context);
+		return ReclassifyObjectActionOperations.validateClassifierNotAbstract(this, diagnostics, context);
 	}
 
 	/**
@@ -331,8 +301,7 @@
 	 */
 	public boolean validateMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReclassifyObjectActionOperations.validateMultiplicity(this,
-			diagnostics, context);
+		return ReclassifyObjectActionOperations.validateMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -342,8 +311,7 @@
 	 */
 	public boolean validateInputPin(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReclassifyObjectActionOperations.validateInputPin(this,
-			diagnostics, context);
+		return ReclassifyObjectActionOperations.validateInputPin(this, diagnostics, context);
 	}
 
 	/**
@@ -355,39 +323,30 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT :
-				return basicSetObject(null, msgs);
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT:
+			return basicSetObject(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -400,84 +359,84 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME :
-				return getName();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL :
-				return isReplaceAll();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NEW_CLASSIFIER :
-				return getNewClassifiers();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT :
-				if (resolve)
-					return getObject();
-				return basicGetObject();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OLD_CLASSIFIER :
-				return getOldClassifiers();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME:
+			return getName();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL:
+			return isReplaceAll();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__NEW_CLASSIFIER:
+			return getNewClassifiers();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT:
+			if (resolve)
+				return getObject();
+			return basicGetObject();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OLD_CLASSIFIER:
+			return getOldClassifiers();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -491,93 +450,81 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL :
-				setIsReplaceAll((Boolean) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NEW_CLASSIFIER :
-				getNewClassifiers().clear();
-				getNewClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT :
-				setObject((InputPin) newValue);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OLD_CLASSIFIER :
-				getOldClassifiers().clear();
-				getOldClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL:
+			setIsReplaceAll((Boolean) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__NEW_CLASSIFIER:
+			getNewClassifiers().clear();
+			getNewClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT:
+			setObject((InputPin) newValue);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OLD_CLASSIFIER:
+			getOldClassifiers().clear();
+			getOldClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -590,69 +537,69 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL :
-				setIsReplaceAll(IS_REPLACE_ALL_EDEFAULT);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NEW_CLASSIFIER :
-				getNewClassifiers().clear();
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT :
-				setObject((InputPin) null);
-				return;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OLD_CLASSIFIER :
-				getOldClassifiers().clear();
-				return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL:
+			setIsReplaceAll(IS_REPLACE_ALL_EDEFAULT);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__NEW_CLASSIFIER:
+			getNewClassifiers().clear();
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT:
+			setObject((InputPin) null);
+			return;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OLD_CLASSIFIER:
+			getOldClassifiers().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -665,72 +612,70 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL :
-				return isReplaceAll() != IS_REPLACE_ALL_EDEFAULT;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__NEW_CLASSIFIER :
-				return !getNewClassifiers().isEmpty();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT :
-				return basicGetObject() != null;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION__OLD_CLASSIFIER :
-				return !getOldClassifiers().isEmpty();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__IS_REPLACE_ALL:
+			return isReplaceAll() != IS_REPLACE_ALL_EDEFAULT;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__NEW_CLASSIFIER:
+			return !getNewClassifiers().isEmpty();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT:
+			return basicGetObject() != null;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION__OLD_CLASSIFIER:
+			return !getOldClassifiers().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -745,162 +690,136 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_INPUT_PIN__DIAGNOSTICCHAIN_MAP :
-				return validateInputPin((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_CLASSIFIER_NOT_ABSTRACT__DIAGNOSTICCHAIN_MAP :
-				return validateClassifierNotAbstract(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_INPUT_PIN__DIAGNOSTICCHAIN_MAP:
+			return validateInputPin((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_CLASSIFIER_NOT_ABSTRACT__DIAGNOSTICCHAIN_MAP:
+			return validateClassifierNotAbstract((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -913,8 +832,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -924,7 +842,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT);
+				|| eIsSet(UMLPackage.RECLASSIFY_OBJECT_ACTION__OBJECT);
 	}
 
 } //ReclassifyObjectActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RedefinableElementImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RedefinableElementImpl.java
index 16944b3..6681aac 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RedefinableElementImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RedefinableElementImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,12 +18,16 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -100,22 +104,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			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>(
-						RedefinableElement.class, this,
-						UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
-						null));
+				cache.put(eResource, this, UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(RedefinableElement.class, this, UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT, null));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList<RedefinableElement>(
-			RedefinableElement.class, this,
-			UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT, null);
+		return new DerivedUnionEObjectEList<RedefinableElement>(RedefinableElement.class, this, UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT, null);
 	}
 
 	/**
@@ -134,12 +130,10 @@
 	 */
 	public RedefinableElement getRedefinedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		redefinedElementLoop : for (RedefinableElement redefinedElement : getRedefinedElements()) {
+		redefinedElementLoop: for (RedefinableElement redefinedElement : getRedefinedElements()) {
 			if (eClass != null && !eClass.isInstance(redefinedElement))
 				continue redefinedElementLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinedElement.getName())
-				: name.equals(redefinedElement.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinedElement.getName()) : name.equals(redefinedElement.getName())))
 				continue redefinedElementLoop;
 			return redefinedElement;
 		}
@@ -156,29 +150,21 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			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<Classifier>(
-						Classifier.class, this,
-						UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						null));
+				cache.put(eResource, this, UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT, redefinitionContexts = new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT, null));
 			}
 			return redefinitionContexts;
 		}
-		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
-			UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT, null);
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT, null);
 	}
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getRedefinitionContexts() <em>Redefinition Context</em>}' reference list.
 	 * @see #getRedefinitionContexts()
 	 */
-	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[]{
-		UMLPackage.REDEFINABLE_ELEMENT__OWNER};
+	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[] {
+			UMLPackage.REDEFINABLE_ELEMENT__OWNER };
 
 	public EList<Classifier> getRedefinitionContexts() {
 		CacheAdapter cache = getCacheAdapter();
@@ -186,21 +172,21 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+					.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<Classifier>(
-						Classifier.class, this,
-						UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						REDEFINITION_CONTEXT_ESUBSETS));
+						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
+						redefinitionContexts = new DerivedEObjectEList<Classifier>(
+								Classifier.class, this,
+								UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
+								REDEFINITION_CONTEXT_ESUBSETS));
 			}
 			return redefinitionContexts;
 		}
 		return new DerivedEObjectEList<Classifier>(Classifier.class, this,
-			UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-			REDEFINITION_CONTEXT_ESUBSETS);
+				UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
+				REDEFINITION_CONTEXT_ESUBSETS);
 	}
 
 	/**
@@ -219,12 +205,10 @@
 	 */
 	public Classifier getRedefinitionContext(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinitionContextLoop : for (Classifier redefinitionContext : getRedefinitionContexts()) {
+		redefinitionContextLoop: for (Classifier redefinitionContext : getRedefinitionContexts()) {
 			if (eClass != null && !eClass.isInstance(redefinitionContext))
 				continue redefinitionContextLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinitionContext.getName())
-				: name.equals(redefinitionContext.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinitionContext.getName()) : name.equals(redefinitionContext.getName())))
 				continue redefinitionContextLoop;
 			return redefinitionContext;
 		}
@@ -237,9 +221,7 @@
 	 * @generated
 	 */
 	public boolean isLeaf() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, true, true);
 	}
 
 	/**
@@ -248,9 +230,7 @@
 	 * @generated
 	 */
 	public void setIsLeaf(boolean newIsLeaf) {
-		eDynamicSet(
-			UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, newIsLeaf);
+		eDynamicSet(UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, newIsLeaf);
 	}
 
 	/**
@@ -260,8 +240,7 @@
 	 */
 	public boolean validateRedefinitionContextValid(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations
-			.validateRedefinitionContextValid(this, diagnostics, context);
+		return RedefinableElementOperations.validateRedefinitionContextValid(this, diagnostics, context);
 	}
 
 	/**
@@ -271,8 +250,7 @@
 	 */
 	public boolean validateRedefinitionConsistent(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations.validateRedefinitionConsistent(this,
-			diagnostics, context);
+		return RedefinableElementOperations.validateRedefinitionConsistent(this, diagnostics, context);
 	}
 
 	/**
@@ -282,8 +260,7 @@
 	 */
 	public boolean validateNonLeafRedefinition(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations.validateNonLeafRedefinition(this,
-			diagnostics, context);
+		return RedefinableElementOperations.validateNonLeafRedefinition(this, diagnostics, context);
 	}
 
 	/**
@@ -293,8 +270,7 @@
 	 */
 	public boolean isRedefinitionContextValid(
 			RedefinableElement redefinedElement) {
-		return RedefinableElementOperations.isRedefinitionContextValid(this,
-			redefinedElement);
+		return RedefinableElementOperations.isRedefinitionContextValid(this, redefinedElement);
 	}
 
 	/**
@@ -305,38 +281,38 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.REDEFINABLE_ELEMENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.REDEFINABLE_ELEMENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.REDEFINABLE_ELEMENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.REDEFINABLE_ELEMENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.REDEFINABLE_ELEMENT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.REDEFINABLE_ELEMENT__NAME :
-				return getName();
-			case UMLPackage.REDEFINABLE_ELEMENT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.REDEFINABLE_ELEMENT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.REDEFINABLE_ELEMENT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.REDEFINABLE_ELEMENT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
+		case UMLPackage.REDEFINABLE_ELEMENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.REDEFINABLE_ELEMENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.REDEFINABLE_ELEMENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.REDEFINABLE_ELEMENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.REDEFINABLE_ELEMENT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.REDEFINABLE_ELEMENT__NAME:
+			return getName();
+		case UMLPackage.REDEFINABLE_ELEMENT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.REDEFINABLE_ELEMENT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.REDEFINABLE_ELEMENT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.REDEFINABLE_ELEMENT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -350,28 +326,26 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.REDEFINABLE_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.REDEFINABLE_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.REDEFINABLE_ELEMENT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.REDEFINABLE_ELEMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.REDEFINABLE_ELEMENT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
+		case UMLPackage.REDEFINABLE_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.REDEFINABLE_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.REDEFINABLE_ELEMENT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.REDEFINABLE_ELEMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.REDEFINABLE_ELEMENT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -384,24 +358,24 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.REDEFINABLE_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.REDEFINABLE_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.REDEFINABLE_ELEMENT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.REDEFINABLE_ELEMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.REDEFINABLE_ELEMENT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
+		case UMLPackage.REDEFINABLE_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.REDEFINABLE_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.REDEFINABLE_ELEMENT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.REDEFINABLE_ELEMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.REDEFINABLE_ELEMENT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -414,34 +388,32 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.REDEFINABLE_ELEMENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.REDEFINABLE_ELEMENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.REDEFINABLE_ELEMENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.REDEFINABLE_ELEMENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.REDEFINABLE_ELEMENT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.REDEFINABLE_ELEMENT__NAME :
-				return isSetName();
-			case UMLPackage.REDEFINABLE_ELEMENT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.REDEFINABLE_ELEMENT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.REDEFINABLE_ELEMENT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.REDEFINABLE_ELEMENT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
+		case UMLPackage.REDEFINABLE_ELEMENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.REDEFINABLE_ELEMENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.REDEFINABLE_ELEMENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.REDEFINABLE_ELEMENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.REDEFINABLE_ELEMENT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.REDEFINABLE_ELEMENT__NAME:
+			return isSetName();
+		case UMLPackage.REDEFINABLE_ELEMENT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.REDEFINABLE_ELEMENT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.REDEFINABLE_ELEMENT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.REDEFINABLE_ELEMENT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -456,142 +428,120 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_ELEMENT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_MODEL :
-				return getModel();
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REDEFINABLE_ELEMENT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REDEFINABLE_ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.REDEFINABLE_ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.REDEFINABLE_ELEMENT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_ELEMENT___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_LABEL :
-				return getLabel();
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.REDEFINABLE_ELEMENT___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.REDEFINABLE_ELEMENT___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.REDEFINABLE_ELEMENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.REDEFINABLE_ELEMENT___SEPARATOR :
-				return separator();
-			case UMLPackage.REDEFINABLE_ELEMENT___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_ELEMENT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.REDEFINABLE_ELEMENT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_ELEMENT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_MODEL:
+			return getModel();
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REDEFINABLE_ELEMENT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REDEFINABLE_ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.REDEFINABLE_ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.REDEFINABLE_ELEMENT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_ELEMENT___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_LABEL:
+			return getLabel();
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.REDEFINABLE_ELEMENT___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.REDEFINABLE_ELEMENT___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.REDEFINABLE_ELEMENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.REDEFINABLE_ELEMENT___SEPARATOR:
+			return separator();
+		case UMLPackage.REDEFINABLE_ELEMENT___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_ELEMENT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.REDEFINABLE_ELEMENT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -602,8 +552,7 @@
 	 * @generated
 	 */
 	public boolean isConsistentWith(RedefinableElement redefiningElement) {
-		return RedefinableElementOperations.isConsistentWith(this,
-			redefiningElement);
+		return RedefinableElementOperations.isConsistentWith(this, redefiningElement);
 	}
 
 	/**
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RedefinableTemplateSignatureImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RedefinableTemplateSignatureImpl.java
index 83230e8..468302a 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RedefinableTemplateSignatureImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RedefinableTemplateSignatureImpl.java
@@ -1,19 +1,21 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 386760, 212765, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Map;
 
@@ -21,7 +23,6 @@
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
-
 import org.eclipse.emf.common.util.EList;
 
 import org.eclipse.emf.ecore.EAnnotation;
@@ -31,8 +32,10 @@
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
@@ -103,17 +106,9 @@
 		return UMLPackage.Literals.REDEFINABLE_TEMPLATE_SIGNATURE;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.TEMPLATE_SIGNATURE__PARAMETER) {
 			return createParametersList();
 		}
@@ -136,21 +131,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -160,17 +147,14 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<TemplateParameter> getParameters() {
-		return (EList<TemplateParameter>) eDynamicGet(
-			UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_SIGNATURE__PARAMETER, true, true);
+		return (EList<TemplateParameter>) eDynamicGet(UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_SIGNATURE__PARAMETER, true, true);
 	}
 
 	private EList<TemplateParameter> createParametersList() {
 		return new SubsetSupersetEObjectResolvingEList<TemplateParameter>(
-			TemplateParameter.class, this,
-			UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER, null,
-			PARAMETER_ESUBSETS);
+				TemplateParameter.class, this,
+				UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER, null,
+				PARAMETER_ESUBSETS);
 	}
 
 	/**
@@ -201,7 +185,7 @@
 
 		if (newTemplate != null && !(newTemplate instanceof Classifier)) {
 			throw new IllegalArgumentException(
-				"newTemplate must be an instance of Classifier"); //$NON-NLS-1$
+					"newTemplate must be an instance of Classifier"); //$NON-NLS-1$
 		}
 
 		return basicSetClassifier((Classifier) newTemplate, msgs);
@@ -210,7 +194,7 @@
 	public NotificationChain basicSetClassifier(Classifier newClassifier,
 			NotificationChain msgs) {
 		msgs = eBasicSetContainer((InternalEObject) newClassifier,
-			UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER, msgs);
+				UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER, msgs);
 		return msgs;
 	}
 
@@ -223,29 +207,29 @@
 
 		if (newTemplate != null && !(newTemplate instanceof Classifier)) {
 			throw new IllegalArgumentException(
-				"newTemplate must be an instance of Classifier"); //$NON-NLS-1$
+					"newTemplate must be an instance of Classifier"); //$NON-NLS-1$
 		}
 
 		if (newTemplate != eInternalContainer()
-			|| (eContainerFeatureID() != UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE
-				&& newTemplate != null)) {
+				|| (eContainerFeatureID() != UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE
+						&& newTemplate != null)) {
 			if (EcoreUtil.isAncestor(this, newTemplate))
 				throw new IllegalArgumentException(
-					"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
+						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
 			NotificationChain msgs = null;
 			if (eInternalContainer() != null)
 				msgs = eBasicRemoveFromContainer(msgs);
 			if (newTemplate != null)
 				msgs = ((InternalEObject) newTemplate).eInverseAdd(this,
-					UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-					TemplateableElement.class, msgs);
+						UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
+						TemplateableElement.class, msgs);
 			msgs = basicSetTemplate(newTemplate, msgs);
 			if (msgs != null)
 				msgs.dispatch();
 		} else if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET,
-				UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE,
-				newTemplate, newTemplate));
+					UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE,
+					newTemplate, newTemplate));
 	}
 
 	/**
@@ -264,19 +248,15 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<TemplateParameter> getOwnedParameters() {
-		return (EList<TemplateParameter>) eDynamicGet(
-			UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_SIGNATURE__OWNED_PARAMETER, true,
-			true);
+		return (EList<TemplateParameter>) eDynamicGet(UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_SIGNATURE__OWNED_PARAMETER, true, true);
 	}
 
 	private EList<TemplateParameter> createOwnedParametersList() {
 		return new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<TemplateParameter>(
-			TemplateParameter.class, this,
-			UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER,
-			OWNED_PARAMETER_ESUPERSETS, null,
-			UMLPackage.TEMPLATE_PARAMETER__SIGNATURE);
+				TemplateParameter.class, this,
+				UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER,
+				OWNED_PARAMETER_ESUPERSETS, null,
+				UMLPackage.TEMPLATE_PARAMETER__SIGNATURE);
 	}
 
 	/**
@@ -285,8 +265,7 @@
 	 * @generated
 	 */
 	public TemplateParameter createOwnedParameter(EClass eClass) {
-		TemplateParameter newOwnedParameter = (TemplateParameter) create(
-			eClass);
+		TemplateParameter newOwnedParameter = (TemplateParameter) create(eClass);
 		getOwnedParameters().add(newOwnedParameter);
 		return newOwnedParameter;
 	}
@@ -311,23 +290,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			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>(
-						RedefinableElement.class, this,
-						UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINED_ELEMENT,
-						REDEFINED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT,
+						redefinedElements = new DerivedUnionEObjectEList<RedefinableElement>(RedefinableElement.class, this, UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS));
 			}
 			return redefinedElements;
 		}
-		return new DerivedUnionEObjectEList<RedefinableElement>(
-			RedefinableElement.class, this,
-			UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINED_ELEMENT,
-			REDEFINED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<RedefinableElement>(RedefinableElement.class, this, UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -341,22 +311,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Classifier> redefinitionContexts = (EList<Classifier>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+			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<Classifier>(
-						Classifier.class, this,
-						UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINITION_CONTEXT,
-						REDEFINITION_CONTEXT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
+						redefinitionContexts = new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINITION_CONTEXT, REDEFINITION_CONTEXT_ESUBSETS));
 			}
 			return redefinitionContexts;
 		}
-		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this,
-			UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINITION_CONTEXT,
-			REDEFINITION_CONTEXT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Classifier>(Classifier.class, this, UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINITION_CONTEXT, REDEFINITION_CONTEXT_ESUBSETS);
 	}
 
 	/**
@@ -366,11 +328,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<RedefinableTemplateSignature> getExtendedSignatures() {
-		return (EList<RedefinableTemplateSignature>) eDynamicGet(
-			UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE,
-			true, true);
+		return (EList<RedefinableTemplateSignature>) eDynamicGet(UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE, true, true);
 	}
 
 	/**
@@ -389,10 +347,8 @@
 	 */
 	public RedefinableTemplateSignature getExtendedSignature(String name,
 			boolean ignoreCase) {
-		extendedSignatureLoop : for (RedefinableTemplateSignature extendedSignature : getExtendedSignatures()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(extendedSignature.getName())
-				: name.equals(extendedSignature.getName())))
+		extendedSignatureLoop: for (RedefinableTemplateSignature extendedSignature : getExtendedSignatures()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(extendedSignature.getName()) : name.equals(extendedSignature.getName())))
 				continue extendedSignatureLoop;
 			return extendedSignature;
 		}
@@ -408,19 +364,13 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<TemplateParameter> result = (EList<TemplateParameter>) cache
-				.get(this,
-					UMLPackage.Literals.REDEFINABLE_TEMPLATE_SIGNATURE__INHERITED_PARAMETER);
+			EList<TemplateParameter> result = (EList<TemplateParameter>) cache.get(this, UMLPackage.Literals.REDEFINABLE_TEMPLATE_SIGNATURE__INHERITED_PARAMETER);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.REDEFINABLE_TEMPLATE_SIGNATURE__INHERITED_PARAMETER,
-					result = RedefinableTemplateSignatureOperations
-						.getInheritedParameters(this));
+				cache.put(this, UMLPackage.Literals.REDEFINABLE_TEMPLATE_SIGNATURE__INHERITED_PARAMETER, result = RedefinableTemplateSignatureOperations.getInheritedParameters(this));
 			}
 			return result;
 		}
-		return RedefinableTemplateSignatureOperations
-			.getInheritedParameters(this);
+		return RedefinableTemplateSignatureOperations.getInheritedParameters(this);
 	}
 
 	/**
@@ -430,9 +380,7 @@
 	 */
 	public Classifier getClassifier() {
 		Classifier classifier = basicGetClassifier();
-		return classifier != null && classifier.eIsProxy()
-			? (Classifier) eResolveProxy((InternalEObject) classifier)
-			: classifier;
+		return classifier != null && classifier.eIsProxy() ? (Classifier) eResolveProxy((InternalEObject) classifier) : classifier;
 	}
 
 	/**
@@ -462,8 +410,7 @@
 	 */
 	public boolean validateOwnElements(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TemplateSignatureOperations.validateOwnElements(this,
-			diagnostics, context);
+		return TemplateSignatureOperations.validateOwnElements(this, diagnostics, context);
 	}
 
 	/**
@@ -473,8 +420,7 @@
 	 */
 	public boolean validateUniqueParameters(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TemplateSignatureOperations.validateUniqueParameters(this,
-			diagnostics, context);
+		return TemplateSignatureOperations.validateUniqueParameters(this, diagnostics, context);
 	}
 
 	/**
@@ -484,8 +430,7 @@
 	 */
 	public boolean validateRedefinesParents(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableTemplateSignatureOperations
-			.validateRedefinesParents(this, diagnostics, context);
+		return RedefinableTemplateSignatureOperations.validateRedefinesParents(this, diagnostics, context);
 	}
 
 	/**
@@ -495,8 +440,7 @@
 	 */
 	@Override
 	public boolean isConsistentWith(RedefinableElement redefiningElement) {
-		return RedefinableTemplateSignatureOperations.isConsistentWith(this,
-			redefiningElement);
+		return RedefinableTemplateSignatureOperations.isConsistentWith(this, redefiningElement);
 	}
 
 	/**
@@ -509,16 +453,14 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetTemplate((TemplateableElement) otherEnd, msgs);
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedParameters())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetTemplate((TemplateableElement) otherEnd, msgs);
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedParameters()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -532,29 +474,25 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE :
-				return basicSetTemplate(null, msgs);
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				return ((InternalEList<?>) getOwnedParameters())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE:
+			return basicSetTemplate(null, msgs);
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER:
+			return ((InternalEList<?>) getOwnedParameters()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
 
-	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER :
-				return eInternalContainer().eInverseRemove(this,
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER:
+			return eInternalContainer().eInverseRemove(this,
 					UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
 					TemplateableElement.class, msgs);
 		}
@@ -569,54 +507,54 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME :
-				return getName();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER :
-				return getParameters();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE :
-				if (resolve)
-					return getTemplate();
-				return basicGetTemplate();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				return getOwnedParameters();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE :
-				return getExtendedSignatures();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__INHERITED_PARAMETER :
-				return getInheritedParameters();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER :
-				if (resolve)
-					return getClassifier();
-				return basicGetClassifier();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME:
+			return getName();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER:
+			return getParameters();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE:
+			if (resolve)
+				return getTemplate();
+			return basicGetTemplate();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER:
+			return getOwnedParameters();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE:
+			return getExtendedSignatures();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__INHERITED_PARAMETER:
+			return getInheritedParameters();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER:
+			if (resolve)
+				return getClassifier();
+			return basicGetClassifier();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -630,46 +568,41 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER :
-				getParameters().clear();
-				getParameters()
-					.addAll((Collection<? extends TemplateParameter>) newValue);
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE :
-				setTemplate((TemplateableElement) newValue);
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				getOwnedParameters()
-					.addAll((Collection<? extends TemplateParameter>) newValue);
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE :
-				getExtendedSignatures().clear();
-				getExtendedSignatures().addAll(
-					(Collection<? extends RedefinableTemplateSignature>) newValue);
-				return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER:
+			getParameters().clear();
+			getParameters().addAll((Collection<? extends TemplateParameter>) newValue);
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE:
+			setTemplate((TemplateableElement) newValue);
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			getOwnedParameters().addAll((Collection<? extends TemplateParameter>) newValue);
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE:
+			getExtendedSignatures().clear();
+			getExtendedSignatures().addAll((Collection<? extends RedefinableTemplateSignature>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -693,36 +626,36 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER :
-				getParameters().clear();
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE :
-				setTemplate((TemplateableElement) null);
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				return;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE :
-				getExtendedSignatures().clear();
-				return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER:
+			getParameters().clear();
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE:
+			setTemplate((TemplateableElement) null);
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			return;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE:
+			getExtendedSignatures().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -735,46 +668,44 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNER :
-				return isSetOwner();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME :
-				return isSetName();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER :
-				return !getParameters().isEmpty();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE :
-				return isSetTemplate();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				return !getOwnedParameters().isEmpty();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE :
-				return !getExtendedSignatures().isEmpty();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__INHERITED_PARAMETER :
-				return !getInheritedParameters().isEmpty();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER :
-				return isSetClassifier();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNER:
+			return isSetOwner();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME:
+			return isSetName();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER:
+			return !getParameters().isEmpty();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE:
+			return isSetTemplate();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER:
+			return !getOwnedParameters().isEmpty();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE:
+			return !getExtendedSignatures().isEmpty();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__INHERITED_PARAMETER:
+			return !getInheritedParameters().isEmpty();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER:
+			return isSetClassifier();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -789,14 +720,14 @@
 			Class<?> baseClass) {
 		if (baseClass == TemplateSignature.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER :
-					return UMLPackage.TEMPLATE_SIGNATURE__PARAMETER;
-				case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE :
-					return UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE;
-				case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-					return UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER:
+				return UMLPackage.TEMPLATE_SIGNATURE__PARAMETER;
+			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE:
+				return UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE;
+			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER:
+				return UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -812,14 +743,14 @@
 			Class<?> baseClass) {
 		if (baseClass == TemplateSignature.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.TEMPLATE_SIGNATURE__PARAMETER :
-					return UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER;
-				case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE :
-					return UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE;
-				case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-					return UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER;
-				default :
-					return -1;
+			case UMLPackage.TEMPLATE_SIGNATURE__PARAMETER:
+				return UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER;
+			case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE:
+				return UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__TEMPLATE;
+			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER:
+				return UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -834,12 +765,12 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == TemplateSignature.class) {
 			switch (baseOperationID) {
-				case UMLPackage.TEMPLATE_SIGNATURE___VALIDATE_OWN_ELEMENTS__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_OWN_ELEMENTS__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.TEMPLATE_SIGNATURE___VALIDATE_UNIQUE_PARAMETERS__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_UNIQUE_PARAMETERS__DIAGNOSTICCHAIN_MAP;
-				default :
-					return -1;
+			case UMLPackage.TEMPLATE_SIGNATURE___VALIDATE_OWN_ELEMENTS__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_OWN_ELEMENTS__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.TEMPLATE_SIGNATURE___VALIDATE_UNIQUE_PARAMETERS__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_UNIQUE_PARAMETERS__DIAGNOSTICCHAIN_MAP;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -855,155 +786,128 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_MODEL :
-				return getModel();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___SEPARATOR :
-				return separator();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_OWN_ELEMENTS__DIAGNOSTICCHAIN_MAP :
-				return validateOwnElements((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_UNIQUE_PARAMETERS__DIAGNOSTICCHAIN_MAP :
-				return validateUniqueParameters(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_REDEFINES_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinesParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_INHERITED_PARAMETERS :
-				return getInheritedParameters();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_MODEL:
+			return getModel();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___SEPARATOR:
+			return separator();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_OWN_ELEMENTS__DIAGNOSTICCHAIN_MAP:
+			return validateOwnElements((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_UNIQUE_PARAMETERS__DIAGNOSTICCHAIN_MAP:
+			return validateUniqueParameters((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___VALIDATE_REDEFINES_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinesParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE___GET_INHERITED_PARAMETERS:
+			return getInheritedParameters();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1016,10 +920,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_COMMENT,
-		UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME_EXPRESSION,
-		UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_COMMENT, UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__NAME_EXPRESSION, UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getParameters() <em>Parameter</em>}' reference list.
@@ -1029,8 +930,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] PARAMETER_ESUBSETS = new int[]{
-		UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER};
+	protected static final int[] PARAMETER_ESUBSETS = new int[] { UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER };
 
 	/**
 	 * The array of superset feature identifiers for the '{@link #getOwnedParameters() <em>Owned Parameter</em>}' containment reference list.
@@ -1040,8 +940,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_PARAMETER_ESUPERSETS = new int[]{
-		UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER};
+	protected static final int[] OWNED_PARAMETER_ESUPERSETS = new int[] { UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1051,9 +950,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -1076,7 +973,8 @@
 	 */
 	@Override
 	public boolean isSetOwner() {
-		return super.isSetOwner() || isSetTemplate();
+		return super.isSetOwner()
+				|| isSetTemplate();
 	}
 
 	/**
@@ -1087,8 +985,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE};
+	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[] { UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1097,8 +994,8 @@
 	 */
 	@Override
 	public boolean isSetOwnedElements() {
-		return super.isSetOwnedElements() || eIsSet(
-			UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER);
+		return super.isSetOwnedElements()
+				|| eIsSet(UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__OWNED_PARAMETER);
 	}
 
 	/**
@@ -1108,8 +1005,8 @@
 	 */
 	@Override
 	public boolean isSetRedefinedElements() {
-		return super.isSetRedefinedElements() || eIsSet(
-			UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE);
+		return super.isSetRedefinedElements()
+				|| eIsSet(UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__EXTENDED_SIGNATURE);
 	}
 
 	/**
@@ -1120,8 +1017,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[]{
-		UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER};
+	protected static final int[] REDEFINITION_CONTEXT_ESUBSETS = new int[] { UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER };
 
 	/**
 	 * The array of superset feature identifiers for the '{@link #getInheritedParameters() <em>Inherited Parameter</em>}' reference list.
@@ -1131,8 +1027,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INHERITED_PARAMETER_ESUPERSETS = new int[]{
-		UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER};
+	protected static final int[] INHERITED_PARAMETER_ESUPERSETS = new int[] { UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__PARAMETER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1141,21 +1036,22 @@
 	 */
 	@Override
 	public boolean isSetRedefinitionContexts() {
-		return super.isSetRedefinitionContexts() || isSetClassifier();
+		return super.isSetRedefinitionContexts()
+				|| isSetClassifier();
 	}
 
 	@Override
 	public EReference eContainmentFeature() {
 		return eContainerFeatureID() == UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER
-			? UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE
-			: super.eContainmentFeature();
+				? UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE
+				: super.eContainmentFeature();
 	}
 
 	@Override
 	public EStructuralFeature eContainingFeature() {
 		return eContainerFeatureID() == UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE__CLASSIFIER
-			? UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE
-			: super.eContainingFeature();
+				? UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE
+				: super.eContainingFeature();
 	}
 
 } //RedefinableTemplateSignatureImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReduceActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReduceActionImpl.java
index a05f513..7346f58 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReduceActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReduceActionImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -120,18 +123,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						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>(OutputPin.class, this,
-			UMLPackage.REDUCE_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.REDUCE_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -145,18 +143,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this, UMLPackage.REDUCE_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.REDUCE_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.REDUCE_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.REDUCE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -165,9 +158,7 @@
 	 * @generated
 	 */
 	public Behavior getReducer() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.REDUCE_ACTION__REDUCER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDUCE_ACTION__REDUCER, true, true);
+		return (Behavior) eDynamicGet(UMLPackage.REDUCE_ACTION__REDUCER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDUCE_ACTION__REDUCER, true, true);
 	}
 
 	/**
@@ -176,9 +167,7 @@
 	 * @generated
 	 */
 	public Behavior basicGetReducer() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.REDUCE_ACTION__REDUCER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDUCE_ACTION__REDUCER, false, true);
+		return (Behavior) eDynamicGet(UMLPackage.REDUCE_ACTION__REDUCER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDUCE_ACTION__REDUCER, false, true);
 	}
 
 	/**
@@ -187,8 +176,7 @@
 	 * @generated
 	 */
 	public void setReducer(Behavior newReducer) {
-		eDynamicSet(UMLPackage.REDUCE_ACTION__REDUCER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDUCE_ACTION__REDUCER, newReducer);
+		eDynamicSet(UMLPackage.REDUCE_ACTION__REDUCER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDUCE_ACTION__REDUCER, newReducer);
 	}
 
 	/**
@@ -197,9 +185,7 @@
 	 * @generated
 	 */
 	public OutputPin getResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.REDUCE_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDUCE_ACTION__RESULT, true, true);
+		return (OutputPin) eDynamicGet(UMLPackage.REDUCE_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDUCE_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -208,9 +194,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.REDUCE_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDUCE_ACTION__RESULT, false, true);
+		return (OutputPin) eDynamicGet(UMLPackage.REDUCE_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDUCE_ACTION__RESULT, false, true);
 	}
 
 	/**
@@ -220,8 +204,7 @@
 	 */
 	public NotificationChain basicSetResult(OutputPin newResult,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newResult,
-			UMLPackage.REDUCE_ACTION__RESULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newResult, UMLPackage.REDUCE_ACTION__RESULT, msgs);
 		return msgs;
 	}
 
@@ -231,8 +214,7 @@
 	 * @generated
 	 */
 	public void setResult(OutputPin newResult) {
-		eDynamicSet(UMLPackage.REDUCE_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDUCE_ACTION__RESULT, newResult);
+		eDynamicSet(UMLPackage.REDUCE_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDUCE_ACTION__RESULT, newResult);
 	}
 
 	/**
@@ -241,8 +223,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setResult(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -257,9 +238,7 @@
 	 * @generated
 	 */
 	public InputPin getCollection() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.REDUCE_ACTION__COLLECTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDUCE_ACTION__COLLECTION, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.REDUCE_ACTION__COLLECTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDUCE_ACTION__COLLECTION, true, true);
 	}
 
 	/**
@@ -268,9 +247,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetCollection() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.REDUCE_ACTION__COLLECTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDUCE_ACTION__COLLECTION, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.REDUCE_ACTION__COLLECTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDUCE_ACTION__COLLECTION, false, true);
 	}
 
 	/**
@@ -280,8 +257,7 @@
 	 */
 	public NotificationChain basicSetCollection(InputPin newCollection,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newCollection,
-			UMLPackage.REDUCE_ACTION__COLLECTION, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newCollection, UMLPackage.REDUCE_ACTION__COLLECTION, msgs);
 		return msgs;
 	}
 
@@ -291,9 +267,7 @@
 	 * @generated
 	 */
 	public void setCollection(InputPin newCollection) {
-		eDynamicSet(
-			UMLPackage.REDUCE_ACTION__COLLECTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDUCE_ACTION__COLLECTION, newCollection);
+		eDynamicSet(UMLPackage.REDUCE_ACTION__COLLECTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDUCE_ACTION__COLLECTION, newCollection);
 	}
 
 	/**
@@ -326,9 +300,7 @@
 	 * @generated
 	 */
 	public boolean isOrdered() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.REDUCE_ACTION__IS_ORDERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDUCE_ACTION__IS_ORDERED, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.REDUCE_ACTION__IS_ORDERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDUCE_ACTION__IS_ORDERED, true, true);
 	}
 
 	/**
@@ -337,9 +309,7 @@
 	 * @generated
 	 */
 	public void setIsOrdered(boolean newIsOrdered) {
-		eDynamicSet(
-			UMLPackage.REDUCE_ACTION__IS_ORDERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDUCE_ACTION__IS_ORDERED, newIsOrdered);
+		eDynamicSet(UMLPackage.REDUCE_ACTION__IS_ORDERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDUCE_ACTION__IS_ORDERED, newIsOrdered);
 	}
 
 	/**
@@ -349,8 +319,7 @@
 	 */
 	public boolean validateInputTypeIsCollection(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReduceActionOperations.validateInputTypeIsCollection(this,
-			diagnostics, context);
+		return ReduceActionOperations.validateInputTypeIsCollection(this, diagnostics, context);
 	}
 
 	/**
@@ -360,8 +329,7 @@
 	 */
 	public boolean validateOutputTypesAreCompatible(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReduceActionOperations.validateOutputTypesAreCompatible(this,
-			diagnostics, context);
+		return ReduceActionOperations.validateOutputTypesAreCompatible(this, diagnostics, context);
 	}
 
 	/**
@@ -371,8 +339,7 @@
 	 */
 	public boolean validateReducerInputsOutput(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReduceActionOperations.validateReducerInputsOutput(this,
-			diagnostics, context);
+		return ReduceActionOperations.validateReducerInputsOutput(this, diagnostics, context);
 	}
 
 	/**
@@ -384,41 +351,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.REDUCE_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REDUCE_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REDUCE_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.REDUCE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REDUCE_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.REDUCE_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.REDUCE_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.REDUCE_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REDUCE_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.REDUCE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REDUCE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REDUCE_ACTION__COLLECTION :
-				return basicSetCollection(null, msgs);
-			case UMLPackage.REDUCE_ACTION__RESULT :
-				return basicSetResult(null, msgs);
+		case UMLPackage.REDUCE_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REDUCE_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REDUCE_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.REDUCE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REDUCE_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.REDUCE_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REDUCE_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REDUCE_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REDUCE_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REDUCE_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REDUCE_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REDUCE_ACTION__COLLECTION:
+			return basicSetCollection(null, msgs);
+		case UMLPackage.REDUCE_ACTION__RESULT:
+			return basicSetResult(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -431,88 +389,88 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.REDUCE_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.REDUCE_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.REDUCE_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.REDUCE_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.REDUCE_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.REDUCE_ACTION__NAME :
-				return getName();
-			case UMLPackage.REDUCE_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.REDUCE_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.REDUCE_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.REDUCE_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.REDUCE_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.REDUCE_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.REDUCE_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.REDUCE_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.REDUCE_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.REDUCE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.REDUCE_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.REDUCE_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.REDUCE_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.REDUCE_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.REDUCE_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.REDUCE_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.REDUCE_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.REDUCE_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.REDUCE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.REDUCE_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.REDUCE_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.REDUCE_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.REDUCE_ACTION__COLLECTION :
-				if (resolve)
-					return getCollection();
-				return basicGetCollection();
-			case UMLPackage.REDUCE_ACTION__IS_ORDERED :
-				return isOrdered();
-			case UMLPackage.REDUCE_ACTION__REDUCER :
-				if (resolve)
-					return getReducer();
-				return basicGetReducer();
-			case UMLPackage.REDUCE_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
+		case UMLPackage.REDUCE_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.REDUCE_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.REDUCE_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.REDUCE_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.REDUCE_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.REDUCE_ACTION__NAME:
+			return getName();
+		case UMLPackage.REDUCE_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.REDUCE_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.REDUCE_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.REDUCE_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.REDUCE_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.REDUCE_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.REDUCE_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.REDUCE_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.REDUCE_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.REDUCE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.REDUCE_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.REDUCE_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.REDUCE_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.REDUCE_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.REDUCE_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.REDUCE_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.REDUCE_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.REDUCE_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.REDUCE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.REDUCE_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.REDUCE_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.REDUCE_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.REDUCE_ACTION__COLLECTION:
+			if (resolve)
+				return getCollection();
+			return basicGetCollection();
+		case UMLPackage.REDUCE_ACTION__IS_ORDERED:
+			return isOrdered();
+		case UMLPackage.REDUCE_ACTION__REDUCER:
+			if (resolve)
+				return getReducer();
+			return basicGetReducer();
+		case UMLPackage.REDUCE_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -526,89 +484,79 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.REDUCE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__COLLECTION :
-				setCollection((InputPin) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__IS_ORDERED :
-				setIsOrdered((Boolean) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__REDUCER :
-				setReducer((Behavior) newValue);
-				return;
-			case UMLPackage.REDUCE_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
+		case UMLPackage.REDUCE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__COLLECTION:
+			setCollection((InputPin) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__IS_ORDERED:
+			setIsOrdered((Boolean) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__REDUCER:
+			setReducer((Behavior) newValue);
+			return;
+		case UMLPackage.REDUCE_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -621,69 +569,69 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.REDUCE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.REDUCE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.REDUCE_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.REDUCE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.REDUCE_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.REDUCE_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.REDUCE_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.REDUCE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.REDUCE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.REDUCE_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.REDUCE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.REDUCE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.REDUCE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.REDUCE_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.REDUCE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.REDUCE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.REDUCE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.REDUCE_ACTION__COLLECTION :
-				setCollection((InputPin) null);
-				return;
-			case UMLPackage.REDUCE_ACTION__IS_ORDERED :
-				setIsOrdered(IS_ORDERED_EDEFAULT);
-				return;
-			case UMLPackage.REDUCE_ACTION__REDUCER :
-				setReducer((Behavior) null);
-				return;
-			case UMLPackage.REDUCE_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
+		case UMLPackage.REDUCE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.REDUCE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.REDUCE_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.REDUCE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.REDUCE_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.REDUCE_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.REDUCE_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.REDUCE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.REDUCE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.REDUCE_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.REDUCE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.REDUCE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.REDUCE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.REDUCE_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.REDUCE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.REDUCE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.REDUCE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.REDUCE_ACTION__COLLECTION:
+			setCollection((InputPin) null);
+			return;
+		case UMLPackage.REDUCE_ACTION__IS_ORDERED:
+			setIsOrdered(IS_ORDERED_EDEFAULT);
+			return;
+		case UMLPackage.REDUCE_ACTION__REDUCER:
+			setReducer((Behavior) null);
+			return;
+		case UMLPackage.REDUCE_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -696,72 +644,70 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.REDUCE_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.REDUCE_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.REDUCE_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.REDUCE_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.REDUCE_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.REDUCE_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.REDUCE_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.REDUCE_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.REDUCE_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.REDUCE_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.REDUCE_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.REDUCE_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.REDUCE_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.REDUCE_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.REDUCE_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.REDUCE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.REDUCE_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.REDUCE_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.REDUCE_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.REDUCE_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.REDUCE_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.REDUCE_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.REDUCE_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.REDUCE_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.REDUCE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.REDUCE_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.REDUCE_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.REDUCE_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.REDUCE_ACTION__COLLECTION :
-				return basicGetCollection() != null;
-			case UMLPackage.REDUCE_ACTION__IS_ORDERED :
-				return isOrdered() != IS_ORDERED_EDEFAULT;
-			case UMLPackage.REDUCE_ACTION__REDUCER :
-				return basicGetReducer() != null;
-			case UMLPackage.REDUCE_ACTION__RESULT :
-				return basicGetResult() != null;
+		case UMLPackage.REDUCE_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.REDUCE_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.REDUCE_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.REDUCE_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.REDUCE_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.REDUCE_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.REDUCE_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.REDUCE_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.REDUCE_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.REDUCE_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.REDUCE_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.REDUCE_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.REDUCE_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.REDUCE_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.REDUCE_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.REDUCE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.REDUCE_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.REDUCE_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.REDUCE_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.REDUCE_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.REDUCE_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.REDUCE_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.REDUCE_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.REDUCE_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.REDUCE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.REDUCE_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.REDUCE_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.REDUCE_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.REDUCE_ACTION__COLLECTION:
+			return basicGetCollection() != null;
+		case UMLPackage.REDUCE_ACTION__IS_ORDERED:
+			return isOrdered() != IS_ORDERED_EDEFAULT;
+		case UMLPackage.REDUCE_ACTION__REDUCER:
+			return basicGetReducer() != null;
+		case UMLPackage.REDUCE_ACTION__RESULT:
+			return basicGetResult() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -776,164 +722,136 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.REDUCE_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDUCE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDUCE_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.REDUCE_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.REDUCE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.REDUCE_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.REDUCE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REDUCE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.REDUCE_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.REDUCE_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.REDUCE_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.REDUCE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.REDUCE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.REDUCE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.REDUCE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REDUCE_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REDUCE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.REDUCE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.REDUCE_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.REDUCE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDUCE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDUCE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDUCE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.REDUCE_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.REDUCE_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.REDUCE_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.REDUCE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.REDUCE_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.REDUCE_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.REDUCE_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.REDUCE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDUCE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDUCE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDUCE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.REDUCE_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.REDUCE_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.REDUCE_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.REDUCE_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.REDUCE_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.REDUCE_ACTION___VALIDATE_REDUCER_INPUTS_OUTPUT__DIAGNOSTICCHAIN_MAP :
-				return validateReducerInputsOutput(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDUCE_ACTION___VALIDATE_INPUT_TYPE_IS_COLLECTION__DIAGNOSTICCHAIN_MAP :
-				return validateInputTypeIsCollection(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REDUCE_ACTION___VALIDATE_OUTPUT_TYPES_ARE_COMPATIBLE__DIAGNOSTICCHAIN_MAP :
-				return validateOutputTypesAreCompatible(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDUCE_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDUCE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDUCE_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.REDUCE_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.REDUCE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.REDUCE_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.REDUCE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REDUCE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.REDUCE_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.REDUCE_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.REDUCE_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.REDUCE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.REDUCE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.REDUCE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.REDUCE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REDUCE_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REDUCE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.REDUCE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.REDUCE_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.REDUCE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDUCE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDUCE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDUCE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.REDUCE_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.REDUCE_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.REDUCE_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.REDUCE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.REDUCE_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.REDUCE_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.REDUCE_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.REDUCE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDUCE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDUCE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDUCE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.REDUCE_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.REDUCE_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.REDUCE_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.REDUCE_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.REDUCE_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.REDUCE_ACTION___VALIDATE_REDUCER_INPUTS_OUTPUT__DIAGNOSTICCHAIN_MAP:
+			return validateReducerInputsOutput((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDUCE_ACTION___VALIDATE_INPUT_TYPE_IS_COLLECTION__DIAGNOSTICCHAIN_MAP:
+			return validateInputTypeIsCollection((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REDUCE_ACTION___VALIDATE_OUTPUT_TYPES_ARE_COMPATIBLE__DIAGNOSTICCHAIN_MAP:
+			return validateOutputTypesAreCompatible((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -945,7 +863,8 @@
 	 */
 	@Override
 	public boolean isSetOutputs() {
-		return super.isSetOutputs() || eIsSet(UMLPackage.REDUCE_ACTION__RESULT);
+		return super.isSetOutputs()
+				|| eIsSet(UMLPackage.REDUCE_ACTION__RESULT);
 	}
 
 	/**
@@ -956,8 +875,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.REDUCE_ACTION__COLLECTION};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.REDUCE_ACTION__COLLECTION };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOutputs() <em>Output</em>}' reference list.
@@ -967,8 +885,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.REDUCE_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.REDUCE_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -978,7 +895,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.REDUCE_ACTION__COLLECTION);
+				|| eIsSet(UMLPackage.REDUCE_ACTION__COLLECTION);
 	}
 
 } //ReduceActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RegionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RegionImpl.java
index 9e04ad2..2b671d7 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RegionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RegionImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -20,6 +20,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -29,9 +30,13 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.EcoreEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -124,22 +129,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			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>(
-						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>(
-			RedefinableElement.class, this,
-			UMLPackage.REGION__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<RedefinableElement>(RedefinableElement.class, this, UMLPackage.REGION__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -153,19 +150,19 @@
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
 			EList<Classifier> result = (EList<Classifier>) cache.get(this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
 
 			if (result == null) {
 				Classifier redefinitionContext = redefinitionContext();
 				List<Classifier> redefinitionContexts = redefinitionContext == null
-					? Collections.<Classifier> emptyList()
-					: Collections.singletonList(redefinitionContext);
+						? Collections.<Classifier> emptyList()
+						: Collections.singletonList(redefinitionContext);
 				cache.put(this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-					result = new EcoreEList.UnmodifiableEList<Classifier>(this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						redefinitionContexts.size(),
-						redefinitionContexts.toArray()));
+						result = new EcoreEList.UnmodifiableEList<Classifier>(this,
+								UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
+								redefinitionContexts.size(),
+								redefinitionContexts.toArray()));
 			}
 
 			return result;
@@ -173,11 +170,11 @@
 
 		Classifier redefinitionContext = redefinitionContext();
 		List<Classifier> redefinitionContexts = redefinitionContext == null
-			? Collections.<Classifier> emptyList()
-			: Collections.singletonList(redefinitionContext);
+				? Collections.<Classifier> emptyList()
+				: Collections.singletonList(redefinitionContext);
 		return new EcoreEList.UnmodifiableEList<Classifier>(this,
-			UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-			redefinitionContexts.size(), redefinitionContexts.toArray());
+				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
+				redefinitionContexts.size(), redefinitionContexts.toArray());
 	}
 
 	/**
@@ -196,12 +193,10 @@
 	 */
 	public Classifier getRedefinitionContext(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinitionContextLoop : for (Classifier redefinitionContext : getRedefinitionContexts()) {
+		redefinitionContextLoop: for (Classifier redefinitionContext : getRedefinitionContexts()) {
 			if (eClass != null && !eClass.isInstance(redefinitionContext))
 				continue redefinitionContextLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinitionContext.getName())
-				: name.equals(redefinitionContext.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinitionContext.getName()) : name.equals(redefinitionContext.getName())))
 				continue redefinitionContextLoop;
 			return redefinitionContext;
 		}
@@ -223,9 +218,7 @@
 	 * @generated
 	 */
 	public boolean isLeaf() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.REGION__IS_LEAF - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.REGION__IS_LEAF - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, true, true);
 	}
 
 	/**
@@ -234,8 +227,7 @@
 	 * @generated
 	 */
 	public void setIsLeaf(boolean newIsLeaf) {
-		eDynamicSet(UMLPackage.REGION__IS_LEAF - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, newIsLeaf);
+		eDynamicSet(UMLPackage.REGION__IS_LEAF - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, newIsLeaf);
 	}
 
 	/**
@@ -249,20 +241,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.REGION__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.REGION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.REGION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.REGION__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -272,9 +257,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Vertex> getSubvertices() {
-		return (EList<Vertex>) eDynamicGet(
-			UMLPackage.REGION__SUBVERTEX - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REGION__SUBVERTEX, true, true);
+		return (EList<Vertex>) eDynamicGet(UMLPackage.REGION__SUBVERTEX - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REGION__SUBVERTEX, true, true);
 	}
 
 	/**
@@ -306,18 +289,14 @@
 	 */
 	public Vertex getSubvertex(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		subvertexLoop : for (Vertex subvertex : getSubvertices()) {
+		subvertexLoop: for (Vertex subvertex : getSubvertices()) {
 			if (eClass != null && !eClass.isInstance(subvertex))
 				continue subvertexLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(subvertex.getName())
-				: name.equals(subvertex.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(subvertex.getName()) : name.equals(subvertex.getName())))
 				continue subvertexLoop;
 			return subvertex;
 		}
-		return createOnDemand && eClass != null
-			? createSubvertex(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createSubvertex(name, eClass) : null;
 	}
 
 	/**
@@ -327,9 +306,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Transition> getTransitions() {
-		return (EList<Transition>) eDynamicGet(
-			UMLPackage.REGION__TRANSITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REGION__TRANSITION, true, true);
+		return (EList<Transition>) eDynamicGet(UMLPackage.REGION__TRANSITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REGION__TRANSITION, true, true);
 	}
 
 	/**
@@ -370,18 +347,14 @@
 	 */
 	public Transition getTransition(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		transitionLoop : for (Transition transition : getTransitions()) {
+		transitionLoop: for (Transition transition : getTransitions()) {
 			if (eClass != null && !eClass.isInstance(transition))
 				continue transitionLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(transition.getName())
-				: name.equals(transition.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(transition.getName()) : name.equals(transition.getName())))
 				continue transitionLoop;
 			return transition;
 		}
-		return createOnDemand && eClass != null
-			? createTransition(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createTransition(name, eClass) : null;
 	}
 
 	/**
@@ -390,9 +363,7 @@
 	 * @generated
 	 */
 	public State getState() {
-		return (State) eDynamicGet(
-			UMLPackage.REGION__STATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REGION__STATE, true, true);
+		return (State) eDynamicGet(UMLPackage.REGION__STATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REGION__STATE, true, true);
 	}
 
 	/**
@@ -401,9 +372,7 @@
 	 * @generated
 	 */
 	public State basicGetState() {
-		return (State) eDynamicGet(
-			UMLPackage.REGION__STATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REGION__STATE, false, true);
+		return (State) eDynamicGet(UMLPackage.REGION__STATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REGION__STATE, false, true);
 	}
 
 	/**
@@ -413,8 +382,7 @@
 	 */
 	public NotificationChain basicSetState(State newState,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newState,
-			UMLPackage.REGION__STATE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newState, UMLPackage.REGION__STATE, msgs);
 		return msgs;
 	}
 
@@ -424,8 +392,7 @@
 	 * @generated
 	 */
 	public void setState(State newState) {
-		eDynamicSet(UMLPackage.REGION__STATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REGION__STATE, newState);
+		eDynamicSet(UMLPackage.REGION__STATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REGION__STATE, newState);
 	}
 
 	/**
@@ -434,9 +401,7 @@
 	 * @generated
 	 */
 	public Region getExtendedRegion() {
-		return (Region) eDynamicGet(
-			UMLPackage.REGION__EXTENDED_REGION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REGION__EXTENDED_REGION, true, true);
+		return (Region) eDynamicGet(UMLPackage.REGION__EXTENDED_REGION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REGION__EXTENDED_REGION, true, true);
 	}
 
 	/**
@@ -445,9 +410,7 @@
 	 * @generated
 	 */
 	public Region basicGetExtendedRegion() {
-		return (Region) eDynamicGet(
-			UMLPackage.REGION__EXTENDED_REGION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REGION__EXTENDED_REGION, false, true);
+		return (Region) eDynamicGet(UMLPackage.REGION__EXTENDED_REGION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REGION__EXTENDED_REGION, false, true);
 	}
 
 	/**
@@ -456,8 +419,7 @@
 	 * @generated
 	 */
 	public void setExtendedRegion(Region newExtendedRegion) {
-		eDynamicSet(UMLPackage.REGION__EXTENDED_REGION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REGION__EXTENDED_REGION, newExtendedRegion);
+		eDynamicSet(UMLPackage.REGION__EXTENDED_REGION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REGION__EXTENDED_REGION, newExtendedRegion);
 	}
 
 	/**
@@ -466,9 +428,7 @@
 	 * @generated
 	 */
 	public StateMachine getStateMachine() {
-		return (StateMachine) eDynamicGet(
-			UMLPackage.REGION__STATE_MACHINE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REGION__STATE_MACHINE, true, true);
+		return (StateMachine) eDynamicGet(UMLPackage.REGION__STATE_MACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REGION__STATE_MACHINE, true, true);
 	}
 
 	/**
@@ -477,9 +437,7 @@
 	 * @generated
 	 */
 	public StateMachine basicGetStateMachine() {
-		return (StateMachine) eDynamicGet(
-			UMLPackage.REGION__STATE_MACHINE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REGION__STATE_MACHINE, false, true);
+		return (StateMachine) eDynamicGet(UMLPackage.REGION__STATE_MACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REGION__STATE_MACHINE, false, true);
 	}
 
 	/**
@@ -489,8 +447,7 @@
 	 */
 	public NotificationChain basicSetStateMachine(StateMachine newStateMachine,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newStateMachine,
-			UMLPackage.REGION__STATE_MACHINE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newStateMachine, UMLPackage.REGION__STATE_MACHINE, msgs);
 		return msgs;
 	}
 
@@ -500,8 +457,7 @@
 	 * @generated
 	 */
 	public void setStateMachine(StateMachine newStateMachine) {
-		eDynamicSet(UMLPackage.REGION__STATE_MACHINE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REGION__STATE_MACHINE, newStateMachine);
+		eDynamicSet(UMLPackage.REGION__STATE_MACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REGION__STATE_MACHINE, newStateMachine);
 	}
 
 	/**
@@ -511,8 +467,7 @@
 	 */
 	public boolean validateRedefinitionContextValid(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations
-			.validateRedefinitionContextValid(this, diagnostics, context);
+		return RedefinableElementOperations.validateRedefinitionContextValid(this, diagnostics, context);
 	}
 
 	/**
@@ -522,8 +477,7 @@
 	 */
 	public boolean validateRedefinitionConsistent(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations.validateRedefinitionConsistent(this,
-			diagnostics, context);
+		return RedefinableElementOperations.validateRedefinitionConsistent(this, diagnostics, context);
 	}
 
 	/**
@@ -533,8 +487,7 @@
 	 */
 	public boolean validateNonLeafRedefinition(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations.validateNonLeafRedefinition(this,
-			diagnostics, context);
+		return RedefinableElementOperations.validateNonLeafRedefinition(this, diagnostics, context);
 	}
 
 	/**
@@ -544,8 +497,7 @@
 	 */
 	public boolean isRedefinitionContextValid(
 			RedefinableElement redefinedElement) {
-		return RegionOperations.isRedefinitionContextValid(this,
-			redefinedElement);
+		return RegionOperations.isRedefinitionContextValid(this, redefinedElement);
 	}
 
 	/**
@@ -564,8 +516,7 @@
 	 */
 	public boolean validateInitialVertex(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RegionOperations.validateInitialVertex(this, diagnostics,
-			context);
+		return RegionOperations.validateInitialVertex(this, diagnostics, context);
 	}
 
 	/**
@@ -575,8 +526,7 @@
 	 */
 	public boolean validateDeepHistoryVertex(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RegionOperations.validateDeepHistoryVertex(this, diagnostics,
-			context);
+		return RegionOperations.validateDeepHistoryVertex(this, diagnostics, context);
 	}
 
 	/**
@@ -586,8 +536,7 @@
 	 */
 	public boolean validateShallowHistoryVertex(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RegionOperations.validateShallowHistoryVertex(this, diagnostics,
-			context);
+		return RegionOperations.validateShallowHistoryVertex(this, diagnostics, context);
 	}
 
 	/**
@@ -637,32 +586,26 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.REGION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.REGION__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.REGION__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.REGION__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.REGION__STATE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetState((State) otherEnd, msgs);
-			case UMLPackage.REGION__STATE_MACHINE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetStateMachine((StateMachine) otherEnd, msgs);
-			case UMLPackage.REGION__TRANSITION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTransitions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.REGION__SUBVERTEX :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubvertices())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.REGION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.REGION__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.REGION__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.REGION__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.REGION__STATE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetState((State) otherEnd, msgs);
+		case UMLPackage.REGION__STATE_MACHINE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetStateMachine((StateMachine) otherEnd, msgs);
+		case UMLPackage.REGION__TRANSITION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTransitions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.REGION__SUBVERTEX:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubvertices()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -676,33 +619,26 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.REGION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REGION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REGION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.REGION__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REGION__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REGION__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REGION__STATE :
-				return basicSetState(null, msgs);
-			case UMLPackage.REGION__STATE_MACHINE :
-				return basicSetStateMachine(null, msgs);
-			case UMLPackage.REGION__TRANSITION :
-				return ((InternalEList<?>) getTransitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REGION__SUBVERTEX :
-				return ((InternalEList<?>) getSubvertices())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.REGION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REGION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REGION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.REGION__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REGION__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REGION__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REGION__STATE:
+			return basicSetState(null, msgs);
+		case UMLPackage.REGION__STATE_MACHINE:
+			return basicSetStateMachine(null, msgs);
+		case UMLPackage.REGION__TRANSITION:
+			return ((InternalEList<?>) getTransitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REGION__SUBVERTEX:
+			return ((InternalEList<?>) getSubvertices()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -716,12 +652,10 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.REGION__STATE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.STATE__REGION, State.class, msgs);
-			case UMLPackage.REGION__STATE_MACHINE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.STATE_MACHINE__REGION, StateMachine.class, msgs);
+		case UMLPackage.REGION__STATE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.STATE__REGION, State.class, msgs);
+		case UMLPackage.REGION__STATE_MACHINE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.STATE_MACHINE__REGION, StateMachine.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -734,66 +668,66 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.REGION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.REGION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.REGION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.REGION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.REGION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.REGION__NAME :
-				return getName();
-			case UMLPackage.REGION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.REGION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.REGION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.REGION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.REGION__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.REGION__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.REGION__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.REGION__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.REGION__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.REGION__MEMBER :
-				return getMembers();
-			case UMLPackage.REGION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.REGION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.REGION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.REGION__EXTENDED_REGION :
-				if (resolve)
-					return getExtendedRegion();
-				return basicGetExtendedRegion();
-			case UMLPackage.REGION__STATE :
-				if (resolve)
-					return getState();
-				return basicGetState();
-			case UMLPackage.REGION__STATE_MACHINE :
-				if (resolve)
-					return getStateMachine();
-				return basicGetStateMachine();
-			case UMLPackage.REGION__TRANSITION :
-				return getTransitions();
-			case UMLPackage.REGION__SUBVERTEX :
-				return getSubvertices();
+		case UMLPackage.REGION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.REGION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.REGION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.REGION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.REGION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.REGION__NAME:
+			return getName();
+		case UMLPackage.REGION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.REGION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.REGION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.REGION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.REGION__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.REGION__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.REGION__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.REGION__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.REGION__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.REGION__MEMBER:
+			return getMembers();
+		case UMLPackage.REGION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.REGION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.REGION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.REGION__EXTENDED_REGION:
+			if (resolve)
+				return getExtendedRegion();
+			return basicGetExtendedRegion();
+		case UMLPackage.REGION__STATE:
+			if (resolve)
+				return getState();
+			return basicGetState();
+		case UMLPackage.REGION__STATE_MACHINE:
+			if (resolve)
+				return getStateMachine();
+			return basicGetStateMachine();
+		case UMLPackage.REGION__TRANSITION:
+			return getTransitions();
+		case UMLPackage.REGION__SUBVERTEX:
+			return getSubvertices();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -807,62 +741,55 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.REGION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.REGION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.REGION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.REGION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.REGION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.REGION__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.REGION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.REGION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.REGION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.REGION__EXTENDED_REGION :
-				setExtendedRegion((Region) newValue);
-				return;
-			case UMLPackage.REGION__STATE :
-				setState((State) newValue);
-				return;
-			case UMLPackage.REGION__STATE_MACHINE :
-				setStateMachine((StateMachine) newValue);
-				return;
-			case UMLPackage.REGION__TRANSITION :
-				getTransitions().clear();
-				getTransitions()
-					.addAll((Collection<? extends Transition>) newValue);
-				return;
-			case UMLPackage.REGION__SUBVERTEX :
-				getSubvertices().clear();
-				getSubvertices()
-					.addAll((Collection<? extends Vertex>) newValue);
-				return;
+		case UMLPackage.REGION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.REGION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.REGION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.REGION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.REGION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.REGION__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.REGION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.REGION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.REGION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.REGION__EXTENDED_REGION:
+			setExtendedRegion((Region) newValue);
+			return;
+		case UMLPackage.REGION__STATE:
+			setState((State) newValue);
+			return;
+		case UMLPackage.REGION__STATE_MACHINE:
+			setStateMachine((StateMachine) newValue);
+			return;
+		case UMLPackage.REGION__TRANSITION:
+			getTransitions().clear();
+			getTransitions().addAll((Collection<? extends Transition>) newValue);
+			return;
+		case UMLPackage.REGION__SUBVERTEX:
+			getSubvertices().clear();
+			getSubvertices().addAll((Collection<? extends Vertex>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -875,48 +802,48 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.REGION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.REGION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.REGION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.REGION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.REGION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.REGION__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.REGION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.REGION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.REGION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.REGION__EXTENDED_REGION :
-				setExtendedRegion((Region) null);
-				return;
-			case UMLPackage.REGION__STATE :
-				setState((State) null);
-				return;
-			case UMLPackage.REGION__STATE_MACHINE :
-				setStateMachine((StateMachine) null);
-				return;
-			case UMLPackage.REGION__TRANSITION :
-				getTransitions().clear();
-				return;
-			case UMLPackage.REGION__SUBVERTEX :
-				getSubvertices().clear();
-				return;
+		case UMLPackage.REGION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.REGION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.REGION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.REGION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.REGION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.REGION__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.REGION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.REGION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.REGION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.REGION__EXTENDED_REGION:
+			setExtendedRegion((Region) null);
+			return;
+		case UMLPackage.REGION__STATE:
+			setState((State) null);
+			return;
+		case UMLPackage.REGION__STATE_MACHINE:
+			setStateMachine((StateMachine) null);
+			return;
+		case UMLPackage.REGION__TRANSITION:
+			getTransitions().clear();
+			return;
+		case UMLPackage.REGION__SUBVERTEX:
+			getSubvertices().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -929,56 +856,54 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.REGION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.REGION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.REGION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.REGION__OWNER :
-				return isSetOwner();
-			case UMLPackage.REGION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.REGION__NAME :
-				return isSetName();
-			case UMLPackage.REGION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.REGION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.REGION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.REGION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.REGION__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.REGION__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.REGION__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.REGION__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.REGION__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.REGION__MEMBER :
-				return isSetMembers();
-			case UMLPackage.REGION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.REGION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.REGION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.REGION__EXTENDED_REGION :
-				return basicGetExtendedRegion() != null;
-			case UMLPackage.REGION__STATE :
-				return basicGetState() != null;
-			case UMLPackage.REGION__STATE_MACHINE :
-				return basicGetStateMachine() != null;
-			case UMLPackage.REGION__TRANSITION :
-				return !getTransitions().isEmpty();
-			case UMLPackage.REGION__SUBVERTEX :
-				return !getSubvertices().isEmpty();
+		case UMLPackage.REGION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.REGION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.REGION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.REGION__OWNER:
+			return isSetOwner();
+		case UMLPackage.REGION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.REGION__NAME:
+			return isSetName();
+		case UMLPackage.REGION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.REGION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.REGION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.REGION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.REGION__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.REGION__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.REGION__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.REGION__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.REGION__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.REGION__MEMBER:
+			return isSetMembers();
+		case UMLPackage.REGION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.REGION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.REGION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.REGION__EXTENDED_REGION:
+			return basicGetExtendedRegion() != null;
+		case UMLPackage.REGION__STATE:
+			return basicGetState() != null;
+		case UMLPackage.REGION__STATE_MACHINE:
+			return basicGetStateMachine() != null;
+		case UMLPackage.REGION__TRANSITION:
+			return !getTransitions().isEmpty();
+		case UMLPackage.REGION__SUBVERTEX:
+			return !getSubvertices().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -993,14 +918,14 @@
 			Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.REGION__IS_LEAF :
-					return UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF;
-				case UMLPackage.REGION__REDEFINED_ELEMENT :
-					return UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT;
-				case UMLPackage.REGION__REDEFINITION_CONTEXT :
-					return UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT;
-				default :
-					return -1;
+			case UMLPackage.REGION__IS_LEAF:
+				return UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF;
+			case UMLPackage.REGION__REDEFINED_ELEMENT:
+				return UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT;
+			case UMLPackage.REGION__REDEFINITION_CONTEXT:
+				return UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -1016,14 +941,14 @@
 			Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF :
-					return UMLPackage.REGION__IS_LEAF;
-				case UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT :
-					return UMLPackage.REGION__REDEFINED_ELEMENT;
-				case UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT :
-					return UMLPackage.REGION__REDEFINITION_CONTEXT;
-				default :
-					return -1;
+			case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF:
+				return UMLPackage.REGION__IS_LEAF;
+			case UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT:
+				return UMLPackage.REGION__REDEFINED_ELEMENT;
+			case UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT:
+				return UMLPackage.REGION__REDEFINITION_CONTEXT;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1038,18 +963,18 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.REGION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.REGION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.REGION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.REDEFINABLE_ELEMENT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-					return UMLPackage.REGION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT;
-				case UMLPackage.REDEFINABLE_ELEMENT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-					return UMLPackage.REGION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT;
-				default :
-					return -1;
+			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.REGION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.REGION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.REGION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.REDEFINABLE_ELEMENT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+				return UMLPackage.REGION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT;
+			case UMLPackage.REDEFINABLE_ELEMENT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+				return UMLPackage.REGION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -1065,200 +990,160 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.REGION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.REGION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REGION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REGION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.REGION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.REGION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.REGION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.REGION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.REGION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.REGION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.REGION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.REGION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.REGION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REGION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.REGION___GET_MODEL :
-				return getModel();
-			case UMLPackage.REGION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.REGION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.REGION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.REGION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.REGION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.REGION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.REGION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.REGION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.REGION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.REGION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.REGION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.REGION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REGION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.REGION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REGION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.REGION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.REGION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.REGION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.REGION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.REGION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.REGION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.REGION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.REGION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REGION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REGION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REGION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.REGION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.REGION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.REGION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.REGION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.REGION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.REGION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.REGION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.REGION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.REGION___SEPARATOR :
-				return separator();
-			case UMLPackage.REGION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.REGION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REGION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REGION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REGION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.REGION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.REGION___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.REGION___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.REGION___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.REGION___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.REGION___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.REGION___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.REGION___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.REGION___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.REGION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REGION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REGION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REGION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.REGION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.REGION___VALIDATE_DEEP_HISTORY_VERTEX__DIAGNOSTICCHAIN_MAP :
-				return validateDeepHistoryVertex(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REGION___VALIDATE_SHALLOW_HISTORY_VERTEX__DIAGNOSTICCHAIN_MAP :
-				return validateShallowHistoryVertex(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REGION___VALIDATE_OWNED__DIAGNOSTICCHAIN_MAP :
-				return validateOwned((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REGION___VALIDATE_INITIAL_VERTEX__DIAGNOSTICCHAIN_MAP :
-				return validateInitialVertex((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REGION___BELONGS_TO_PSM :
-				return belongsToPSM();
-			case UMLPackage.REGION___CONTAINING_STATE_MACHINE :
-				return containingStateMachine();
-			case UMLPackage.REGION___REDEFINITION_CONTEXT :
-				return redefinitionContext();
+		case UMLPackage.REGION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.REGION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REGION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REGION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.REGION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.REGION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.REGION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.REGION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.REGION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.REGION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.REGION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.REGION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.REGION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REGION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.REGION___GET_MODEL:
+			return getModel();
+		case UMLPackage.REGION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.REGION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.REGION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.REGION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.REGION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.REGION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.REGION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.REGION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.REGION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.REGION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.REGION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.REGION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REGION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.REGION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REGION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.REGION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.REGION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.REGION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.REGION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.REGION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.REGION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.REGION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.REGION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REGION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REGION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REGION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.REGION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.REGION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.REGION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.REGION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.REGION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.REGION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.REGION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.REGION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.REGION___SEPARATOR:
+			return separator();
+		case UMLPackage.REGION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.REGION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REGION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REGION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REGION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.REGION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.REGION___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.REGION___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.REGION___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.REGION___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.REGION___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.REGION___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.REGION___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.REGION___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.REGION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REGION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REGION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REGION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.REGION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.REGION___VALIDATE_DEEP_HISTORY_VERTEX__DIAGNOSTICCHAIN_MAP:
+			return validateDeepHistoryVertex((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REGION___VALIDATE_SHALLOW_HISTORY_VERTEX__DIAGNOSTICCHAIN_MAP:
+			return validateShallowHistoryVertex((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REGION___VALIDATE_OWNED__DIAGNOSTICCHAIN_MAP:
+			return validateOwned((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REGION___VALIDATE_INITIAL_VERTEX__DIAGNOSTICCHAIN_MAP:
+			return validateInitialVertex((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REGION___BELONGS_TO_PSM:
+			return belongsToPSM();
+		case UMLPackage.REGION___CONTAINING_STATE_MACHINE:
+			return containingStateMachine();
+		case UMLPackage.REGION___REDEFINITION_CONTEXT:
+			return redefinitionContext();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1271,8 +1156,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.REGION__EXTENDED_REGION};
+	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[] { UMLPackage.REGION__EXTENDED_REGION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1290,12 +1174,10 @@
 	 */
 	public RedefinableElement getRedefinedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		redefinedElementLoop : for (RedefinableElement redefinedElement : getRedefinedElements()) {
+		redefinedElementLoop: for (RedefinableElement redefinedElement : getRedefinedElements()) {
 			if (eClass != null && !eClass.isInstance(redefinedElement))
 				continue redefinedElementLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinedElement.getName())
-				: name.equals(redefinedElement.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinedElement.getName()) : name.equals(redefinedElement.getName())))
 				continue redefinedElementLoop;
 			return redefinedElement;
 		}
@@ -1310,9 +1192,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.REGION__OWNED_RULE, UMLPackage.REGION__TRANSITION,
-		UMLPackage.REGION__SUBVERTEX};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.REGION__OWNED_RULE, UMLPackage.REGION__TRANSITION, UMLPackage.REGION__SUBVERTEX };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1322,9 +1202,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -1344,8 +1222,8 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.REGION__TRANSITION)
-			|| eIsSet(UMLPackage.REGION__SUBVERTEX);
+				|| eIsSet(UMLPackage.REGION__TRANSITION)
+				|| eIsSet(UMLPackage.REGION__SUBVERTEX);
 	}
 
 	/**
@@ -1373,8 +1251,9 @@
 	 */
 	@Override
 	public boolean isSetNamespace() {
-		return super.isSetNamespace() || eIsSet(UMLPackage.REGION__STATE)
-			|| eIsSet(UMLPackage.REGION__STATE_MACHINE);
+		return super.isSetNamespace()
+				|| eIsSet(UMLPackage.REGION__STATE)
+				|| eIsSet(UMLPackage.REGION__STATE_MACHINE);
 	}
 
 } //RegionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RelationshipImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RelationshipImpl.java
index a1a198a..34036f9 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RelationshipImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RelationshipImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -70,20 +71,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> relatedElements = (EList<Element>) cache.get(
-				eResource, this,
-				UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT);
+			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<Element>(
-						Element.class, this,
-						UMLPackage.RELATIONSHIP__RELATED_ELEMENT, null));
+				cache.put(eResource, this, UMLPackage.Literals.RELATIONSHIP__RELATED_ELEMENT, relatedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.RELATIONSHIP__RELATED_ELEMENT, null));
 			}
 			return relatedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.RELATIONSHIP__RELATED_ELEMENT, null);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.RELATIONSHIP__RELATED_ELEMENT, null);
 	}
 
 	/**
@@ -94,18 +88,18 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.RELATIONSHIP__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.RELATIONSHIP__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.RELATIONSHIP__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.RELATIONSHIP__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.RELATIONSHIP__RELATED_ELEMENT :
-				return getRelatedElements();
+		case UMLPackage.RELATIONSHIP__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.RELATIONSHIP__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.RELATIONSHIP__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.RELATIONSHIP__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.RELATIONSHIP__RELATED_ELEMENT:
+			return getRelatedElements();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -118,16 +112,16 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.RELATIONSHIP__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.RELATIONSHIP__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.RELATIONSHIP__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.RELATIONSHIP__OWNER :
-				return isSetOwner();
-			case UMLPackage.RELATIONSHIP__RELATED_ELEMENT :
-				return isSetRelatedElements();
+		case UMLPackage.RELATIONSHIP__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.RELATIONSHIP__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.RELATIONSHIP__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.RELATIONSHIP__OWNER:
+			return isSetOwner();
+		case UMLPackage.RELATIONSHIP__RELATED_ELEMENT:
+			return isSetRelatedElements();
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RemoveStructuralFeatureValueActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RemoveStructuralFeatureValueActionImpl.java
index 943a9f7..b4fa1bc 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RemoveStructuralFeatureValueActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RemoveStructuralFeatureValueActionImpl.java
@@ -1,14 +1,14 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,6 +29,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -118,20 +121,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT,
-			INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -140,11 +136,7 @@
 	 * @generated
 	 */
 	public boolean isRemoveDuplicates() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES,
-			true, true);
+		return (Boolean) eDynamicGet(UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES, true, true);
 	}
 
 	/**
@@ -153,11 +145,7 @@
 	 * @generated
 	 */
 	public void setIsRemoveDuplicates(boolean newIsRemoveDuplicates) {
-		eDynamicSet(
-			UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES,
-			newIsRemoveDuplicates);
+		eDynamicSet(UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES, newIsRemoveDuplicates);
 	}
 
 	/**
@@ -166,11 +154,7 @@
 	 * @generated
 	 */
 	public InputPin getRemoveAt() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT,
-			true, true);
+		return (InputPin) eDynamicGet(UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT, true, true);
 	}
 
 	/**
@@ -179,11 +163,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetRemoveAt() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT,
-			false, true);
+		return (InputPin) eDynamicGet(UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT, false, true);
 	}
 
 	/**
@@ -193,8 +173,7 @@
 	 */
 	public NotificationChain basicSetRemoveAt(InputPin newRemoveAt,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newRemoveAt,
-			UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newRemoveAt, UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT, msgs);
 		return msgs;
 	}
 
@@ -204,11 +183,7 @@
 	 * @generated
 	 */
 	public void setRemoveAt(InputPin newRemoveAt) {
-		eDynamicSet(
-			UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT,
-			newRemoveAt);
+		eDynamicSet(UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT, newRemoveAt);
 	}
 
 	/**
@@ -242,8 +217,7 @@
 	 */
 	public boolean validateRemoveAtAndValue(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RemoveStructuralFeatureValueActionOperations
-			.validateRemoveAtAndValue(this, diagnostics, context);
+		return RemoveStructuralFeatureValueActionOperations.validateRemoveAtAndValue(this, diagnostics, context);
 	}
 
 	/**
@@ -255,45 +229,36 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT :
-				return basicSetObject(null, msgs);
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT :
-				return basicSetResult(null, msgs);
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE :
-				return basicSetValue(null, msgs);
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT :
-				return basicSetRemoveAt(null, msgs);
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT:
+			return basicSetObject(null, msgs);
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT:
+			return basicSetResult(null, msgs);
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE:
+			return basicSetValue(null, msgs);
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT:
+			return basicSetRemoveAt(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -306,96 +271,96 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME :
-				return getName();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT :
-				if (resolve)
-					return getObject();
-				return basicGetObject();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE :
-				if (resolve)
-					return getStructuralFeature();
-				return basicGetStructuralFeature();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE :
-				if (resolve)
-					return getValue();
-				return basicGetValue();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES :
-				return isRemoveDuplicates();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT :
-				if (resolve)
-					return getRemoveAt();
-				return basicGetRemoveAt();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME:
+			return getName();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT:
+			if (resolve)
+				return getObject();
+			return basicGetObject();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE:
+			if (resolve)
+				return getStructuralFeature();
+			return basicGetStructuralFeature();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE:
+			if (resolve)
+				return getValue();
+			return basicGetValue();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES:
+			return isRemoveDuplicates();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT:
+			if (resolve)
+				return getRemoveAt();
+			return basicGetRemoveAt();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -409,95 +374,85 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT :
-				setObject((InputPin) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE :
-				setStructuralFeature((StructuralFeature) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE :
-				setValue((InputPin) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES :
-				setIsRemoveDuplicates((Boolean) newValue);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT :
-				setRemoveAt((InputPin) newValue);
-				return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT:
+			setObject((InputPin) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE:
+			setStructuralFeature((StructuralFeature) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE:
+			setValue((InputPin) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES:
+			setIsRemoveDuplicates((Boolean) newValue);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT:
+			setRemoveAt((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -510,75 +465,75 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT :
-				setObject((InputPin) null);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE :
-				setStructuralFeature((StructuralFeature) null);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE :
-				setValue((InputPin) null);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES :
-				setIsRemoveDuplicates(IS_REMOVE_DUPLICATES_EDEFAULT);
-				return;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT :
-				setRemoveAt((InputPin) null);
-				return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT:
+			setObject((InputPin) null);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE:
+			setStructuralFeature((StructuralFeature) null);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE:
+			setValue((InputPin) null);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES:
+			setIsRemoveDuplicates(IS_REMOVE_DUPLICATES_EDEFAULT);
+			return;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT:
+			setRemoveAt((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -591,76 +546,74 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT :
-				return basicGetObject() != null;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE :
-				return basicGetStructuralFeature() != null;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT :
-				return basicGetResult() != null;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE :
-				return basicGetValue() != null;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES :
-				return isRemoveDuplicates() != IS_REMOVE_DUPLICATES_EDEFAULT;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT :
-				return basicGetRemoveAt() != null;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT:
+			return basicGetObject() != null;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__STRUCTURAL_FEATURE:
+			return basicGetStructuralFeature() != null;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__RESULT:
+			return basicGetResult() != null;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE:
+			return basicGetValue() != null;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__IS_REMOVE_DUPLICATES:
+			return isRemoveDuplicates() != IS_REMOVE_DUPLICATES_EDEFAULT;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT:
+			return basicGetRemoveAt() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -675,186 +628,150 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_OBJECT_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateObjectType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateVisibility((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP :
-				return validateNotStatic((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_ONE_FEATURING_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateOneFeaturingClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_MULTIPLICITY_OF_RESULT__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfResult(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_TYPE_OF_VALUE__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfValue((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_MULTIPLICITY_OF_VALUE__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfValue(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_TYPE_OF_RESULT__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfResult((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_REMOVE_AT_AND_VALUE__DIAGNOSTICCHAIN_MAP :
-				return validateRemoveAtAndValue(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_OBJECT_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateObjectType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP:
+			return validateNotStatic((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_ONE_FEATURING_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateOneFeaturingClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_MULTIPLICITY_OF_RESULT__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfResult((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_TYPE_OF_VALUE__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfValue((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_MULTIPLICITY_OF_VALUE__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfValue((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_TYPE_OF_RESULT__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfResult((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION___VALIDATE_REMOVE_AT_AND_VALUE__DIAGNOSTICCHAIN_MAP:
+			return validateRemoveAtAndValue((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -867,10 +784,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT,
-		UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE,
-		UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__OBJECT, UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__VALUE, UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -879,8 +793,8 @@
 	 */
 	@Override
 	public boolean isSetInputs() {
-		return super.isSetInputs() || eIsSet(
-			UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT);
+		return super.isSetInputs()
+				|| eIsSet(UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION__REMOVE_AT);
 	}
 
 } //RemoveStructuralFeatureValueActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RemoveVariableValueActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RemoveVariableValueActionImpl.java
index 6251ff9..b551841 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RemoveVariableValueActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/RemoveVariableValueActionImpl.java
@@ -1,14 +1,14 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,6 +29,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -117,19 +120,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -138,11 +135,7 @@
 	 * @generated
 	 */
 	public boolean isRemoveDuplicates() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES,
-			true, true);
+		return (Boolean) eDynamicGet(UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES, true, true);
 	}
 
 	/**
@@ -151,11 +144,7 @@
 	 * @generated
 	 */
 	public void setIsRemoveDuplicates(boolean newIsRemoveDuplicates) {
-		eDynamicSet(
-			UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES,
-			newIsRemoveDuplicates);
+		eDynamicSet(UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES, newIsRemoveDuplicates);
 	}
 
 	/**
@@ -164,11 +153,7 @@
 	 * @generated
 	 */
 	public InputPin getRemoveAt() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT, true,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT, true, true);
 	}
 
 	/**
@@ -177,11 +162,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetRemoveAt() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT, false,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT, false, true);
 	}
 
 	/**
@@ -191,8 +172,7 @@
 	 */
 	public NotificationChain basicSetRemoveAt(InputPin newRemoveAt,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newRemoveAt,
-			UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newRemoveAt, UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT, msgs);
 		return msgs;
 	}
 
@@ -202,11 +182,7 @@
 	 * @generated
 	 */
 	public void setRemoveAt(InputPin newRemoveAt) {
-		eDynamicSet(
-			UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT,
-			newRemoveAt);
+		eDynamicSet(UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT, newRemoveAt);
 	}
 
 	/**
@@ -240,8 +216,7 @@
 	 */
 	public boolean validateRemoveAtAndValue(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RemoveVariableValueActionOperations
-			.validateRemoveAtAndValue(this, diagnostics, context);
+		return RemoveVariableValueActionOperations.validateRemoveAtAndValue(this, diagnostics, context);
 	}
 
 	/**
@@ -253,41 +228,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VALUE :
-				return basicSetValue(null, msgs);
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT :
-				return basicSetRemoveAt(null, msgs);
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VALUE:
+			return basicSetValue(null, msgs);
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT:
+			return basicSetRemoveAt(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -300,88 +266,88 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME :
-				return getName();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VARIABLE :
-				if (resolve)
-					return getVariable();
-				return basicGetVariable();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VALUE :
-				if (resolve)
-					return getValue();
-				return basicGetValue();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES :
-				return isRemoveDuplicates();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT :
-				if (resolve)
-					return getRemoveAt();
-				return basicGetRemoveAt();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME:
+			return getName();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VARIABLE:
+			if (resolve)
+				return getVariable();
+			return basicGetVariable();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VALUE:
+			if (resolve)
+				return getValue();
+			return basicGetValue();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES:
+			return isRemoveDuplicates();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT:
+			if (resolve)
+				return getRemoveAt();
+			return basicGetRemoveAt();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -395,89 +361,79 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VARIABLE :
-				setVariable((Variable) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VALUE :
-				setValue((InputPin) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES :
-				setIsRemoveDuplicates((Boolean) newValue);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT :
-				setRemoveAt((InputPin) newValue);
-				return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VARIABLE:
+			setVariable((Variable) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VALUE:
+			setValue((InputPin) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES:
+			setIsRemoveDuplicates((Boolean) newValue);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT:
+			setRemoveAt((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -490,69 +446,69 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VARIABLE :
-				setVariable((Variable) null);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VALUE :
-				setValue((InputPin) null);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES :
-				setIsRemoveDuplicates(IS_REMOVE_DUPLICATES_EDEFAULT);
-				return;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT :
-				setRemoveAt((InputPin) null);
-				return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VARIABLE:
+			setVariable((Variable) null);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VALUE:
+			setValue((InputPin) null);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES:
+			setIsRemoveDuplicates(IS_REMOVE_DUPLICATES_EDEFAULT);
+			return;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT:
+			setRemoveAt((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -565,72 +521,70 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VARIABLE :
-				return basicGetVariable() != null;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VALUE :
-				return basicGetValue() != null;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES :
-				return isRemoveDuplicates() != IS_REMOVE_DUPLICATES_EDEFAULT;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT :
-				return basicGetRemoveAt() != null;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VARIABLE:
+			return basicGetVariable() != null;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VALUE:
+			return basicGetValue() != null;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__IS_REMOVE_DUPLICATES:
+			return isRemoveDuplicates() != IS_REMOVE_DUPLICATES_EDEFAULT;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT:
+			return basicGetRemoveAt() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -645,166 +599,138 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_SCOPE_OF_VARIABLE__DIAGNOSTICCHAIN_MAP :
-				return validateScopeOfVariable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_VALUE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateValueType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_REMOVE_AT_AND_VALUE__DIAGNOSTICCHAIN_MAP :
-				return validateRemoveAtAndValue(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_SCOPE_OF_VARIABLE__DIAGNOSTICCHAIN_MAP:
+			return validateScopeOfVariable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_VALUE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateValueType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION___VALIDATE_REMOVE_AT_AND_VALUE__DIAGNOSTICCHAIN_MAP:
+			return validateRemoveAtAndValue((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -817,9 +743,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VALUE,
-		UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__VALUE, UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -829,7 +753,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT);
+				|| eIsSet(UMLPackage.REMOVE_VARIABLE_VALUE_ACTION__REMOVE_AT);
 	}
 
 } //RemoveVariableValueActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReplyActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReplyActionImpl.java
index 3ffe055..19bd3f5 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReplyActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ReplyActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,8 +28,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -107,18 +111,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this, UMLPackage.REPLY_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.REPLY_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.REPLY_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.REPLY_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -127,9 +126,7 @@
 	 * @generated
 	 */
 	public Trigger getReplyToCall() {
-		return (Trigger) eDynamicGet(
-			UMLPackage.REPLY_ACTION__REPLY_TO_CALL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REPLY_ACTION__REPLY_TO_CALL, true, true);
+		return (Trigger) eDynamicGet(UMLPackage.REPLY_ACTION__REPLY_TO_CALL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REPLY_ACTION__REPLY_TO_CALL, true, true);
 	}
 
 	/**
@@ -138,9 +135,7 @@
 	 * @generated
 	 */
 	public Trigger basicGetReplyToCall() {
-		return (Trigger) eDynamicGet(
-			UMLPackage.REPLY_ACTION__REPLY_TO_CALL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REPLY_ACTION__REPLY_TO_CALL, false, true);
+		return (Trigger) eDynamicGet(UMLPackage.REPLY_ACTION__REPLY_TO_CALL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REPLY_ACTION__REPLY_TO_CALL, false, true);
 	}
 
 	/**
@@ -149,9 +144,7 @@
 	 * @generated
 	 */
 	public void setReplyToCall(Trigger newReplyToCall) {
-		eDynamicSet(
-			UMLPackage.REPLY_ACTION__REPLY_TO_CALL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REPLY_ACTION__REPLY_TO_CALL, newReplyToCall);
+		eDynamicSet(UMLPackage.REPLY_ACTION__REPLY_TO_CALL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REPLY_ACTION__REPLY_TO_CALL, newReplyToCall);
 	}
 
 	/**
@@ -160,9 +153,7 @@
 	 * @generated
 	 */
 	public InputPin getReturnInformation() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.REPLY_ACTION__RETURN_INFORMATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REPLY_ACTION__RETURN_INFORMATION, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.REPLY_ACTION__RETURN_INFORMATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REPLY_ACTION__RETURN_INFORMATION, true, true);
 	}
 
 	/**
@@ -171,9 +162,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetReturnInformation() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.REPLY_ACTION__RETURN_INFORMATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REPLY_ACTION__RETURN_INFORMATION, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.REPLY_ACTION__RETURN_INFORMATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REPLY_ACTION__RETURN_INFORMATION, false, true);
 	}
 
 	/**
@@ -183,8 +172,7 @@
 	 */
 	public NotificationChain basicSetReturnInformation(
 			InputPin newReturnInformation, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newReturnInformation,
-			UMLPackage.REPLY_ACTION__RETURN_INFORMATION, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newReturnInformation, UMLPackage.REPLY_ACTION__RETURN_INFORMATION, msgs);
 		return msgs;
 	}
 
@@ -194,10 +182,7 @@
 	 * @generated
 	 */
 	public void setReturnInformation(InputPin newReturnInformation) {
-		eDynamicSet(
-			UMLPackage.REPLY_ACTION__RETURN_INFORMATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REPLY_ACTION__RETURN_INFORMATION,
-			newReturnInformation);
+		eDynamicSet(UMLPackage.REPLY_ACTION__RETURN_INFORMATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REPLY_ACTION__RETURN_INFORMATION, newReturnInformation);
 	}
 
 	/**
@@ -222,8 +207,7 @@
 	 * @generated
 	 */
 	public InputPin createReturnInformation(String name, Type type) {
-		return createReturnInformation(name, type,
-			UMLPackage.Literals.INPUT_PIN);
+		return createReturnInformation(name, type, UMLPackage.Literals.INPUT_PIN);
 	}
 
 	/**
@@ -233,9 +217,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<InputPin> getReplyValues() {
-		return (EList<InputPin>) eDynamicGet(
-			UMLPackage.REPLY_ACTION__REPLY_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REPLY_ACTION__REPLY_VALUE, true, true);
+		return (EList<InputPin>) eDynamicGet(UMLPackage.REPLY_ACTION__REPLY_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REPLY_ACTION__REPLY_VALUE, true, true);
 	}
 
 	/**
@@ -278,20 +260,16 @@
 	 */
 	public InputPin getReplyValue(String name, Type type, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		replyValueLoop : for (InputPin replyValue : getReplyValues()) {
+		replyValueLoop: for (InputPin replyValue : getReplyValues()) {
 			if (eClass != null && !eClass.isInstance(replyValue))
 				continue replyValueLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(replyValue.getName())
-				: name.equals(replyValue.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(replyValue.getName()) : name.equals(replyValue.getName())))
 				continue replyValueLoop;
 			if (type != null && !type.equals(replyValue.getType()))
 				continue replyValueLoop;
 			return replyValue;
 		}
-		return createOnDemand && eClass != null
-			? createReplyValue(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createReplyValue(name, type, eClass) : null;
 	}
 
 	/**
@@ -301,8 +279,7 @@
 	 */
 	public boolean validatePinsMatchParameter(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ReplyActionOperations.validatePinsMatchParameter(this,
-			diagnostics, context);
+		return ReplyActionOperations.validatePinsMatchParameter(this, diagnostics, context);
 	}
 
 	/**
@@ -312,8 +289,7 @@
 	 */
 	public boolean validateEventOnReplyToCallTrigger(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return ReplyActionOperations.validateEventOnReplyToCallTrigger(this,
-			diagnostics, context);
+		return ReplyActionOperations.validateEventOnReplyToCallTrigger(this, diagnostics, context);
 	}
 
 	/**
@@ -325,42 +301,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.REPLY_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REPLY_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REPLY_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.REPLY_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REPLY_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.REPLY_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.REPLY_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.REPLY_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REPLY_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.REPLY_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REPLY_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REPLY_ACTION__REPLY_VALUE :
-				return ((InternalEList<?>) getReplyValues())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.REPLY_ACTION__RETURN_INFORMATION :
-				return basicSetReturnInformation(null, msgs);
+		case UMLPackage.REPLY_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REPLY_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REPLY_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.REPLY_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REPLY_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.REPLY_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REPLY_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REPLY_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REPLY_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REPLY_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REPLY_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REPLY_ACTION__REPLY_VALUE:
+			return ((InternalEList<?>) getReplyValues()).basicRemove(otherEnd, msgs);
+		case UMLPackage.REPLY_ACTION__RETURN_INFORMATION:
+			return basicSetReturnInformation(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -373,84 +339,84 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.REPLY_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.REPLY_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.REPLY_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.REPLY_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.REPLY_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.REPLY_ACTION__NAME :
-				return getName();
-			case UMLPackage.REPLY_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.REPLY_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.REPLY_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.REPLY_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.REPLY_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.REPLY_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.REPLY_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.REPLY_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.REPLY_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.REPLY_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.REPLY_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.REPLY_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.REPLY_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.REPLY_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.REPLY_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.REPLY_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.REPLY_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.REPLY_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.REPLY_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.REPLY_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.REPLY_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.REPLY_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.REPLY_ACTION__REPLY_TO_CALL :
-				if (resolve)
-					return getReplyToCall();
-				return basicGetReplyToCall();
-			case UMLPackage.REPLY_ACTION__REPLY_VALUE :
-				return getReplyValues();
-			case UMLPackage.REPLY_ACTION__RETURN_INFORMATION :
-				if (resolve)
-					return getReturnInformation();
-				return basicGetReturnInformation();
+		case UMLPackage.REPLY_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.REPLY_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.REPLY_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.REPLY_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.REPLY_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.REPLY_ACTION__NAME:
+			return getName();
+		case UMLPackage.REPLY_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.REPLY_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.REPLY_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.REPLY_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.REPLY_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.REPLY_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.REPLY_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.REPLY_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.REPLY_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.REPLY_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.REPLY_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.REPLY_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.REPLY_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.REPLY_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.REPLY_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.REPLY_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.REPLY_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.REPLY_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.REPLY_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.REPLY_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.REPLY_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.REPLY_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.REPLY_ACTION__REPLY_TO_CALL:
+			if (resolve)
+				return getReplyToCall();
+			return basicGetReplyToCall();
+		case UMLPackage.REPLY_ACTION__REPLY_VALUE:
+			return getReplyValues();
+		case UMLPackage.REPLY_ACTION__RETURN_INFORMATION:
+			if (resolve)
+				return getReturnInformation();
+			return basicGetReturnInformation();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -464,88 +430,77 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.REPLY_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__REPLY_TO_CALL :
-				setReplyToCall((Trigger) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__REPLY_VALUE :
-				getReplyValues().clear();
-				getReplyValues()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.REPLY_ACTION__RETURN_INFORMATION :
-				setReturnInformation((InputPin) newValue);
-				return;
+		case UMLPackage.REPLY_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__REPLY_TO_CALL:
+			setReplyToCall((Trigger) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__REPLY_VALUE:
+			getReplyValues().clear();
+			getReplyValues().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.REPLY_ACTION__RETURN_INFORMATION:
+			setReturnInformation((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -558,66 +513,66 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.REPLY_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.REPLY_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.REPLY_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.REPLY_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.REPLY_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.REPLY_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.REPLY_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.REPLY_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.REPLY_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.REPLY_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.REPLY_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.REPLY_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.REPLY_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.REPLY_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.REPLY_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.REPLY_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.REPLY_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.REPLY_ACTION__REPLY_TO_CALL :
-				setReplyToCall((Trigger) null);
-				return;
-			case UMLPackage.REPLY_ACTION__REPLY_VALUE :
-				getReplyValues().clear();
-				return;
-			case UMLPackage.REPLY_ACTION__RETURN_INFORMATION :
-				setReturnInformation((InputPin) null);
-				return;
+		case UMLPackage.REPLY_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.REPLY_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.REPLY_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.REPLY_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.REPLY_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.REPLY_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.REPLY_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.REPLY_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.REPLY_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.REPLY_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.REPLY_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.REPLY_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.REPLY_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.REPLY_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.REPLY_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.REPLY_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.REPLY_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.REPLY_ACTION__REPLY_TO_CALL:
+			setReplyToCall((Trigger) null);
+			return;
+		case UMLPackage.REPLY_ACTION__REPLY_VALUE:
+			getReplyValues().clear();
+			return;
+		case UMLPackage.REPLY_ACTION__RETURN_INFORMATION:
+			setReturnInformation((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -630,70 +585,68 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.REPLY_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.REPLY_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.REPLY_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.REPLY_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.REPLY_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.REPLY_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.REPLY_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.REPLY_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.REPLY_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.REPLY_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.REPLY_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.REPLY_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.REPLY_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.REPLY_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.REPLY_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.REPLY_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.REPLY_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.REPLY_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.REPLY_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.REPLY_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.REPLY_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.REPLY_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.REPLY_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.REPLY_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.REPLY_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.REPLY_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.REPLY_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.REPLY_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.REPLY_ACTION__REPLY_TO_CALL :
-				return basicGetReplyToCall() != null;
-			case UMLPackage.REPLY_ACTION__REPLY_VALUE :
-				return !getReplyValues().isEmpty();
-			case UMLPackage.REPLY_ACTION__RETURN_INFORMATION :
-				return basicGetReturnInformation() != null;
+		case UMLPackage.REPLY_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.REPLY_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.REPLY_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.REPLY_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.REPLY_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.REPLY_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.REPLY_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.REPLY_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.REPLY_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.REPLY_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.REPLY_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.REPLY_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.REPLY_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.REPLY_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.REPLY_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.REPLY_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.REPLY_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.REPLY_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.REPLY_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.REPLY_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.REPLY_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.REPLY_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.REPLY_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.REPLY_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.REPLY_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.REPLY_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.REPLY_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.REPLY_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.REPLY_ACTION__REPLY_TO_CALL:
+			return basicGetReplyToCall() != null;
+		case UMLPackage.REPLY_ACTION__REPLY_VALUE:
+			return !getReplyValues().isEmpty();
+		case UMLPackage.REPLY_ACTION__RETURN_INFORMATION:
+			return basicGetReturnInformation() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -708,160 +661,134 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.REPLY_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REPLY_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REPLY_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.REPLY_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.REPLY_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.REPLY_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.REPLY_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REPLY_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.REPLY_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.REPLY_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.REPLY_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.REPLY_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.REPLY_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.REPLY_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.REPLY_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REPLY_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.REPLY_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.REPLY_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.REPLY_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.REPLY_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REPLY_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REPLY_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REPLY_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.REPLY_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.REPLY_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.REPLY_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.REPLY_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.REPLY_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.REPLY_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.REPLY_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.REPLY_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REPLY_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REPLY_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REPLY_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.REPLY_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.REPLY_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.REPLY_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.REPLY_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.REPLY_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.REPLY_ACTION___VALIDATE_PINS_MATCH_PARAMETER__DIAGNOSTICCHAIN_MAP :
-				return validatePinsMatchParameter(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.REPLY_ACTION___VALIDATE_EVENT_ON_REPLY_TO_CALL_TRIGGER__DIAGNOSTICCHAIN_MAP :
-				return validateEventOnReplyToCallTrigger(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REPLY_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REPLY_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REPLY_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.REPLY_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.REPLY_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.REPLY_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.REPLY_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REPLY_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.REPLY_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.REPLY_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.REPLY_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.REPLY_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.REPLY_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.REPLY_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.REPLY_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REPLY_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.REPLY_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.REPLY_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.REPLY_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.REPLY_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REPLY_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REPLY_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REPLY_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.REPLY_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.REPLY_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.REPLY_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.REPLY_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.REPLY_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.REPLY_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.REPLY_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.REPLY_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REPLY_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REPLY_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REPLY_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.REPLY_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.REPLY_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.REPLY_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.REPLY_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.REPLY_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.REPLY_ACTION___VALIDATE_PINS_MATCH_PARAMETER__DIAGNOSTICCHAIN_MAP:
+			return validatePinsMatchParameter((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.REPLY_ACTION___VALIDATE_EVENT_ON_REPLY_TO_CALL_TRIGGER__DIAGNOSTICCHAIN_MAP:
+			return validateEventOnReplyToCallTrigger((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -874,9 +801,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.REPLY_ACTION__REPLY_VALUE,
-		UMLPackage.REPLY_ACTION__RETURN_INFORMATION};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.REPLY_ACTION__REPLY_VALUE, UMLPackage.REPLY_ACTION__RETURN_INFORMATION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -886,8 +811,8 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.REPLY_ACTION__REPLY_VALUE)
-			|| eIsSet(UMLPackage.REPLY_ACTION__RETURN_INFORMATION);
+				|| eIsSet(UMLPackage.REPLY_ACTION__REPLY_VALUE)
+				|| eIsSet(UMLPackage.REPLY_ACTION__RETURN_INFORMATION);
 	}
 
 } //ReplyActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SendObjectActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SendObjectActionImpl.java
index 3395172..5ce47a0 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SendObjectActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SendObjectActionImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 351774, 212765, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -15,6 +16,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -25,6 +27,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -104,18 +108,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.SEND_OBJECT_ACTION__INPUT, INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.SEND_OBJECT_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.SEND_OBJECT_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.SEND_OBJECT_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -124,9 +123,7 @@
 	 * @generated
 	 */
 	public InputPin getTarget() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.SEND_OBJECT_ACTION__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SEND_OBJECT_ACTION__TARGET, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.SEND_OBJECT_ACTION__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SEND_OBJECT_ACTION__TARGET, true, true);
 	}
 
 	/**
@@ -135,9 +132,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetTarget() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.SEND_OBJECT_ACTION__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SEND_OBJECT_ACTION__TARGET, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.SEND_OBJECT_ACTION__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SEND_OBJECT_ACTION__TARGET, false, true);
 	}
 
 	/**
@@ -147,8 +142,7 @@
 	 */
 	public NotificationChain basicSetTarget(InputPin newTarget,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newTarget,
-			UMLPackage.SEND_OBJECT_ACTION__TARGET, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newTarget, UMLPackage.SEND_OBJECT_ACTION__TARGET, msgs);
 		return msgs;
 	}
 
@@ -158,9 +152,7 @@
 	 * @generated
 	 */
 	public void setTarget(InputPin newTarget) {
-		eDynamicSet(
-			UMLPackage.SEND_OBJECT_ACTION__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SEND_OBJECT_ACTION__TARGET, newTarget);
+		eDynamicSet(UMLPackage.SEND_OBJECT_ACTION__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SEND_OBJECT_ACTION__TARGET, newTarget);
 	}
 
 	/**
@@ -194,8 +186,7 @@
 	 */
 	public boolean validateTypeTargetPin(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return SendObjectActionOperations.validateTypeTargetPin(this,
-			diagnostics, context);
+		return SendObjectActionOperations.validateTypeTargetPin(this, diagnostics, context);
 	}
 
 	/**
@@ -204,9 +195,7 @@
 	 * @generated
 	 */
 	public InputPin getRequest() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.SEND_OBJECT_ACTION__REQUEST - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SEND_OBJECT_ACTION__REQUEST, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.SEND_OBJECT_ACTION__REQUEST - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SEND_OBJECT_ACTION__REQUEST, true, true);
 	}
 
 	/**
@@ -215,9 +204,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetRequest() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.SEND_OBJECT_ACTION__REQUEST - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SEND_OBJECT_ACTION__REQUEST, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.SEND_OBJECT_ACTION__REQUEST - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SEND_OBJECT_ACTION__REQUEST, false, true);
 	}
 
 	/**
@@ -227,8 +214,7 @@
 	 */
 	public NotificationChain basicSetRequest(InputPin newRequest,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newRequest,
-			UMLPackage.SEND_OBJECT_ACTION__REQUEST, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newRequest, UMLPackage.SEND_OBJECT_ACTION__REQUEST, msgs);
 		return msgs;
 	}
 
@@ -238,9 +224,7 @@
 	 * @generated
 	 */
 	public void setRequest(InputPin newRequest) {
-		eDynamicSet(
-			UMLPackage.SEND_OBJECT_ACTION__REQUEST - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SEND_OBJECT_ACTION__REQUEST, newRequest);
+		eDynamicSet(UMLPackage.SEND_OBJECT_ACTION__REQUEST - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SEND_OBJECT_ACTION__REQUEST, newRequest);
 	}
 
 	/**
@@ -285,44 +269,34 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.SEND_OBJECT_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEND_OBJECT_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEND_OBJECT_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.SEND_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEND_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.SEND_OBJECT_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SEND_OBJECT_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SEND_OBJECT_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEND_OBJECT_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SEND_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEND_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEND_OBJECT_ACTION__ARGUMENT :
-				return ((InternalEList<?>) getArguments()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SEND_OBJECT_ACTION__REQUEST :
-				return basicSetRequest(null, msgs);
-			case UMLPackage.SEND_OBJECT_ACTION__TARGET :
-				return basicSetTarget(null, msgs);
+		case UMLPackage.SEND_OBJECT_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_OBJECT_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_OBJECT_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.SEND_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.SEND_OBJECT_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_OBJECT_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_OBJECT_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_OBJECT_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_OBJECT_ACTION__ARGUMENT:
+			return ((InternalEList<?>) getArguments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_OBJECT_ACTION__REQUEST:
+			return basicSetRequest(null, msgs);
+		case UMLPackage.SEND_OBJECT_ACTION__TARGET:
+			return basicSetTarget(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -335,88 +309,88 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.SEND_OBJECT_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.SEND_OBJECT_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.SEND_OBJECT_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.SEND_OBJECT_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.SEND_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.SEND_OBJECT_ACTION__NAME :
-				return getName();
-			case UMLPackage.SEND_OBJECT_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.SEND_OBJECT_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.SEND_OBJECT_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.SEND_OBJECT_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.SEND_OBJECT_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.SEND_OBJECT_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.SEND_OBJECT_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.SEND_OBJECT_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.SEND_OBJECT_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.SEND_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.SEND_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.SEND_OBJECT_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.SEND_OBJECT_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.SEND_OBJECT_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.SEND_OBJECT_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.SEND_OBJECT_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.SEND_OBJECT_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.SEND_OBJECT_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.SEND_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.SEND_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.SEND_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.SEND_OBJECT_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.SEND_OBJECT_ACTION__ARGUMENT :
-				return getArguments();
-			case UMLPackage.SEND_OBJECT_ACTION__ON_PORT :
-				if (resolve)
-					return getOnPort();
-				return basicGetOnPort();
-			case UMLPackage.SEND_OBJECT_ACTION__REQUEST :
-				if (resolve)
-					return getRequest();
-				return basicGetRequest();
-			case UMLPackage.SEND_OBJECT_ACTION__TARGET :
-				if (resolve)
-					return getTarget();
-				return basicGetTarget();
+		case UMLPackage.SEND_OBJECT_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.SEND_OBJECT_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.SEND_OBJECT_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.SEND_OBJECT_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.SEND_OBJECT_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.SEND_OBJECT_ACTION__NAME:
+			return getName();
+		case UMLPackage.SEND_OBJECT_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.SEND_OBJECT_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.SEND_OBJECT_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.SEND_OBJECT_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.SEND_OBJECT_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.SEND_OBJECT_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.SEND_OBJECT_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.SEND_OBJECT_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.SEND_OBJECT_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.SEND_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.SEND_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.SEND_OBJECT_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.SEND_OBJECT_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.SEND_OBJECT_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.SEND_OBJECT_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.SEND_OBJECT_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.SEND_OBJECT_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.SEND_OBJECT_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.SEND_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.SEND_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.SEND_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.SEND_OBJECT_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.SEND_OBJECT_ACTION__ARGUMENT:
+			return getArguments();
+		case UMLPackage.SEND_OBJECT_ACTION__ON_PORT:
+			if (resolve)
+				return getOnPort();
+			return basicGetOnPort();
+		case UMLPackage.SEND_OBJECT_ACTION__REQUEST:
+			if (resolve)
+				return getRequest();
+			return basicGetRequest();
+		case UMLPackage.SEND_OBJECT_ACTION__TARGET:
+			if (resolve)
+				return getTarget();
+			return basicGetTarget();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -430,91 +404,80 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.SEND_OBJECT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__ARGUMENT :
-				getArguments().clear();
-				getArguments()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__ON_PORT :
-				setOnPort((Port) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__REQUEST :
-				setRequest((InputPin) newValue);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__TARGET :
-				setTarget((InputPin) newValue);
-				return;
+		case UMLPackage.SEND_OBJECT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__ARGUMENT:
+			getArguments().clear();
+			getArguments().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__ON_PORT:
+			setOnPort((Port) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__REQUEST:
+			setRequest((InputPin) newValue);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__TARGET:
+			setTarget((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -527,69 +490,69 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.SEND_OBJECT_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__ARGUMENT :
-				getArguments().clear();
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__ON_PORT :
-				setOnPort((Port) null);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__REQUEST :
-				setRequest((InputPin) null);
-				return;
-			case UMLPackage.SEND_OBJECT_ACTION__TARGET :
-				setTarget((InputPin) null);
-				return;
+		case UMLPackage.SEND_OBJECT_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__ARGUMENT:
+			getArguments().clear();
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__ON_PORT:
+			setOnPort((Port) null);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__REQUEST:
+			setRequest((InputPin) null);
+			return;
+		case UMLPackage.SEND_OBJECT_ACTION__TARGET:
+			setTarget((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -602,72 +565,70 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.SEND_OBJECT_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.SEND_OBJECT_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.SEND_OBJECT_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.SEND_OBJECT_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.SEND_OBJECT_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.SEND_OBJECT_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.SEND_OBJECT_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.SEND_OBJECT_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.SEND_OBJECT_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.SEND_OBJECT_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.SEND_OBJECT_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.SEND_OBJECT_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.SEND_OBJECT_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.SEND_OBJECT_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.SEND_OBJECT_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.SEND_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.SEND_OBJECT_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.SEND_OBJECT_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.SEND_OBJECT_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.SEND_OBJECT_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.SEND_OBJECT_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.SEND_OBJECT_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.SEND_OBJECT_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.SEND_OBJECT_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.SEND_OBJECT_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.SEND_OBJECT_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.SEND_OBJECT_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.SEND_OBJECT_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.SEND_OBJECT_ACTION__ARGUMENT :
-				return isSetArguments();
-			case UMLPackage.SEND_OBJECT_ACTION__ON_PORT :
-				return basicGetOnPort() != null;
-			case UMLPackage.SEND_OBJECT_ACTION__REQUEST :
-				return isSetRequest();
-			case UMLPackage.SEND_OBJECT_ACTION__TARGET :
-				return basicGetTarget() != null;
+		case UMLPackage.SEND_OBJECT_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.SEND_OBJECT_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.SEND_OBJECT_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.SEND_OBJECT_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.SEND_OBJECT_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.SEND_OBJECT_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.SEND_OBJECT_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.SEND_OBJECT_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.SEND_OBJECT_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.SEND_OBJECT_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.SEND_OBJECT_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.SEND_OBJECT_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.SEND_OBJECT_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.SEND_OBJECT_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.SEND_OBJECT_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.SEND_OBJECT_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.SEND_OBJECT_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.SEND_OBJECT_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.SEND_OBJECT_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.SEND_OBJECT_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.SEND_OBJECT_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.SEND_OBJECT_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.SEND_OBJECT_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.SEND_OBJECT_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.SEND_OBJECT_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.SEND_OBJECT_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.SEND_OBJECT_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.SEND_OBJECT_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.SEND_OBJECT_ACTION__ARGUMENT:
+			return isSetArguments();
+		case UMLPackage.SEND_OBJECT_ACTION__ON_PORT:
+			return basicGetOnPort() != null;
+		case UMLPackage.SEND_OBJECT_ACTION__REQUEST:
+			return isSetRequest();
+		case UMLPackage.SEND_OBJECT_ACTION__TARGET:
+			return basicGetTarget() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -682,155 +643,132 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.SEND_OBJECT_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_OBJECT_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.SEND_OBJECT_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.SEND_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.SEND_OBJECT_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.SEND_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.SEND_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.SEND_OBJECT_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.SEND_OBJECT_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.SEND_OBJECT_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.SEND_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.SEND_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.SEND_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.SEND_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.SEND_OBJECT_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.SEND_OBJECT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.SEND_OBJECT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.SEND_OBJECT_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_OBJECT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.SEND_OBJECT_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.SEND_OBJECT_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.SEND_OBJECT_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.SEND_OBJECT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.SEND_OBJECT_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.SEND_OBJECT_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.SEND_OBJECT_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_OBJECT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.SEND_OBJECT_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.SEND_OBJECT_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.SEND_OBJECT_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.SEND_OBJECT_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.SEND_OBJECT_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_TYPE_TARGET_PIN__DIAGNOSTICCHAIN_MAP :
-				return validateTypeTargetPin((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_OBJECT_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_OBJECT_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.SEND_OBJECT_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.SEND_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.SEND_OBJECT_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.SEND_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.SEND_OBJECT_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.SEND_OBJECT_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.SEND_OBJECT_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.SEND_OBJECT_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.SEND_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.SEND_OBJECT_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.SEND_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.SEND_OBJECT_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.SEND_OBJECT_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.SEND_OBJECT_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.SEND_OBJECT_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.SEND_OBJECT_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_OBJECT_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.SEND_OBJECT_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.SEND_OBJECT_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.SEND_OBJECT_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.SEND_OBJECT_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.SEND_OBJECT_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.SEND_OBJECT_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.SEND_OBJECT_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_OBJECT_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.SEND_OBJECT_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.SEND_OBJECT_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.SEND_OBJECT_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.SEND_OBJECT_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.SEND_OBJECT_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.SEND_OBJECT_ACTION___VALIDATE_TYPE_TARGET_PIN__DIAGNOSTICCHAIN_MAP:
+			return validateTypeTargetPin((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -843,9 +781,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.SEND_OBJECT_ACTION__ARGUMENT,
-		UMLPackage.SEND_OBJECT_ACTION__TARGET};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.SEND_OBJECT_ACTION__ARGUMENT, UMLPackage.SEND_OBJECT_ACTION__TARGET };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -855,7 +791,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.SEND_OBJECT_ACTION__TARGET);
+				|| eIsSet(UMLPackage.SEND_OBJECT_ACTION__TARGET);
 	}
 
 	/**
@@ -870,9 +806,7 @@
 		if (request != null) {
 			argument.add(request);
 		}
-		return new UnionEObjectEList<InputPin>(this,
-			UMLPackage.Literals.INVOCATION_ACTION__ARGUMENT, argument.size(),
-			argument.toArray());
+		return new UnionEObjectEList<InputPin>(this, UMLPackage.Literals.INVOCATION_ACTION__ARGUMENT, argument.size(), argument.toArray());
 	}
 
 	/**
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SendSignalActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SendSignalActionImpl.java
index f44590b..41dabce 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SendSignalActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SendSignalActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -107,18 +110,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.SEND_SIGNAL_ACTION__INPUT, INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.SEND_SIGNAL_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.SEND_SIGNAL_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.SEND_SIGNAL_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -127,9 +125,7 @@
 	 * @generated
 	 */
 	public InputPin getTarget() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.SEND_SIGNAL_ACTION__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SEND_SIGNAL_ACTION__TARGET, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.SEND_SIGNAL_ACTION__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SEND_SIGNAL_ACTION__TARGET, true, true);
 	}
 
 	/**
@@ -138,9 +134,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetTarget() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.SEND_SIGNAL_ACTION__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SEND_SIGNAL_ACTION__TARGET, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.SEND_SIGNAL_ACTION__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SEND_SIGNAL_ACTION__TARGET, false, true);
 	}
 
 	/**
@@ -150,8 +144,7 @@
 	 */
 	public NotificationChain basicSetTarget(InputPin newTarget,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newTarget,
-			UMLPackage.SEND_SIGNAL_ACTION__TARGET, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newTarget, UMLPackage.SEND_SIGNAL_ACTION__TARGET, msgs);
 		return msgs;
 	}
 
@@ -161,9 +154,7 @@
 	 * @generated
 	 */
 	public void setTarget(InputPin newTarget) {
-		eDynamicSet(
-			UMLPackage.SEND_SIGNAL_ACTION__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SEND_SIGNAL_ACTION__TARGET, newTarget);
+		eDynamicSet(UMLPackage.SEND_SIGNAL_ACTION__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SEND_SIGNAL_ACTION__TARGET, newTarget);
 	}
 
 	/**
@@ -196,9 +187,7 @@
 	 * @generated
 	 */
 	public Signal getSignal() {
-		return (Signal) eDynamicGet(
-			UMLPackage.SEND_SIGNAL_ACTION__SIGNAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SEND_SIGNAL_ACTION__SIGNAL, true, true);
+		return (Signal) eDynamicGet(UMLPackage.SEND_SIGNAL_ACTION__SIGNAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SEND_SIGNAL_ACTION__SIGNAL, true, true);
 	}
 
 	/**
@@ -207,9 +196,7 @@
 	 * @generated
 	 */
 	public Signal basicGetSignal() {
-		return (Signal) eDynamicGet(
-			UMLPackage.SEND_SIGNAL_ACTION__SIGNAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SEND_SIGNAL_ACTION__SIGNAL, false, true);
+		return (Signal) eDynamicGet(UMLPackage.SEND_SIGNAL_ACTION__SIGNAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SEND_SIGNAL_ACTION__SIGNAL, false, true);
 	}
 
 	/**
@@ -218,9 +205,7 @@
 	 * @generated
 	 */
 	public void setSignal(Signal newSignal) {
-		eDynamicSet(
-			UMLPackage.SEND_SIGNAL_ACTION__SIGNAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SEND_SIGNAL_ACTION__SIGNAL, newSignal);
+		eDynamicSet(UMLPackage.SEND_SIGNAL_ACTION__SIGNAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SEND_SIGNAL_ACTION__SIGNAL, newSignal);
 	}
 
 	/**
@@ -230,8 +215,7 @@
 	 */
 	public boolean validateNumberOrder(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return SendSignalActionOperations.validateNumberOrder(this, diagnostics,
-			context);
+		return SendSignalActionOperations.validateNumberOrder(this, diagnostics, context);
 	}
 
 	/**
@@ -241,8 +225,7 @@
 	 */
 	public boolean validateTypeTargetPin(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return SendSignalActionOperations.validateTypeTargetPin(this,
-			diagnostics, context);
+		return SendSignalActionOperations.validateTypeTargetPin(this, diagnostics, context);
 	}
 
 	/**
@@ -252,8 +235,7 @@
 	 */
 	public boolean validateTypeOrderingMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return SendSignalActionOperations.validateTypeOrderingMultiplicity(this,
-			diagnostics, context);
+		return SendSignalActionOperations.validateTypeOrderingMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -265,42 +247,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.SEND_SIGNAL_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEND_SIGNAL_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEND_SIGNAL_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.SEND_SIGNAL_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SEND_SIGNAL_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEND_SIGNAL_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEND_SIGNAL_ACTION__ARGUMENT :
-				return ((InternalEList<?>) getArguments()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SEND_SIGNAL_ACTION__TARGET :
-				return basicSetTarget(null, msgs);
+		case UMLPackage.SEND_SIGNAL_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_SIGNAL_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_SIGNAL_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.SEND_SIGNAL_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_SIGNAL_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_SIGNAL_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_SIGNAL_ACTION__ARGUMENT:
+			return ((InternalEList<?>) getArguments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEND_SIGNAL_ACTION__TARGET:
+			return basicSetTarget(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -313,88 +285,88 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.SEND_SIGNAL_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.SEND_SIGNAL_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.SEND_SIGNAL_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.SEND_SIGNAL_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.SEND_SIGNAL_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.SEND_SIGNAL_ACTION__NAME :
-				return getName();
-			case UMLPackage.SEND_SIGNAL_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.SEND_SIGNAL_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.SEND_SIGNAL_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.SEND_SIGNAL_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.SEND_SIGNAL_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.SEND_SIGNAL_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.SEND_SIGNAL_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.SEND_SIGNAL_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.SEND_SIGNAL_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.SEND_SIGNAL_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.SEND_SIGNAL_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.SEND_SIGNAL_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.SEND_SIGNAL_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.SEND_SIGNAL_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.SEND_SIGNAL_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.SEND_SIGNAL_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.SEND_SIGNAL_ACTION__ARGUMENT :
-				return getArguments();
-			case UMLPackage.SEND_SIGNAL_ACTION__ON_PORT :
-				if (resolve)
-					return getOnPort();
-				return basicGetOnPort();
-			case UMLPackage.SEND_SIGNAL_ACTION__SIGNAL :
-				if (resolve)
-					return getSignal();
-				return basicGetSignal();
-			case UMLPackage.SEND_SIGNAL_ACTION__TARGET :
-				if (resolve)
-					return getTarget();
-				return basicGetTarget();
+		case UMLPackage.SEND_SIGNAL_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.SEND_SIGNAL_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.SEND_SIGNAL_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.SEND_SIGNAL_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.SEND_SIGNAL_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.SEND_SIGNAL_ACTION__NAME:
+			return getName();
+		case UMLPackage.SEND_SIGNAL_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.SEND_SIGNAL_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.SEND_SIGNAL_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.SEND_SIGNAL_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.SEND_SIGNAL_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.SEND_SIGNAL_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.SEND_SIGNAL_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.SEND_SIGNAL_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.SEND_SIGNAL_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.SEND_SIGNAL_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.SEND_SIGNAL_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.SEND_SIGNAL_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.SEND_SIGNAL_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.SEND_SIGNAL_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.SEND_SIGNAL_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.SEND_SIGNAL_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.SEND_SIGNAL_ACTION__ARGUMENT:
+			return getArguments();
+		case UMLPackage.SEND_SIGNAL_ACTION__ON_PORT:
+			if (resolve)
+				return getOnPort();
+			return basicGetOnPort();
+		case UMLPackage.SEND_SIGNAL_ACTION__SIGNAL:
+			if (resolve)
+				return getSignal();
+			return basicGetSignal();
+		case UMLPackage.SEND_SIGNAL_ACTION__TARGET:
+			if (resolve)
+				return getTarget();
+			return basicGetTarget();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -408,91 +380,80 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.SEND_SIGNAL_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__ARGUMENT :
-				getArguments().clear();
-				getArguments()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__ON_PORT :
-				setOnPort((Port) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__SIGNAL :
-				setSignal((Signal) newValue);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__TARGET :
-				setTarget((InputPin) newValue);
-				return;
+		case UMLPackage.SEND_SIGNAL_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__ARGUMENT:
+			getArguments().clear();
+			getArguments().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__ON_PORT:
+			setOnPort((Port) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__SIGNAL:
+			setSignal((Signal) newValue);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__TARGET:
+			setTarget((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -505,69 +466,69 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.SEND_SIGNAL_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__ARGUMENT :
-				getArguments().clear();
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__ON_PORT :
-				setOnPort((Port) null);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__SIGNAL :
-				setSignal((Signal) null);
-				return;
-			case UMLPackage.SEND_SIGNAL_ACTION__TARGET :
-				setTarget((InputPin) null);
-				return;
+		case UMLPackage.SEND_SIGNAL_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__ARGUMENT:
+			getArguments().clear();
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__ON_PORT:
+			setOnPort((Port) null);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__SIGNAL:
+			setSignal((Signal) null);
+			return;
+		case UMLPackage.SEND_SIGNAL_ACTION__TARGET:
+			setTarget((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -580,72 +541,70 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.SEND_SIGNAL_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.SEND_SIGNAL_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.SEND_SIGNAL_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.SEND_SIGNAL_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.SEND_SIGNAL_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.SEND_SIGNAL_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.SEND_SIGNAL_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.SEND_SIGNAL_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.SEND_SIGNAL_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.SEND_SIGNAL_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.SEND_SIGNAL_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.SEND_SIGNAL_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.SEND_SIGNAL_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.SEND_SIGNAL_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.SEND_SIGNAL_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.SEND_SIGNAL_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.SEND_SIGNAL_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.SEND_SIGNAL_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.SEND_SIGNAL_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.SEND_SIGNAL_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.SEND_SIGNAL_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.SEND_SIGNAL_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.SEND_SIGNAL_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.SEND_SIGNAL_ACTION__ARGUMENT :
-				return !getArguments().isEmpty();
-			case UMLPackage.SEND_SIGNAL_ACTION__ON_PORT :
-				return basicGetOnPort() != null;
-			case UMLPackage.SEND_SIGNAL_ACTION__SIGNAL :
-				return basicGetSignal() != null;
-			case UMLPackage.SEND_SIGNAL_ACTION__TARGET :
-				return basicGetTarget() != null;
+		case UMLPackage.SEND_SIGNAL_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.SEND_SIGNAL_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.SEND_SIGNAL_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.SEND_SIGNAL_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.SEND_SIGNAL_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.SEND_SIGNAL_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.SEND_SIGNAL_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.SEND_SIGNAL_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.SEND_SIGNAL_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.SEND_SIGNAL_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.SEND_SIGNAL_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.SEND_SIGNAL_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.SEND_SIGNAL_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.SEND_SIGNAL_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.SEND_SIGNAL_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.SEND_SIGNAL_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.SEND_SIGNAL_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.SEND_SIGNAL_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.SEND_SIGNAL_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.SEND_SIGNAL_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.SEND_SIGNAL_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.SEND_SIGNAL_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.SEND_SIGNAL_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.SEND_SIGNAL_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.SEND_SIGNAL_ACTION__ARGUMENT:
+			return !getArguments().isEmpty();
+		case UMLPackage.SEND_SIGNAL_ACTION__ON_PORT:
+			return basicGetOnPort() != null;
+		case UMLPackage.SEND_SIGNAL_ACTION__SIGNAL:
+			return basicGetSignal() != null;
+		case UMLPackage.SEND_SIGNAL_ACTION__TARGET:
+			return basicGetTarget() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -660,162 +619,136 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_SIGNAL_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.SEND_SIGNAL_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.SEND_SIGNAL_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.SEND_SIGNAL_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.SEND_SIGNAL_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_SIGNAL_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.SEND_SIGNAL_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.SEND_SIGNAL_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.SEND_SIGNAL_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.SEND_SIGNAL_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_SIGNAL_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.SEND_SIGNAL_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.SEND_SIGNAL_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.SEND_SIGNAL_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.SEND_SIGNAL_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.SEND_SIGNAL_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_TYPE_ORDERING_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOrderingMultiplicity(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_NUMBER_ORDER__DIAGNOSTICCHAIN_MAP :
-				return validateNumberOrder((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_TYPE_TARGET_PIN__DIAGNOSTICCHAIN_MAP :
-				return validateTypeTargetPin((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_SIGNAL_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.SEND_SIGNAL_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.SEND_SIGNAL_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.SEND_SIGNAL_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.SEND_SIGNAL_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_SIGNAL_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.SEND_SIGNAL_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.SEND_SIGNAL_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.SEND_SIGNAL_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.SEND_SIGNAL_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_SIGNAL_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.SEND_SIGNAL_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.SEND_SIGNAL_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.SEND_SIGNAL_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.SEND_SIGNAL_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.SEND_SIGNAL_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_TYPE_ORDERING_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOrderingMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_NUMBER_ORDER__DIAGNOSTICCHAIN_MAP:
+			return validateNumberOrder((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SEND_SIGNAL_ACTION___VALIDATE_TYPE_TARGET_PIN__DIAGNOSTICCHAIN_MAP:
+			return validateTypeTargetPin((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -828,9 +761,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.SEND_SIGNAL_ACTION__ARGUMENT,
-		UMLPackage.SEND_SIGNAL_ACTION__TARGET};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.SEND_SIGNAL_ACTION__ARGUMENT, UMLPackage.SEND_SIGNAL_ACTION__TARGET };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -840,7 +771,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.SEND_SIGNAL_ACTION__TARGET);
+				|| eIsSet(UMLPackage.SEND_SIGNAL_ACTION__TARGET);
 	}
 
 } //SendSignalActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SequenceNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SequenceNodeImpl.java
index 6918ca8..906aad4 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SequenceNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SequenceNodeImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 351774, 212765, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -21,6 +22,7 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Activity;
@@ -86,9 +88,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ExecutableNode> getExecutableNodes() {
-		return (EList<ExecutableNode>) eDynamicGet(
-			UMLPackage.SEQUENCE_NODE__EXECUTABLE_NODE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SEQUENCE_NODE__EXECUTABLE_NODE, true, true);
+		return (EList<ExecutableNode>) eDynamicGet(UMLPackage.SEQUENCE_NODE__EXECUTABLE_NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SEQUENCE_NODE__EXECUTABLE_NODE, true, true);
 	}
 
 	/**
@@ -120,18 +120,14 @@
 	 */
 	public ExecutableNode getExecutableNode(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		executableNodeLoop : for (ExecutableNode executableNode : getExecutableNodes()) {
+		executableNodeLoop: for (ExecutableNode executableNode : getExecutableNodes()) {
 			if (eClass != null && !eClass.isInstance(executableNode))
 				continue executableNodeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(executableNode.getName())
-				: name.equals(executableNode.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(executableNode.getName()) : name.equals(executableNode.getName())))
 				continue executableNodeLoop;
 			return executableNode;
 		}
-		return createOnDemand && eClass != null
-			? createExecutableNode(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createExecutableNode(name, eClass) : null;
 	}
 
 	/**
@@ -153,47 +149,34 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.SEQUENCE_NODE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__IN_STRUCTURED_NODE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetInStructuredNode(
-					(StructuredActivityNode) otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__INCOMING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__OUTGOING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__IN_PARTITION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__HANDLER :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getHandlers())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__EDGE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEdges())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__VARIABLE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getVariables())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__NODE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getNodes())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__IN_STRUCTURED_NODE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetInStructuredNode((StructuredActivityNode) otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__INCOMING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__OUTGOING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__IN_PARTITION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__HANDLER:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getHandlers()).basicAdd(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__EDGE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEdges()).basicAdd(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__VARIABLE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getVariables()).basicAdd(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__NODE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getNodes()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -207,64 +190,46 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.SEQUENCE_NODE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.SEQUENCE_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.SEQUENCE_NODE__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SEQUENCE_NODE__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SEQUENCE_NODE__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SEQUENCE_NODE__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__EDGE :
-				return ((InternalEList<?>) getEdges()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_INPUT :
-				return ((InternalEList<?>) getStructuredNodeInputs())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_OUTPUT :
-				return ((InternalEList<?>) getStructuredNodeOutputs())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SEQUENCE_NODE__VARIABLE :
-				return ((InternalEList<?>) getVariables()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SEQUENCE_NODE__NODE :
-				return ((InternalEList<?>) getNodes()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SEQUENCE_NODE__EXECUTABLE_NODE :
-				return ((InternalEList<?>) getExecutableNodes())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.SEQUENCE_NODE__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.SEQUENCE_NODE__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__EDGE:
+			return ((InternalEList<?>) getEdges()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_INPUT:
+			return ((InternalEList<?>) getStructuredNodeInputs()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_OUTPUT:
+			return ((InternalEList<?>) getStructuredNodeOutputs()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__VARIABLE:
+			return ((InternalEList<?>) getVariables()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__NODE:
+			return ((InternalEList<?>) getNodes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SEQUENCE_NODE__EXECUTABLE_NODE:
+			return ((InternalEList<?>) getExecutableNodes()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -277,114 +242,114 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.SEQUENCE_NODE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.SEQUENCE_NODE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.SEQUENCE_NODE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.SEQUENCE_NODE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.SEQUENCE_NODE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.SEQUENCE_NODE__NAME :
-				return getName();
-			case UMLPackage.SEQUENCE_NODE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.SEQUENCE_NODE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.SEQUENCE_NODE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.SEQUENCE_NODE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.SEQUENCE_NODE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.SEQUENCE_NODE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.SEQUENCE_NODE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.SEQUENCE_NODE__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.SEQUENCE_NODE__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.SEQUENCE_NODE__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.SEQUENCE_NODE__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.SEQUENCE_NODE__INCOMING :
-				return getIncomings();
-			case UMLPackage.SEQUENCE_NODE__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.SEQUENCE_NODE__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.SEQUENCE_NODE__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.SEQUENCE_NODE__HANDLER :
-				return getHandlers();
-			case UMLPackage.SEQUENCE_NODE__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.SEQUENCE_NODE__INPUT :
-				return getInputs();
-			case UMLPackage.SEQUENCE_NODE__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.SEQUENCE_NODE__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.SEQUENCE_NODE__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.SEQUENCE_NODE__OUTPUT :
-				return getOutputs();
-			case UMLPackage.SEQUENCE_NODE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.SEQUENCE_NODE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.SEQUENCE_NODE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.SEQUENCE_NODE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.SEQUENCE_NODE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.SEQUENCE_NODE__MEMBER :
-				return getMembers();
-			case UMLPackage.SEQUENCE_NODE__CONTAINED_EDGE :
-				return getContainedEdges();
-			case UMLPackage.SEQUENCE_NODE__CONTAINED_NODE :
-				return getContainedNodes();
-			case UMLPackage.SEQUENCE_NODE__IN_ACTIVITY :
-				if (resolve)
-					return getInActivity();
-				return basicGetInActivity();
-			case UMLPackage.SEQUENCE_NODE__SUBGROUP :
-				return getSubgroups();
-			case UMLPackage.SEQUENCE_NODE__SUPER_GROUP :
-				if (resolve)
-					return getSuperGroup();
-				return basicGetSuperGroup();
-			case UMLPackage.SEQUENCE_NODE__EDGE :
-				return getEdges();
-			case UMLPackage.SEQUENCE_NODE__MUST_ISOLATE :
-				return isMustIsolate();
-			case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_INPUT :
-				return getStructuredNodeInputs();
-			case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_OUTPUT :
-				return getStructuredNodeOutputs();
-			case UMLPackage.SEQUENCE_NODE__VARIABLE :
-				return getVariables();
-			case UMLPackage.SEQUENCE_NODE__NODE :
-				return getNodes();
-			case UMLPackage.SEQUENCE_NODE__EXECUTABLE_NODE :
-				return getExecutableNodes();
+		case UMLPackage.SEQUENCE_NODE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.SEQUENCE_NODE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.SEQUENCE_NODE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.SEQUENCE_NODE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.SEQUENCE_NODE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.SEQUENCE_NODE__NAME:
+			return getName();
+		case UMLPackage.SEQUENCE_NODE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.SEQUENCE_NODE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.SEQUENCE_NODE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.SEQUENCE_NODE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.SEQUENCE_NODE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.SEQUENCE_NODE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.SEQUENCE_NODE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.SEQUENCE_NODE__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.SEQUENCE_NODE__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.SEQUENCE_NODE__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.SEQUENCE_NODE__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.SEQUENCE_NODE__INCOMING:
+			return getIncomings();
+		case UMLPackage.SEQUENCE_NODE__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.SEQUENCE_NODE__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.SEQUENCE_NODE__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.SEQUENCE_NODE__HANDLER:
+			return getHandlers();
+		case UMLPackage.SEQUENCE_NODE__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.SEQUENCE_NODE__INPUT:
+			return getInputs();
+		case UMLPackage.SEQUENCE_NODE__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.SEQUENCE_NODE__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.SEQUENCE_NODE__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.SEQUENCE_NODE__OUTPUT:
+			return getOutputs();
+		case UMLPackage.SEQUENCE_NODE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.SEQUENCE_NODE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.SEQUENCE_NODE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.SEQUENCE_NODE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.SEQUENCE_NODE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.SEQUENCE_NODE__MEMBER:
+			return getMembers();
+		case UMLPackage.SEQUENCE_NODE__CONTAINED_EDGE:
+			return getContainedEdges();
+		case UMLPackage.SEQUENCE_NODE__CONTAINED_NODE:
+			return getContainedNodes();
+		case UMLPackage.SEQUENCE_NODE__IN_ACTIVITY:
+			if (resolve)
+				return getInActivity();
+			return basicGetInActivity();
+		case UMLPackage.SEQUENCE_NODE__SUBGROUP:
+			return getSubgroups();
+		case UMLPackage.SEQUENCE_NODE__SUPER_GROUP:
+			if (resolve)
+				return getSuperGroup();
+			return basicGetSuperGroup();
+		case UMLPackage.SEQUENCE_NODE__EDGE:
+			return getEdges();
+		case UMLPackage.SEQUENCE_NODE__MUST_ISOLATE:
+			return isMustIsolate();
+		case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_INPUT:
+			return getStructuredNodeInputs();
+		case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_OUTPUT:
+			return getStructuredNodeOutputs();
+		case UMLPackage.SEQUENCE_NODE__VARIABLE:
+			return getVariables();
+		case UMLPackage.SEQUENCE_NODE__NODE:
+			return getNodes();
+		case UMLPackage.SEQUENCE_NODE__EXECUTABLE_NODE:
+			return getExecutableNodes();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -398,128 +363,109 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.SEQUENCE_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__IN_ACTIVITY :
-				setInActivity((Activity) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__EDGE :
-				getEdges().clear();
-				getEdges()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__MUST_ISOLATE :
-				setMustIsolate((Boolean) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_INPUT :
-				getStructuredNodeInputs().clear();
-				getStructuredNodeInputs()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_OUTPUT :
-				getStructuredNodeOutputs().clear();
-				getStructuredNodeOutputs()
-					.addAll((Collection<? extends OutputPin>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__VARIABLE :
-				getVariables().clear();
-				getVariables()
-					.addAll((Collection<? extends Variable>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__NODE :
-				getNodes().clear();
-				getNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.SEQUENCE_NODE__EXECUTABLE_NODE :
-				getExecutableNodes().clear();
-				getExecutableNodes()
-					.addAll((Collection<? extends ExecutableNode>) newValue);
-				return;
+		case UMLPackage.SEQUENCE_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__IN_ACTIVITY:
+			setInActivity((Activity) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__EDGE:
+			getEdges().clear();
+			getEdges().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__MUST_ISOLATE:
+			setMustIsolate((Boolean) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_INPUT:
+			getStructuredNodeInputs().clear();
+			getStructuredNodeInputs().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_OUTPUT:
+			getStructuredNodeOutputs().clear();
+			getStructuredNodeOutputs().addAll((Collection<? extends OutputPin>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__VARIABLE:
+			getVariables().clear();
+			getVariables().addAll((Collection<? extends Variable>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__NODE:
+			getNodes().clear();
+			getNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.SEQUENCE_NODE__EXECUTABLE_NODE:
+			getExecutableNodes().clear();
+			getExecutableNodes().addAll((Collection<? extends ExecutableNode>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -532,90 +478,90 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.SEQUENCE_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.SEQUENCE_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.SEQUENCE_NODE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.SEQUENCE_NODE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.SEQUENCE_NODE__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.SEQUENCE_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.SEQUENCE_NODE__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.SEQUENCE_NODE__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__IN_ACTIVITY :
-				setInActivity((Activity) null);
-				return;
-			case UMLPackage.SEQUENCE_NODE__EDGE :
-				getEdges().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__MUST_ISOLATE :
-				setMustIsolate(MUST_ISOLATE_EDEFAULT);
-				return;
-			case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_INPUT :
-				getStructuredNodeInputs().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_OUTPUT :
-				getStructuredNodeOutputs().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__VARIABLE :
-				getVariables().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__NODE :
-				getNodes().clear();
-				return;
-			case UMLPackage.SEQUENCE_NODE__EXECUTABLE_NODE :
-				getExecutableNodes().clear();
-				return;
+		case UMLPackage.SEQUENCE_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.SEQUENCE_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.SEQUENCE_NODE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.SEQUENCE_NODE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.SEQUENCE_NODE__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.SEQUENCE_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.SEQUENCE_NODE__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.SEQUENCE_NODE__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__IN_ACTIVITY:
+			setInActivity((Activity) null);
+			return;
+		case UMLPackage.SEQUENCE_NODE__EDGE:
+			getEdges().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__MUST_ISOLATE:
+			setMustIsolate(MUST_ISOLATE_EDEFAULT);
+			return;
+		case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_INPUT:
+			getStructuredNodeInputs().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_OUTPUT:
+			getStructuredNodeOutputs().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__VARIABLE:
+			getVariables().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__NODE:
+			getNodes().clear();
+			return;
+		case UMLPackage.SEQUENCE_NODE__EXECUTABLE_NODE:
+			getExecutableNodes().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -628,100 +574,98 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.SEQUENCE_NODE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.SEQUENCE_NODE__OWNER :
-				return isSetOwner();
-			case UMLPackage.SEQUENCE_NODE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__NAME :
-				return isSetName();
-			case UMLPackage.SEQUENCE_NODE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.SEQUENCE_NODE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.SEQUENCE_NODE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.SEQUENCE_NODE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.SEQUENCE_NODE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.SEQUENCE_NODE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.SEQUENCE_NODE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.SEQUENCE_NODE__ACTIVITY :
-				return isSetActivity();
-			case UMLPackage.SEQUENCE_NODE__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.SEQUENCE_NODE__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.SEQUENCE_NODE__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.SEQUENCE_NODE__INPUT :
-				return isSetInputs();
-			case UMLPackage.SEQUENCE_NODE__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.SEQUENCE_NODE__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.SEQUENCE_NODE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.SEQUENCE_NODE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__MEMBER :
-				return isSetMembers();
-			case UMLPackage.SEQUENCE_NODE__CONTAINED_EDGE :
-				return isSetContainedEdges();
-			case UMLPackage.SEQUENCE_NODE__CONTAINED_NODE :
-				return isSetContainedNodes();
-			case UMLPackage.SEQUENCE_NODE__IN_ACTIVITY :
-				return isSetInActivity();
-			case UMLPackage.SEQUENCE_NODE__SUBGROUP :
-				return isSetSubgroups();
-			case UMLPackage.SEQUENCE_NODE__SUPER_GROUP :
-				return isSetSuperGroup();
-			case UMLPackage.SEQUENCE_NODE__EDGE :
-				return !getEdges().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__MUST_ISOLATE :
-				return isMustIsolate() != MUST_ISOLATE_EDEFAULT;
-			case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_INPUT :
-				return !getStructuredNodeInputs().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_OUTPUT :
-				return !getStructuredNodeOutputs().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__VARIABLE :
-				return !getVariables().isEmpty();
-			case UMLPackage.SEQUENCE_NODE__NODE :
-				return isSetNodes();
-			case UMLPackage.SEQUENCE_NODE__EXECUTABLE_NODE :
-				return isSetExecutableNodes();
+		case UMLPackage.SEQUENCE_NODE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.SEQUENCE_NODE__OWNER:
+			return isSetOwner();
+		case UMLPackage.SEQUENCE_NODE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__NAME:
+			return isSetName();
+		case UMLPackage.SEQUENCE_NODE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.SEQUENCE_NODE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.SEQUENCE_NODE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.SEQUENCE_NODE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.SEQUENCE_NODE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.SEQUENCE_NODE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.SEQUENCE_NODE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.SEQUENCE_NODE__ACTIVITY:
+			return isSetActivity();
+		case UMLPackage.SEQUENCE_NODE__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.SEQUENCE_NODE__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.SEQUENCE_NODE__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.SEQUENCE_NODE__INPUT:
+			return isSetInputs();
+		case UMLPackage.SEQUENCE_NODE__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.SEQUENCE_NODE__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.SEQUENCE_NODE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.SEQUENCE_NODE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__MEMBER:
+			return isSetMembers();
+		case UMLPackage.SEQUENCE_NODE__CONTAINED_EDGE:
+			return isSetContainedEdges();
+		case UMLPackage.SEQUENCE_NODE__CONTAINED_NODE:
+			return isSetContainedNodes();
+		case UMLPackage.SEQUENCE_NODE__IN_ACTIVITY:
+			return isSetInActivity();
+		case UMLPackage.SEQUENCE_NODE__SUBGROUP:
+			return isSetSubgroups();
+		case UMLPackage.SEQUENCE_NODE__SUPER_GROUP:
+			return isSetSuperGroup();
+		case UMLPackage.SEQUENCE_NODE__EDGE:
+			return !getEdges().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__MUST_ISOLATE:
+			return isMustIsolate() != MUST_ISOLATE_EDEFAULT;
+		case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_INPUT:
+			return !getStructuredNodeInputs().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__STRUCTURED_NODE_OUTPUT:
+			return !getStructuredNodeOutputs().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__VARIABLE:
+			return !getVariables().isEmpty();
+		case UMLPackage.SEQUENCE_NODE__NODE:
+			return isSetNodes();
+		case UMLPackage.SEQUENCE_NODE__EXECUTABLE_NODE:
+			return isSetExecutableNodes();
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SignalEventImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SignalEventImpl.java
index 3bda623..0839d46 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SignalEventImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SignalEventImpl.java
@@ -1,20 +1,27 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.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.Signal;
 import org.eclipse.uml2.uml.SignalEvent;
@@ -65,9 +72,7 @@
 	 * @generated
 	 */
 	public Signal getSignal() {
-		return (Signal) eDynamicGet(
-			UMLPackage.SIGNAL_EVENT__SIGNAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SIGNAL_EVENT__SIGNAL, true, true);
+		return (Signal) eDynamicGet(UMLPackage.SIGNAL_EVENT__SIGNAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SIGNAL_EVENT__SIGNAL, true, true);
 	}
 
 	/**
@@ -76,9 +81,7 @@
 	 * @generated
 	 */
 	public Signal basicGetSignal() {
-		return (Signal) eDynamicGet(
-			UMLPackage.SIGNAL_EVENT__SIGNAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SIGNAL_EVENT__SIGNAL, false, true);
+		return (Signal) eDynamicGet(UMLPackage.SIGNAL_EVENT__SIGNAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SIGNAL_EVENT__SIGNAL, false, true);
 	}
 
 	/**
@@ -87,8 +90,7 @@
 	 * @generated
 	 */
 	public void setSignal(Signal newSignal) {
-		eDynamicSet(UMLPackage.SIGNAL_EVENT__SIGNAL - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SIGNAL_EVENT__SIGNAL, newSignal);
+		eDynamicSet(UMLPackage.SIGNAL_EVENT__SIGNAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SIGNAL_EVENT__SIGNAL, newSignal);
 	}
 
 	/**
@@ -99,44 +101,44 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.SIGNAL_EVENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.SIGNAL_EVENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.SIGNAL_EVENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.SIGNAL_EVENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.SIGNAL_EVENT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.SIGNAL_EVENT__NAME :
-				return getName();
-			case UMLPackage.SIGNAL_EVENT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.SIGNAL_EVENT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.SIGNAL_EVENT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.SIGNAL_EVENT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.SIGNAL_EVENT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.SIGNAL_EVENT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.SIGNAL_EVENT__SIGNAL :
-				if (resolve)
-					return getSignal();
-				return basicGetSignal();
+		case UMLPackage.SIGNAL_EVENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.SIGNAL_EVENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.SIGNAL_EVENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.SIGNAL_EVENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.SIGNAL_EVENT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.SIGNAL_EVENT__NAME:
+			return getName();
+		case UMLPackage.SIGNAL_EVENT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.SIGNAL_EVENT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.SIGNAL_EVENT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.SIGNAL_EVENT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.SIGNAL_EVENT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.SIGNAL_EVENT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.SIGNAL_EVENT__SIGNAL:
+			if (resolve)
+				return getSignal();
+			return basicGetSignal();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -150,34 +152,32 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.SIGNAL_EVENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.SIGNAL_EVENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.SIGNAL_EVENT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.SIGNAL_EVENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.SIGNAL_EVENT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.SIGNAL_EVENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.SIGNAL_EVENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.SIGNAL_EVENT__SIGNAL :
-				setSignal((Signal) newValue);
-				return;
+		case UMLPackage.SIGNAL_EVENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.SIGNAL_EVENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.SIGNAL_EVENT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.SIGNAL_EVENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.SIGNAL_EVENT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.SIGNAL_EVENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.SIGNAL_EVENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.SIGNAL_EVENT__SIGNAL:
+			setSignal((Signal) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -190,30 +190,30 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.SIGNAL_EVENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.SIGNAL_EVENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.SIGNAL_EVENT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.SIGNAL_EVENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.SIGNAL_EVENT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.SIGNAL_EVENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.SIGNAL_EVENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.SIGNAL_EVENT__SIGNAL :
-				setSignal((Signal) null);
-				return;
+		case UMLPackage.SIGNAL_EVENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.SIGNAL_EVENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.SIGNAL_EVENT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.SIGNAL_EVENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.SIGNAL_EVENT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.SIGNAL_EVENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.SIGNAL_EVENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.SIGNAL_EVENT__SIGNAL:
+			setSignal((Signal) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -226,34 +226,32 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.SIGNAL_EVENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.SIGNAL_EVENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.SIGNAL_EVENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.SIGNAL_EVENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.SIGNAL_EVENT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.SIGNAL_EVENT__NAME :
-				return isSetName();
-			case UMLPackage.SIGNAL_EVENT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.SIGNAL_EVENT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.SIGNAL_EVENT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.SIGNAL_EVENT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.SIGNAL_EVENT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.SIGNAL_EVENT__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.SIGNAL_EVENT__SIGNAL :
-				return basicGetSignal() != null;
+		case UMLPackage.SIGNAL_EVENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.SIGNAL_EVENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.SIGNAL_EVENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.SIGNAL_EVENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.SIGNAL_EVENT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.SIGNAL_EVENT__NAME:
+			return isSetName();
+		case UMLPackage.SIGNAL_EVENT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.SIGNAL_EVENT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.SIGNAL_EVENT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.SIGNAL_EVENT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.SIGNAL_EVENT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.SIGNAL_EVENT__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.SIGNAL_EVENT__SIGNAL:
+			return basicGetSignal() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SignalImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SignalImpl.java
index 78e79a5..a70e4f6 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SignalImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SignalImpl.java
@@ -1,14 +1,15 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey - 286329, 323181
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -27,6 +28,7 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -110,19 +112,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Property> attributes = (EList<Property>) cache.get(eResource,
-				this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
+			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>(
-						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>(Property.class, this,
-			UMLPackage.SIGNAL__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Property>(Property.class, this, UMLPackage.SIGNAL__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
 	}
 
 	/**
@@ -136,20 +132,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.SIGNAL__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.SIGNAL__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.SIGNAL__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.SIGNAL__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -159,9 +148,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Property> getOwnedAttributes() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.SIGNAL__OWNED_ATTRIBUTE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SIGNAL__OWNED_ATTRIBUTE, true, true);
+		return (EList<Property>) eDynamicGet(UMLPackage.SIGNAL__OWNED_ATTRIBUTE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SIGNAL__OWNED_ATTRIBUTE, true, true);
 	}
 
 	/**
@@ -205,20 +192,16 @@
 	 */
 	public Property getOwnedAttribute(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		ownedAttributeLoop : for (Property ownedAttribute : getOwnedAttributes()) {
+		ownedAttributeLoop: for (Property ownedAttribute : getOwnedAttributes()) {
 			if (eClass != null && !eClass.isInstance(ownedAttribute))
 				continue ownedAttributeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedAttribute.getName())
-				: name.equals(ownedAttribute.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedAttribute.getName()) : name.equals(ownedAttribute.getName())))
 				continue ownedAttributeLoop;
 			if (type != null && !type.equals(ownedAttribute.getType()))
 				continue ownedAttributeLoop;
 			return ownedAttribute;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedAttribute(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedAttribute(name, type, eClass) : null;
 	}
 
 	/**
@@ -228,8 +211,7 @@
 	 */
 	public Property createOwnedAttribute(String name, Type type, int lower,
 			int upper) {
-		return SignalOperations.createOwnedAttribute(this, name, type, lower,
-			upper);
+		return SignalOperations.createOwnedAttribute(this, name, type, lower, upper);
 	}
 
 	/**
@@ -241,53 +223,40 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.SIGNAL__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SIGNAL__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SIGNAL__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.SIGNAL__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SIGNAL__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SIGNAL__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.SIGNAL__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.SIGNAL__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SIGNAL__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SIGNAL__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SIGNAL__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SIGNAL__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SIGNAL__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SIGNAL__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.SIGNAL__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SIGNAL__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SIGNAL__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.SIGNAL__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SIGNAL__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SIGNAL__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.SIGNAL__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.SIGNAL__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SIGNAL__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SIGNAL__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SIGNAL__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SIGNAL__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SIGNAL__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SIGNAL__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -300,100 +269,100 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.SIGNAL__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.SIGNAL__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.SIGNAL__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.SIGNAL__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.SIGNAL__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.SIGNAL__NAME :
-				return getName();
-			case UMLPackage.SIGNAL__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.SIGNAL__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.SIGNAL__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.SIGNAL__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.SIGNAL__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.SIGNAL__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.SIGNAL__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.SIGNAL__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.SIGNAL__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.SIGNAL__MEMBER :
-				return getMembers();
-			case UMLPackage.SIGNAL__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.SIGNAL__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.SIGNAL__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.SIGNAL__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.SIGNAL__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.SIGNAL__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.SIGNAL__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.SIGNAL__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.SIGNAL__FEATURE :
-				return getFeatures();
-			case UMLPackage.SIGNAL__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.SIGNAL__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.SIGNAL__GENERAL :
-				return getGenerals();
-			case UMLPackage.SIGNAL__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.SIGNAL__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.SIGNAL__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.SIGNAL__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.SIGNAL__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.SIGNAL__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.SIGNAL__USE_CASE :
-				return getUseCases();
-			case UMLPackage.SIGNAL__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.SIGNAL__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.SIGNAL__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.SIGNAL__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
+		case UMLPackage.SIGNAL__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.SIGNAL__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.SIGNAL__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.SIGNAL__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.SIGNAL__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.SIGNAL__NAME:
+			return getName();
+		case UMLPackage.SIGNAL__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.SIGNAL__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.SIGNAL__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.SIGNAL__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.SIGNAL__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.SIGNAL__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.SIGNAL__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.SIGNAL__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.SIGNAL__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.SIGNAL__MEMBER:
+			return getMembers();
+		case UMLPackage.SIGNAL__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.SIGNAL__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.SIGNAL__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.SIGNAL__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.SIGNAL__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.SIGNAL__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.SIGNAL__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.SIGNAL__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.SIGNAL__FEATURE:
+			return getFeatures();
+		case UMLPackage.SIGNAL__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.SIGNAL__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.SIGNAL__GENERAL:
+			return getGenerals();
+		case UMLPackage.SIGNAL__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.SIGNAL__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.SIGNAL__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.SIGNAL__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.SIGNAL__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.SIGNAL__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.SIGNAL__USE_CASE:
+			return getUseCases();
+		case UMLPackage.SIGNAL__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.SIGNAL__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.SIGNAL__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.SIGNAL__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -407,113 +376,99 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.SIGNAL__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.SIGNAL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.SIGNAL__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.SIGNAL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.SIGNAL__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.SIGNAL__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.SIGNAL__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.SIGNAL__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.SIGNAL__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.SIGNAL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.SIGNAL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.SIGNAL__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.SIGNAL__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.SIGNAL__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.SIGNAL__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.SIGNAL__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.SIGNAL__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.SIGNAL__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.SIGNAL__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.SIGNAL__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.SIGNAL__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.SIGNAL__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.SIGNAL__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.SIGNAL__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.SIGNAL__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.SIGNAL__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
+		case UMLPackage.SIGNAL__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.SIGNAL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.SIGNAL__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.SIGNAL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.SIGNAL__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.SIGNAL__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.SIGNAL__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.SIGNAL__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.SIGNAL__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.SIGNAL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.SIGNAL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.SIGNAL__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.SIGNAL__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.SIGNAL__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.SIGNAL__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.SIGNAL__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.SIGNAL__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.SIGNAL__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.SIGNAL__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.SIGNAL__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.SIGNAL__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.SIGNAL__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.SIGNAL__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.SIGNAL__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.SIGNAL__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.SIGNAL__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -526,84 +481,84 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.SIGNAL__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.SIGNAL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.SIGNAL__NAME :
-				unsetName();
-				return;
-			case UMLPackage.SIGNAL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.SIGNAL__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.SIGNAL__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.SIGNAL__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.SIGNAL__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.SIGNAL__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.SIGNAL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.SIGNAL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.SIGNAL__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.SIGNAL__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.SIGNAL__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.SIGNAL__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.SIGNAL__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.SIGNAL__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.SIGNAL__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.SIGNAL__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.SIGNAL__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.SIGNAL__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.SIGNAL__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.SIGNAL__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.SIGNAL__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.SIGNAL__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.SIGNAL__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
+		case UMLPackage.SIGNAL__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.SIGNAL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.SIGNAL__NAME:
+			unsetName();
+			return;
+		case UMLPackage.SIGNAL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.SIGNAL__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.SIGNAL__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.SIGNAL__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.SIGNAL__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.SIGNAL__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.SIGNAL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.SIGNAL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.SIGNAL__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.SIGNAL__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.SIGNAL__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.SIGNAL__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.SIGNAL__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.SIGNAL__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.SIGNAL__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.SIGNAL__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.SIGNAL__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.SIGNAL__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.SIGNAL__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.SIGNAL__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.SIGNAL__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.SIGNAL__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.SIGNAL__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -616,86 +571,84 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.SIGNAL__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.SIGNAL__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.SIGNAL__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.SIGNAL__OWNER :
-				return isSetOwner();
-			case UMLPackage.SIGNAL__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.SIGNAL__NAME :
-				return isSetName();
-			case UMLPackage.SIGNAL__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.SIGNAL__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.SIGNAL__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.SIGNAL__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.SIGNAL__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.SIGNAL__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.SIGNAL__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.SIGNAL__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.SIGNAL__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.SIGNAL__MEMBER :
-				return isSetMembers();
-			case UMLPackage.SIGNAL__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.SIGNAL__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.SIGNAL__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.SIGNAL__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.SIGNAL__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.SIGNAL__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.SIGNAL__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.SIGNAL__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.SIGNAL__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.SIGNAL__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.SIGNAL__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.SIGNAL__GENERAL :
-				return !getGenerals().isEmpty();
-			case UMLPackage.SIGNAL__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.SIGNAL__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.SIGNAL__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.SIGNAL__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.SIGNAL__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.SIGNAL__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.SIGNAL__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.SIGNAL__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.SIGNAL__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.SIGNAL__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.SIGNAL__OWNED_ATTRIBUTE :
-				return !getOwnedAttributes().isEmpty();
+		case UMLPackage.SIGNAL__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.SIGNAL__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.SIGNAL__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.SIGNAL__OWNER:
+			return isSetOwner();
+		case UMLPackage.SIGNAL__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.SIGNAL__NAME:
+			return isSetName();
+		case UMLPackage.SIGNAL__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.SIGNAL__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.SIGNAL__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.SIGNAL__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.SIGNAL__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.SIGNAL__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.SIGNAL__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.SIGNAL__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.SIGNAL__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.SIGNAL__MEMBER:
+			return isSetMembers();
+		case UMLPackage.SIGNAL__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.SIGNAL__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.SIGNAL__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.SIGNAL__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.SIGNAL__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.SIGNAL__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.SIGNAL__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.SIGNAL__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.SIGNAL__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.SIGNAL__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.SIGNAL__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.SIGNAL__GENERAL:
+			return !getGenerals().isEmpty();
+		case UMLPackage.SIGNAL__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.SIGNAL__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.SIGNAL__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.SIGNAL__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.SIGNAL__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.SIGNAL__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.SIGNAL__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.SIGNAL__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.SIGNAL__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.SIGNAL__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.SIGNAL__OWNED_ATTRIBUTE:
+			return !getOwnedAttributes().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -710,276 +663,219 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.SIGNAL___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.SIGNAL___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.SIGNAL___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.SIGNAL___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.SIGNAL___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.SIGNAL___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.SIGNAL___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.SIGNAL___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.SIGNAL___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.SIGNAL___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.SIGNAL___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.SIGNAL___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.SIGNAL___GET_MODEL :
-				return getModel();
-			case UMLPackage.SIGNAL___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.SIGNAL___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.SIGNAL___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.SIGNAL___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.SIGNAL___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.SIGNAL___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.SIGNAL___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.SIGNAL___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.SIGNAL___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.SIGNAL___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.SIGNAL___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.SIGNAL___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.SIGNAL___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.SIGNAL___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.SIGNAL___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.SIGNAL___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.SIGNAL___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.SIGNAL___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.SIGNAL___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.SIGNAL___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.SIGNAL___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.SIGNAL___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.SIGNAL___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.SIGNAL___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.SIGNAL___GET_LABEL :
-				return getLabel();
-			case UMLPackage.SIGNAL___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.SIGNAL___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.SIGNAL___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.SIGNAL___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.SIGNAL___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.SIGNAL___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.SIGNAL___SEPARATOR :
-				return separator();
-			case UMLPackage.SIGNAL___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.SIGNAL___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.SIGNAL___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.SIGNAL___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.SIGNAL___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.SIGNAL___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.SIGNAL___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.SIGNAL___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.SIGNAL___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.SIGNAL___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.SIGNAL___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.SIGNAL___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.SIGNAL___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.SIGNAL___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.SIGNAL___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.SIGNAL___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.SIGNAL___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.SIGNAL___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.SIGNAL___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.SIGNAL___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.SIGNAL___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.SIGNAL___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.SIGNAL___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.SIGNAL___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.SIGNAL___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.SIGNAL___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.SIGNAL___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.SIGNAL___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.SIGNAL___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.SIGNAL___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.SIGNAL___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.SIGNAL___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.SIGNAL___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.SIGNAL___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.SIGNAL___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.SIGNAL___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.SIGNAL___PARENTS :
-				return parents();
-			case UMLPackage.SIGNAL___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.SIGNAL___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.SIGNAL___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.SIGNAL___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.SIGNAL___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.SIGNAL___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.SIGNAL___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.SIGNAL___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
+		case UMLPackage.SIGNAL___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.SIGNAL___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.SIGNAL___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.SIGNAL___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.SIGNAL___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.SIGNAL___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.SIGNAL___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.SIGNAL___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.SIGNAL___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.SIGNAL___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.SIGNAL___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.SIGNAL___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.SIGNAL___GET_MODEL:
+			return getModel();
+		case UMLPackage.SIGNAL___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.SIGNAL___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.SIGNAL___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.SIGNAL___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.SIGNAL___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.SIGNAL___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.SIGNAL___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.SIGNAL___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.SIGNAL___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.SIGNAL___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.SIGNAL___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.SIGNAL___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.SIGNAL___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.SIGNAL___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.SIGNAL___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.SIGNAL___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.SIGNAL___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.SIGNAL___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.SIGNAL___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.SIGNAL___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.SIGNAL___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.SIGNAL___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.SIGNAL___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.SIGNAL___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.SIGNAL___GET_LABEL:
+			return getLabel();
+		case UMLPackage.SIGNAL___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.SIGNAL___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.SIGNAL___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.SIGNAL___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.SIGNAL___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.SIGNAL___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.SIGNAL___SEPARATOR:
+			return separator();
+		case UMLPackage.SIGNAL___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.SIGNAL___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.SIGNAL___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.SIGNAL___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.SIGNAL___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.SIGNAL___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.SIGNAL___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.SIGNAL___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.SIGNAL___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.SIGNAL___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.SIGNAL___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.SIGNAL___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.SIGNAL___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.SIGNAL___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.SIGNAL___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.SIGNAL___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.SIGNAL___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.SIGNAL___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.SIGNAL___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.SIGNAL___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.SIGNAL___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.SIGNAL___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.SIGNAL___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.SIGNAL___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.SIGNAL___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.SIGNAL___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.SIGNAL___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.SIGNAL___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.SIGNAL___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.SIGNAL___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.SIGNAL___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.SIGNAL___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.SIGNAL___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.SIGNAL___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.SIGNAL___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.SIGNAL___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.SIGNAL___PARENTS:
+			return parents();
+		case UMLPackage.SIGNAL___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.SIGNAL___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.SIGNAL___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.SIGNAL___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.SIGNAL___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.SIGNAL___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.SIGNAL___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.SIGNAL___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -992,7 +888,7 @@
 	@Override
 	public boolean isSetAttributes() {
 		return super.isSetAttributes()
-			|| eIsSet(UMLPackage.SIGNAL__OWNED_ATTRIBUTE);
+				|| eIsSet(UMLPackage.SIGNAL__OWNED_ATTRIBUTE);
 	}
 
 	/**
@@ -1003,8 +899,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] ATTRIBUTE_ESUBSETS = new int[]{
-		UMLPackage.SIGNAL__OWNED_ATTRIBUTE};
+	protected static final int[] ATTRIBUTE_ESUBSETS = new int[] { UMLPackage.SIGNAL__OWNED_ATTRIBUTE };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedMembers() <em>Owned Member</em>}' reference list.
@@ -1014,9 +909,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.SIGNAL__OWNED_RULE, UMLPackage.SIGNAL__OWNED_USE_CASE,
-		UMLPackage.SIGNAL__OWNED_ATTRIBUTE};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.SIGNAL__OWNED_RULE, UMLPackage.SIGNAL__OWNED_USE_CASE, UMLPackage.SIGNAL__OWNED_ATTRIBUTE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1026,7 +919,7 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.SIGNAL__OWNED_ATTRIBUTE);
+				|| eIsSet(UMLPackage.SIGNAL__OWNED_ATTRIBUTE);
 	}
 
 } //SignalImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SlotImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SlotImpl.java
index f73619b..b66822c 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SlotImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SlotImpl.java
@@ -1,18 +1,20 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -21,8 +23,12 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -88,19 +94,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.SLOT__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.SLOT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.SLOT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.SLOT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -109,9 +109,7 @@
 	 * @generated
 	 */
 	public InstanceSpecification getOwningInstance() {
-		return (InstanceSpecification) eDynamicGet(
-			UMLPackage.SLOT__OWNING_INSTANCE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SLOT__OWNING_INSTANCE, true, true);
+		return (InstanceSpecification) eDynamicGet(UMLPackage.SLOT__OWNING_INSTANCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SLOT__OWNING_INSTANCE, true, true);
 	}
 
 	/**
@@ -120,9 +118,7 @@
 	 * @generated
 	 */
 	public InstanceSpecification basicGetOwningInstance() {
-		return (InstanceSpecification) eDynamicGet(
-			UMLPackage.SLOT__OWNING_INSTANCE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SLOT__OWNING_INSTANCE, false, true);
+		return (InstanceSpecification) eDynamicGet(UMLPackage.SLOT__OWNING_INSTANCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SLOT__OWNING_INSTANCE, false, true);
 	}
 
 	/**
@@ -132,8 +128,7 @@
 	 */
 	public NotificationChain basicSetOwningInstance(
 			InstanceSpecification newOwningInstance, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newOwningInstance,
-			UMLPackage.SLOT__OWNING_INSTANCE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newOwningInstance, UMLPackage.SLOT__OWNING_INSTANCE, msgs);
 		return msgs;
 	}
 
@@ -143,8 +138,7 @@
 	 * @generated
 	 */
 	public void setOwningInstance(InstanceSpecification newOwningInstance) {
-		eDynamicSet(UMLPackage.SLOT__OWNING_INSTANCE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SLOT__OWNING_INSTANCE, newOwningInstance);
+		eDynamicSet(UMLPackage.SLOT__OWNING_INSTANCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SLOT__OWNING_INSTANCE, newOwningInstance);
 	}
 
 	/**
@@ -153,9 +147,7 @@
 	 * @generated
 	 */
 	public StructuralFeature getDefiningFeature() {
-		return (StructuralFeature) eDynamicGet(
-			UMLPackage.SLOT__DEFINING_FEATURE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SLOT__DEFINING_FEATURE, true, true);
+		return (StructuralFeature) eDynamicGet(UMLPackage.SLOT__DEFINING_FEATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SLOT__DEFINING_FEATURE, true, true);
 	}
 
 	/**
@@ -164,9 +156,7 @@
 	 * @generated
 	 */
 	public StructuralFeature basicGetDefiningFeature() {
-		return (StructuralFeature) eDynamicGet(
-			UMLPackage.SLOT__DEFINING_FEATURE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SLOT__DEFINING_FEATURE, false, true);
+		return (StructuralFeature) eDynamicGet(UMLPackage.SLOT__DEFINING_FEATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SLOT__DEFINING_FEATURE, false, true);
 	}
 
 	/**
@@ -175,8 +165,7 @@
 	 * @generated
 	 */
 	public void setDefiningFeature(StructuralFeature newDefiningFeature) {
-		eDynamicSet(UMLPackage.SLOT__DEFINING_FEATURE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SLOT__DEFINING_FEATURE, newDefiningFeature);
+		eDynamicSet(UMLPackage.SLOT__DEFINING_FEATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SLOT__DEFINING_FEATURE, newDefiningFeature);
 	}
 
 	/**
@@ -186,9 +175,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ValueSpecification> getValues() {
-		return (EList<ValueSpecification>) eDynamicGet(
-			UMLPackage.SLOT__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SLOT__VALUE, true, true);
+		return (EList<ValueSpecification>) eDynamicGet(UMLPackage.SLOT__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SLOT__VALUE, true, true);
 	}
 
 	/**
@@ -223,20 +210,16 @@
 	 */
 	public ValueSpecification getValue(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		valueLoop : for (ValueSpecification value : getValues()) {
+		valueLoop: for (ValueSpecification value : getValues()) {
 			if (eClass != null && !eClass.isInstance(value))
 				continue valueLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(value.getName())
-				: name.equals(value.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(value.getName()) : name.equals(value.getName())))
 				continue valueLoop;
 			if (type != null && !type.equals(value.getType()))
 				continue valueLoop;
 			return value;
 		}
-		return createOnDemand && eClass != null
-			? createValue(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createValue(name, type, eClass) : null;
 	}
 
 	/**
@@ -249,14 +232,12 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.SLOT__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.SLOT__OWNING_INSTANCE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningInstance((InstanceSpecification) otherEnd,
-					msgs);
+		case UMLPackage.SLOT__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.SLOT__OWNING_INSTANCE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningInstance((InstanceSpecification) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -270,17 +251,14 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.SLOT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SLOT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SLOT__VALUE :
-				return ((InternalEList<?>) getValues()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.SLOT__OWNING_INSTANCE :
-				return basicSetOwningInstance(null, msgs);
+		case UMLPackage.SLOT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SLOT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SLOT__VALUE:
+			return ((InternalEList<?>) getValues()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SLOT__OWNING_INSTANCE:
+			return basicSetOwningInstance(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -294,10 +272,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.SLOT__OWNING_INSTANCE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.INSTANCE_SPECIFICATION__SLOT,
-					InstanceSpecification.class, msgs);
+		case UMLPackage.SLOT__OWNING_INSTANCE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.INSTANCE_SPECIFICATION__SLOT, InstanceSpecification.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -310,26 +286,26 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.SLOT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.SLOT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.SLOT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.SLOT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.SLOT__DEFINING_FEATURE :
-				if (resolve)
-					return getDefiningFeature();
-				return basicGetDefiningFeature();
-			case UMLPackage.SLOT__VALUE :
-				return getValues();
-			case UMLPackage.SLOT__OWNING_INSTANCE :
-				if (resolve)
-					return getOwningInstance();
-				return basicGetOwningInstance();
+		case UMLPackage.SLOT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.SLOT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.SLOT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.SLOT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.SLOT__DEFINING_FEATURE:
+			if (resolve)
+				return getDefiningFeature();
+			return basicGetDefiningFeature();
+		case UMLPackage.SLOT__VALUE:
+			return getValues();
+		case UMLPackage.SLOT__OWNING_INSTANCE:
+			if (resolve)
+				return getOwningInstance();
+			return basicGetOwningInstance();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -343,27 +319,24 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.SLOT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.SLOT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				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<? extends ValueSpecification>) newValue);
-				return;
-			case UMLPackage.SLOT__OWNING_INSTANCE :
-				setOwningInstance((InstanceSpecification) newValue);
-				return;
+		case UMLPackage.SLOT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.SLOT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			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<? extends ValueSpecification>) newValue);
+			return;
+		case UMLPackage.SLOT__OWNING_INSTANCE:
+			setOwningInstance((InstanceSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -376,21 +349,21 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.SLOT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.SLOT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.SLOT__DEFINING_FEATURE :
-				setDefiningFeature((StructuralFeature) null);
-				return;
-			case UMLPackage.SLOT__VALUE :
-				getValues().clear();
-				return;
-			case UMLPackage.SLOT__OWNING_INSTANCE :
-				setOwningInstance((InstanceSpecification) null);
-				return;
+		case UMLPackage.SLOT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.SLOT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.SLOT__DEFINING_FEATURE:
+			setDefiningFeature((StructuralFeature) null);
+			return;
+		case UMLPackage.SLOT__VALUE:
+			getValues().clear();
+			return;
+		case UMLPackage.SLOT__OWNING_INSTANCE:
+			setOwningInstance((InstanceSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -403,20 +376,20 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.SLOT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.SLOT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.SLOT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.SLOT__OWNER :
-				return isSetOwner();
-			case UMLPackage.SLOT__DEFINING_FEATURE :
-				return basicGetDefiningFeature() != null;
-			case UMLPackage.SLOT__VALUE :
-				return !getValues().isEmpty();
-			case UMLPackage.SLOT__OWNING_INSTANCE :
-				return basicGetOwningInstance() != null;
+		case UMLPackage.SLOT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.SLOT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.SLOT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.SLOT__OWNER:
+			return isSetOwner();
+		case UMLPackage.SLOT__DEFINING_FEATURE:
+			return basicGetDefiningFeature() != null;
+		case UMLPackage.SLOT__VALUE:
+			return !getValues().isEmpty();
+		case UMLPackage.SLOT__OWNING_INSTANCE:
+			return basicGetOwningInstance() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -429,8 +402,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.SLOT__OWNED_COMMENT, UMLPackage.SLOT__VALUE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.SLOT__OWNED_COMMENT, UMLPackage.SLOT__VALUE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -440,9 +412,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -466,7 +436,8 @@
 	 */
 	@Override
 	public boolean isSetOwner() {
-		return super.isSetOwner() || eIsSet(UMLPackage.SLOT__OWNING_INSTANCE);
+		return super.isSetOwner()
+				|| eIsSet(UMLPackage.SLOT__OWNING_INSTANCE);
 	}
 
 	/**
@@ -476,7 +447,8 @@
 	 */
 	@Override
 	public boolean isSetOwnedElements() {
-		return super.isSetOwnedElements() || eIsSet(UMLPackage.SLOT__VALUE);
+		return super.isSetOwnedElements()
+				|| eIsSet(UMLPackage.SLOT__VALUE);
 	}
 
 } //SlotImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StartClassifierBehaviorActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StartClassifierBehaviorActionImpl.java
index 0479954..88b1ce5 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StartClassifierBehaviorActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StartClassifierBehaviorActionImpl.java
@@ -1,13 +1,13 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -104,19 +107,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -125,11 +122,7 @@
 	 * @generated
 	 */
 	public InputPin getObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT, true,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT, true, true);
 	}
 
 	/**
@@ -138,11 +131,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT, false,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT, false, true);
 	}
 
 	/**
@@ -152,8 +141,7 @@
 	 */
 	public NotificationChain basicSetObject(InputPin newObject,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newObject,
-			UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newObject, UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT, msgs);
 		return msgs;
 	}
 
@@ -163,11 +151,7 @@
 	 * @generated
 	 */
 	public void setObject(InputPin newObject) {
-		eDynamicSet(
-			UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT,
-			newObject);
+		eDynamicSet(UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT, newObject);
 	}
 
 	/**
@@ -201,8 +185,7 @@
 	 */
 	public boolean validateMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StartClassifierBehaviorActionOperations
-			.validateMultiplicity(this, diagnostics, context);
+		return StartClassifierBehaviorActionOperations.validateMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -212,8 +195,7 @@
 	 */
 	public boolean validateTypeHasClassifier(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StartClassifierBehaviorActionOperations
-			.validateTypeHasClassifier(this, diagnostics, context);
+		return StartClassifierBehaviorActionOperations.validateTypeHasClassifier(this, diagnostics, context);
 	}
 
 	/**
@@ -225,39 +207,30 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT :
-				return basicSetObject(null, msgs);
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT:
+			return basicSetObject(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -270,78 +243,78 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME :
-				return getName();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT :
-				if (resolve)
-					return getObject();
-				return basicGetObject();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME:
+			return getName();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT:
+			if (resolve)
+				return getObject();
+			return basicGetObject();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -355,80 +328,70 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT :
-				setObject((InputPin) newValue);
-				return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT:
+			setObject((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -441,60 +404,60 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT :
-				setObject((InputPin) null);
-				return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT:
+			setObject((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -507,66 +470,64 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT :
-				return basicGetObject() != null;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT:
+			return basicGetObject() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -581,159 +542,134 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_TYPE_HAS_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateTypeHasClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION___VALIDATE_TYPE_HAS_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateTypeHasClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -746,8 +682,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -757,7 +692,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT);
+				|| eIsSet(UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION__OBJECT);
 	}
 
 } //StartClassifierBehaviorActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StartObjectBehaviorActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StartObjectBehaviorActionImpl.java
index 4a1d627..8a44bfb 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StartObjectBehaviorActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StartObjectBehaviorActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2008, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2008, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -26,6 +27,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -107,19 +110,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -130,9 +127,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ARGUMENT,
-		UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ARGUMENT, UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -140,11 +135,7 @@
 	 * @generated
 	 */
 	public InputPin getObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.START_OBJECT_BEHAVIOR_ACTION__OBJECT, true,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.START_OBJECT_BEHAVIOR_ACTION__OBJECT, true, true);
 	}
 
 	/**
@@ -153,11 +144,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.START_OBJECT_BEHAVIOR_ACTION__OBJECT, false,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.START_OBJECT_BEHAVIOR_ACTION__OBJECT, false, true);
 	}
 
 	/**
@@ -167,8 +154,7 @@
 	 */
 	public NotificationChain basicSetObject(InputPin newObject,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newObject,
-			UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newObject, UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT, msgs);
 		return msgs;
 	}
 
@@ -178,11 +164,7 @@
 	 * @generated
 	 */
 	public void setObject(InputPin newObject) {
-		eDynamicSet(
-			UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.START_OBJECT_BEHAVIOR_ACTION__OBJECT,
-			newObject);
+		eDynamicSet(UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.START_OBJECT_BEHAVIOR_ACTION__OBJECT, newObject);
 	}
 
 	/**
@@ -216,8 +198,7 @@
 	 */
 	public boolean validateTypeOfObject(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StartObjectBehaviorActionOperations.validateTypeOfObject(this,
-			diagnostics, context);
+		return StartObjectBehaviorActionOperations.validateTypeOfObject(this, diagnostics, context);
 	}
 
 	/**
@@ -227,8 +208,7 @@
 	 */
 	public boolean validateNoOnport(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StartObjectBehaviorActionOperations.validateNoOnport(this,
-			diagnostics, context);
+		return StartObjectBehaviorActionOperations.validateNoOnport(this, diagnostics, context);
 	}
 
 	/**
@@ -250,13 +230,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Parameter> result = (EList<Parameter>) cache.get(this,
-				UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS);
+			EList<Parameter> result = (EList<Parameter>) cache.get(this, UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS,
-					result = StartObjectBehaviorActionOperations
-						.outputParameters(this));
+				cache.put(this, UMLPackage.Literals.CALL_ACTION___OUTPUT_PARAMETERS, result = StartObjectBehaviorActionOperations.outputParameters(this));
 			}
 			return result;
 		}
@@ -273,13 +249,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Parameter> result = (EList<Parameter>) cache.get(this,
-				UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS);
+			EList<Parameter> result = (EList<Parameter>) cache.get(this, UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS,
-					result = StartObjectBehaviorActionOperations
-						.inputParameters(this));
+				cache.put(this, UMLPackage.Literals.CALL_ACTION___INPUT_PARAMETERS, result = StartObjectBehaviorActionOperations.inputParameters(this));
 			}
 			return result;
 		}
@@ -293,8 +265,7 @@
 	 */
 	public boolean validateMultiplicityOfObject(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StartObjectBehaviorActionOperations
-			.validateMultiplicityOfObject(this, diagnostics, context);
+		return StartObjectBehaviorActionOperations.validateMultiplicityOfObject(this, diagnostics, context);
 	}
 
 	/**
@@ -306,45 +277,34 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ARGUMENT :
-				return ((InternalEList<?>) getArguments()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__RESULT :
-				return ((InternalEList<?>) getResults()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT :
-				return basicSetObject(null, msgs);
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ARGUMENT:
+			return ((InternalEList<?>) getArguments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__RESULT:
+			return ((InternalEList<?>) getResults()).basicRemove(otherEnd, msgs);
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT:
+			return basicSetObject(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -357,88 +317,88 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME :
-				return getName();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ARGUMENT :
-				return getArguments();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ON_PORT :
-				if (resolve)
-					return getOnPort();
-				return basicGetOnPort();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_SYNCHRONOUS :
-				return isSynchronous();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__RESULT :
-				return getResults();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT :
-				if (resolve)
-					return getObject();
-				return basicGetObject();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME:
+			return getName();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ARGUMENT:
+			return getArguments();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ON_PORT:
+			if (resolve)
+				return getOnPort();
+			return basicGetOnPort();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_SYNCHRONOUS:
+			return isSynchronous();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__RESULT:
+			return getResults();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT:
+			if (resolve)
+				return getObject();
+			return basicGetObject();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -452,95 +412,84 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ARGUMENT :
-				getArguments().clear();
-				getArguments()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ON_PORT :
-				setOnPort((Port) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_SYNCHRONOUS :
-				setIsSynchronous((Boolean) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__RESULT :
-				getResults().clear();
-				getResults().addAll((Collection<? extends OutputPin>) newValue);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT :
-				setObject((InputPin) newValue);
-				return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ARGUMENT:
+			getArguments().clear();
+			getArguments().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ON_PORT:
+			setOnPort((Port) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_SYNCHRONOUS:
+			setIsSynchronous((Boolean) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__RESULT:
+			getResults().clear();
+			getResults().addAll((Collection<? extends OutputPin>) newValue);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT:
+			setObject((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -553,72 +502,72 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ARGUMENT :
-				getArguments().clear();
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ON_PORT :
-				setOnPort((Port) null);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_SYNCHRONOUS :
-				setIsSynchronous(IS_SYNCHRONOUS_EDEFAULT);
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__RESULT :
-				getResults().clear();
-				return;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT :
-				setObject((InputPin) null);
-				return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ARGUMENT:
+			getArguments().clear();
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ON_PORT:
+			setOnPort((Port) null);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_SYNCHRONOUS:
+			setIsSynchronous(IS_SYNCHRONOUS_EDEFAULT);
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__RESULT:
+			getResults().clear();
+			return;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT:
+			setObject((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -631,74 +580,72 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ARGUMENT :
-				return !getArguments().isEmpty();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ON_PORT :
-				return basicGetOnPort() != null;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_SYNCHRONOUS :
-				return isSynchronous() != IS_SYNCHRONOUS_EDEFAULT;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__RESULT :
-				return !getResults().isEmpty();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT :
-				return basicGetObject() != null;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ARGUMENT:
+			return !getArguments().isEmpty();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__ON_PORT:
+			return basicGetOnPort() != null;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__IS_SYNCHRONOUS:
+			return isSynchronous() != IS_SYNCHRONOUS_EDEFAULT;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__RESULT:
+			return !getResults().isEmpty();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT:
+			return basicGetObject() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -713,178 +660,148 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_ARGUMENT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateArgumentPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_RESULT_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateResultPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_SYNCHRONOUS_CALL__DIAGNOSTICCHAIN_MAP :
-				return validateSynchronousCall(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___INPUT_PARAMETERS :
-				return inputParameters();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___OUTPUT_PARAMETERS :
-				return outputParameters();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_MULTIPLICITY_OF_OBJECT__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfObject(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_TYPE_OF_OBJECT__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfObject((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_NO_ONPORT__DIAGNOSTICCHAIN_MAP :
-				return validateNoOnport((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___BEHAVIOR :
-				return behavior();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_ARGUMENT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateArgumentPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_RESULT_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateResultPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_SYNCHRONOUS_CALL__DIAGNOSTICCHAIN_MAP:
+			return validateSynchronousCall((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___INPUT_PARAMETERS:
+			return inputParameters();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___OUTPUT_PARAMETERS:
+			return outputParameters();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_MULTIPLICITY_OF_OBJECT__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfObject((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_TYPE_OF_OBJECT__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfObject((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___VALIDATE_NO_ONPORT__DIAGNOSTICCHAIN_MAP:
+			return validateNoOnport((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION___BEHAVIOR:
+			return behavior();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -897,7 +814,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT);
+				|| eIsSet(UMLPackage.START_OBJECT_BEHAVIOR_ACTION__OBJECT);
 	}
 
 } //StartObjectBehaviorActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StateImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StateImpl.java
index dcc8be1..26848b5 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StateImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StateImpl.java
@@ -1,38 +1,52 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
+
 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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.EcoreEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectContainmentWithInverseEList;
+
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.Comment;
@@ -56,6 +70,7 @@
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.Vertex;
 import org.eclipse.uml2.uml.VisibilityKind;
+
 import org.eclipse.uml2.uml.internal.operations.RedefinableElementOperations;
 import org.eclipse.uml2.uml.internal.operations.StateOperations;
 import org.eclipse.uml2.uml.internal.operations.VertexOperations;
@@ -169,17 +184,9 @@
 		return UMLPackage.Literals.STATE;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.NAMESPACE__OWNED_RULE) {
 			return createOwnedRulesList();
 		}
@@ -197,22 +204,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			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>(
-						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>(
-			RedefinableElement.class, this, UMLPackage.STATE__REDEFINED_ELEMENT,
-			REDEFINED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<RedefinableElement>(RedefinableElement.class, this, UMLPackage.STATE__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -226,19 +225,19 @@
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
 			EList<Classifier> result = (EList<Classifier>) cache.get(this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
 
 			if (result == null) {
 				Classifier redefinitionContext = redefinitionContext();
 				List<Classifier> redefinitionContexts = redefinitionContext == null
-					? Collections.<Classifier> emptyList()
-					: Collections.singletonList(redefinitionContext);
+						? Collections.<Classifier> emptyList()
+						: Collections.singletonList(redefinitionContext);
 				cache.put(this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-					result = new EcoreEList.UnmodifiableEList<Classifier>(this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						redefinitionContexts.size(),
-						redefinitionContexts.toArray()));
+						result = new EcoreEList.UnmodifiableEList<Classifier>(this,
+								UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
+								redefinitionContexts.size(),
+								redefinitionContexts.toArray()));
 			}
 
 			return result;
@@ -246,11 +245,11 @@
 
 		Classifier redefinitionContext = redefinitionContext();
 		List<Classifier> redefinitionContexts = redefinitionContext == null
-			? Collections.<Classifier> emptyList()
-			: Collections.singletonList(redefinitionContext);
+				? Collections.<Classifier> emptyList()
+				: Collections.singletonList(redefinitionContext);
 		return new EcoreEList.UnmodifiableEList<Classifier>(this,
-			UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-			redefinitionContexts.size(), redefinitionContexts.toArray());
+				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
+				redefinitionContexts.size(), redefinitionContexts.toArray());
 	}
 
 	/**
@@ -269,12 +268,10 @@
 	 */
 	public Classifier getRedefinitionContext(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinitionContextLoop : for (Classifier redefinitionContext : getRedefinitionContexts()) {
+		redefinitionContextLoop: for (Classifier redefinitionContext : getRedefinitionContexts()) {
 			if (eClass != null && !eClass.isInstance(redefinitionContext))
 				continue redefinitionContextLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinitionContext.getName())
-				: name.equals(redefinitionContext.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinitionContext.getName()) : name.equals(redefinitionContext.getName())))
 				continue redefinitionContextLoop;
 			return redefinitionContext;
 		}
@@ -296,9 +293,7 @@
 	 * @generated
 	 */
 	public boolean isLeaf() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.STATE__IS_LEAF - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.STATE__IS_LEAF - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, true, true);
 	}
 
 	/**
@@ -307,8 +302,7 @@
 	 * @generated
 	 */
 	public void setIsLeaf(boolean newIsLeaf) {
-		eDynamicSet(UMLPackage.STATE__IS_LEAF - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, newIsLeaf);
+		eDynamicSet(UMLPackage.STATE__IS_LEAF - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, newIsLeaf);
 	}
 
 	/**
@@ -319,9 +313,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -349,12 +341,10 @@
 	 */
 	public Transition getOutgoing(String name, boolean ignoreCase,
 			EClass eClass) {
-		outgoingLoop : for (Transition outgoing : getOutgoings()) {
+		outgoingLoop: for (Transition outgoing : getOutgoings()) {
 			if (eClass != null && !eClass.isInstance(outgoing))
 				continue outgoingLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(outgoing.getName())
-				: name.equals(outgoing.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(outgoing.getName()) : name.equals(outgoing.getName())))
 				continue outgoingLoop;
 			return outgoing;
 		}
@@ -386,12 +376,10 @@
 	 */
 	public Transition getIncoming(String name, boolean ignoreCase,
 			EClass eClass) {
-		incomingLoop : for (Transition incoming : getIncomings()) {
+		incomingLoop: for (Transition incoming : getIncomings()) {
 			if (eClass != null && !eClass.isInstance(incoming))
 				continue incomingLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(incoming.getName())
-				: name.equals(incoming.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(incoming.getName()) : name.equals(incoming.getName())))
 				continue incomingLoop;
 			return incoming;
 		}
@@ -404,9 +392,7 @@
 	 * @generated
 	 */
 	public Region getContainer() {
-		return (Region) eDynamicGet(
-			UMLPackage.STATE__CONTAINER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VERTEX__CONTAINER, true, true);
+		return (Region) eDynamicGet(UMLPackage.STATE__CONTAINER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VERTEX__CONTAINER, true, true);
 	}
 
 	/**
@@ -415,9 +401,7 @@
 	 * @generated
 	 */
 	public Region basicGetContainer() {
-		return (Region) eDynamicGet(
-			UMLPackage.STATE__CONTAINER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VERTEX__CONTAINER, false, true);
+		return (Region) eDynamicGet(UMLPackage.STATE__CONTAINER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VERTEX__CONTAINER, false, true);
 	}
 
 	/**
@@ -427,8 +411,7 @@
 	 */
 	public NotificationChain basicSetContainer(Region newContainer,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newContainer,
-			UMLPackage.STATE__CONTAINER, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newContainer, UMLPackage.STATE__CONTAINER, msgs);
 		return msgs;
 	}
 
@@ -438,8 +421,7 @@
 	 * @generated
 	 */
 	public void setContainer(Region newContainer) {
-		eDynamicSet(UMLPackage.STATE__CONTAINER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VERTEX__CONTAINER, newContainer);
+		eDynamicSet(UMLPackage.STATE__CONTAINER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VERTEX__CONTAINER, newContainer);
 	}
 
 	/**
@@ -453,19 +435,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.STATE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.STATE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.STATE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.STATE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -479,19 +455,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.STATE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.STATE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.STATE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.STATE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -536,9 +506,7 @@
 	 * @generated
 	 */
 	public StateMachine getSubmachine() {
-		return (StateMachine) eDynamicGet(
-			UMLPackage.STATE__SUBMACHINE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__SUBMACHINE, true, true);
+		return (StateMachine) eDynamicGet(UMLPackage.STATE__SUBMACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__SUBMACHINE, true, true);
 	}
 
 	/**
@@ -547,9 +515,7 @@
 	 * @generated
 	 */
 	public StateMachine basicGetSubmachine() {
-		return (StateMachine) eDynamicGet(
-			UMLPackage.STATE__SUBMACHINE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__SUBMACHINE, false, true);
+		return (StateMachine) eDynamicGet(UMLPackage.STATE__SUBMACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__SUBMACHINE, false, true);
 	}
 
 	/**
@@ -559,8 +525,7 @@
 	 */
 	public NotificationChain basicSetSubmachine(StateMachine newSubmachine,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newSubmachine,
-			UMLPackage.STATE__SUBMACHINE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newSubmachine, UMLPackage.STATE__SUBMACHINE, msgs);
 		return msgs;
 	}
 
@@ -570,8 +535,7 @@
 	 * @generated
 	 */
 	public void setSubmachine(StateMachine newSubmachine) {
-		eDynamicSet(UMLPackage.STATE__SUBMACHINE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__SUBMACHINE, newSubmachine);
+		eDynamicSet(UMLPackage.STATE__SUBMACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__SUBMACHINE, newSubmachine);
 	}
 
 	/**
@@ -581,9 +545,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ConnectionPointReference> getConnections() {
-		return (EList<ConnectionPointReference>) eDynamicGet(
-			UMLPackage.STATE__CONNECTION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__CONNECTION, true, true);
+		return (EList<ConnectionPointReference>) eDynamicGet(UMLPackage.STATE__CONNECTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__CONNECTION, true, true);
 	}
 
 	/**
@@ -592,8 +554,7 @@
 	 * @generated
 	 */
 	public ConnectionPointReference createConnection(String name) {
-		ConnectionPointReference newConnection = (ConnectionPointReference) create(
-			UMLPackage.Literals.CONNECTION_POINT_REFERENCE);
+		ConnectionPointReference newConnection = (ConnectionPointReference) create(UMLPackage.Literals.CONNECTION_POINT_REFERENCE);
 		getConnections().add(newConnection);
 		if (name != null)
 			newConnection.setName(name);
@@ -616,16 +577,12 @@
 	 */
 	public ConnectionPointReference getConnection(String name,
 			boolean ignoreCase, boolean createOnDemand) {
-		connectionLoop : for (ConnectionPointReference connection : getConnections()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(connection.getName())
-				: name.equals(connection.getName())))
+		connectionLoop: for (ConnectionPointReference connection : getConnections()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(connection.getName()) : name.equals(connection.getName())))
 				continue connectionLoop;
 			return connection;
 		}
-		return createOnDemand
-			? createConnection(name)
-			: null;
+		return createOnDemand ? createConnection(name) : null;
 	}
 
 	/**
@@ -635,9 +592,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Pseudostate> getConnectionPoints() {
-		return (EList<Pseudostate>) eDynamicGet(
-			UMLPackage.STATE__CONNECTION_POINT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__CONNECTION_POINT, true, true);
+		return (EList<Pseudostate>) eDynamicGet(UMLPackage.STATE__CONNECTION_POINT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__CONNECTION_POINT, true, true);
 	}
 
 	/**
@@ -646,8 +601,7 @@
 	 * @generated
 	 */
 	public Pseudostate createConnectionPoint(String name) {
-		Pseudostate newConnectionPoint = (Pseudostate) create(
-			UMLPackage.Literals.PSEUDOSTATE);
+		Pseudostate newConnectionPoint = (Pseudostate) create(UMLPackage.Literals.PSEUDOSTATE);
 		getConnectionPoints().add(newConnectionPoint);
 		if (name != null)
 			newConnectionPoint.setName(name);
@@ -670,16 +624,12 @@
 	 */
 	public Pseudostate getConnectionPoint(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		connectionPointLoop : for (Pseudostate connectionPoint : getConnectionPoints()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(connectionPoint.getName())
-				: name.equals(connectionPoint.getName())))
+		connectionPointLoop: for (Pseudostate connectionPoint : getConnectionPoints()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(connectionPoint.getName()) : name.equals(connectionPoint.getName())))
 				continue connectionPointLoop;
 			return connectionPoint;
 		}
-		return createOnDemand
-			? createConnectionPoint(name)
-			: null;
+		return createOnDemand ? createConnectionPoint(name) : null;
 	}
 
 	/**
@@ -688,9 +638,7 @@
 	 * @generated
 	 */
 	public State getRedefinedState() {
-		return (State) eDynamicGet(
-			UMLPackage.STATE__REDEFINED_STATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__REDEFINED_STATE, true, true);
+		return (State) eDynamicGet(UMLPackage.STATE__REDEFINED_STATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__REDEFINED_STATE, true, true);
 	}
 
 	/**
@@ -699,9 +647,7 @@
 	 * @generated
 	 */
 	public State basicGetRedefinedState() {
-		return (State) eDynamicGet(
-			UMLPackage.STATE__REDEFINED_STATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__REDEFINED_STATE, false, true);
+		return (State) eDynamicGet(UMLPackage.STATE__REDEFINED_STATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__REDEFINED_STATE, false, true);
 	}
 
 	/**
@@ -710,8 +656,7 @@
 	 * @generated
 	 */
 	public void setRedefinedState(State newRedefinedState) {
-		eDynamicSet(UMLPackage.STATE__REDEFINED_STATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__REDEFINED_STATE, newRedefinedState);
+		eDynamicSet(UMLPackage.STATE__REDEFINED_STATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__REDEFINED_STATE, newRedefinedState);
 	}
 
 	/**
@@ -720,9 +665,7 @@
 	 * @generated
 	 */
 	public Constraint getStateInvariant() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.STATE__STATE_INVARIANT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__STATE_INVARIANT, true, true);
+		return (Constraint) eDynamicGet(UMLPackage.STATE__STATE_INVARIANT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__STATE_INVARIANT, true, true);
 	}
 
 	/**
@@ -731,9 +674,7 @@
 	 * @generated
 	 */
 	public Constraint basicGetStateInvariant() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.STATE__STATE_INVARIANT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__STATE_INVARIANT, false, true);
+		return (Constraint) eDynamicGet(UMLPackage.STATE__STATE_INVARIANT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__STATE_INVARIANT, false, true);
 	}
 
 	/**
@@ -742,8 +683,7 @@
 	 * @generated
 	 */
 	public void setStateInvariant(Constraint newStateInvariant) {
-		eDynamicSet(UMLPackage.STATE__STATE_INVARIANT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__STATE_INVARIANT, newStateInvariant);
+		eDynamicSet(UMLPackage.STATE__STATE_INVARIANT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__STATE_INVARIANT, newStateInvariant);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newStateInvariant != null) {
@@ -783,9 +723,7 @@
 	 * @generated
 	 */
 	public Behavior getEntry() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.STATE__ENTRY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__ENTRY, true, true);
+		return (Behavior) eDynamicGet(UMLPackage.STATE__ENTRY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__ENTRY, true, true);
 	}
 
 	/**
@@ -794,9 +732,7 @@
 	 * @generated
 	 */
 	public Behavior basicGetEntry() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.STATE__ENTRY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__ENTRY, false, true);
+		return (Behavior) eDynamicGet(UMLPackage.STATE__ENTRY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__ENTRY, false, true);
 	}
 
 	/**
@@ -806,8 +742,7 @@
 	 */
 	public NotificationChain basicSetEntry(Behavior newEntry,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newEntry,
-			UMLPackage.STATE__ENTRY, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newEntry, UMLPackage.STATE__ENTRY, msgs);
 		return msgs;
 	}
 
@@ -817,8 +752,7 @@
 	 * @generated
 	 */
 	public void setEntry(Behavior newEntry) {
-		eDynamicSet(UMLPackage.STATE__ENTRY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__ENTRY, newEntry);
+		eDynamicSet(UMLPackage.STATE__ENTRY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__ENTRY, newEntry);
 	}
 
 	/**
@@ -840,9 +774,7 @@
 	 * @generated
 	 */
 	public Behavior getExit() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.STATE__EXIT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__EXIT, true, true);
+		return (Behavior) eDynamicGet(UMLPackage.STATE__EXIT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__EXIT, true, true);
 	}
 
 	/**
@@ -851,9 +783,7 @@
 	 * @generated
 	 */
 	public Behavior basicGetExit() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.STATE__EXIT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__EXIT, false, true);
+		return (Behavior) eDynamicGet(UMLPackage.STATE__EXIT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__EXIT, false, true);
 	}
 
 	/**
@@ -863,8 +793,7 @@
 	 */
 	public NotificationChain basicSetExit(Behavior newExit,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newExit,
-			UMLPackage.STATE__EXIT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newExit, UMLPackage.STATE__EXIT, msgs);
 		return msgs;
 	}
 
@@ -874,8 +803,7 @@
 	 * @generated
 	 */
 	public void setExit(Behavior newExit) {
-		eDynamicSet(UMLPackage.STATE__EXIT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__EXIT, newExit);
+		eDynamicSet(UMLPackage.STATE__EXIT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__EXIT, newExit);
 	}
 
 	/**
@@ -897,9 +825,7 @@
 	 * @generated
 	 */
 	public Behavior getDoActivity() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.STATE__DO_ACTIVITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__DO_ACTIVITY, true, true);
+		return (Behavior) eDynamicGet(UMLPackage.STATE__DO_ACTIVITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__DO_ACTIVITY, true, true);
 	}
 
 	/**
@@ -908,9 +834,7 @@
 	 * @generated
 	 */
 	public Behavior basicGetDoActivity() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.STATE__DO_ACTIVITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__DO_ACTIVITY, false, true);
+		return (Behavior) eDynamicGet(UMLPackage.STATE__DO_ACTIVITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__DO_ACTIVITY, false, true);
 	}
 
 	/**
@@ -920,8 +844,7 @@
 	 */
 	public NotificationChain basicSetDoActivity(Behavior newDoActivity,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newDoActivity,
-			UMLPackage.STATE__DO_ACTIVITY, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newDoActivity, UMLPackage.STATE__DO_ACTIVITY, msgs);
 		return msgs;
 	}
 
@@ -931,8 +854,7 @@
 	 * @generated
 	 */
 	public void setDoActivity(Behavior newDoActivity) {
-		eDynamicSet(UMLPackage.STATE__DO_ACTIVITY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__DO_ACTIVITY, newDoActivity);
+		eDynamicSet(UMLPackage.STATE__DO_ACTIVITY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__DO_ACTIVITY, newDoActivity);
 	}
 
 	/**
@@ -955,9 +877,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Trigger> getDeferrableTriggers() {
-		return (EList<Trigger>) eDynamicGet(
-			UMLPackage.STATE__DEFERRABLE_TRIGGER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__DEFERRABLE_TRIGGER, true, true);
+		return (EList<Trigger>) eDynamicGet(UMLPackage.STATE__DEFERRABLE_TRIGGER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__DEFERRABLE_TRIGGER, true, true);
 	}
 
 	/**
@@ -966,8 +886,7 @@
 	 * @generated
 	 */
 	public Trigger createDeferrableTrigger(String name) {
-		Trigger newDeferrableTrigger = (Trigger) create(
-			UMLPackage.Literals.TRIGGER);
+		Trigger newDeferrableTrigger = (Trigger) create(UMLPackage.Literals.TRIGGER);
 		getDeferrableTriggers().add(newDeferrableTrigger);
 		if (name != null)
 			newDeferrableTrigger.setName(name);
@@ -990,16 +909,12 @@
 	 */
 	public Trigger getDeferrableTrigger(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		deferrableTriggerLoop : for (Trigger deferrableTrigger : getDeferrableTriggers()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(deferrableTrigger.getName())
-				: name.equals(deferrableTrigger.getName())))
+		deferrableTriggerLoop: for (Trigger deferrableTrigger : getDeferrableTriggers()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(deferrableTrigger.getName()) : name.equals(deferrableTrigger.getName())))
 				continue deferrableTriggerLoop;
 			return deferrableTrigger;
 		}
-		return createOnDemand
-			? createDeferrableTrigger(name)
-			: null;
+		return createOnDemand ? createDeferrableTrigger(name) : null;
 	}
 
 	/**
@@ -1009,9 +924,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Region> getRegions() {
-		return (EList<Region>) eDynamicGet(
-			UMLPackage.STATE__REGION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE__REGION, true, true);
+		return (EList<Region>) eDynamicGet(UMLPackage.STATE__REGION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE__REGION, true, true);
 	}
 
 	/**
@@ -1043,16 +956,12 @@
 	 */
 	public Region getRegion(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		regionLoop : for (Region region : getRegions()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(region.getName())
-				: name.equals(region.getName())))
+		regionLoop: for (Region region : getRegions()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(region.getName()) : name.equals(region.getName())))
 				continue regionLoop;
 			return region;
 		}
-		return createOnDemand
-			? createRegion(name)
-			: null;
+		return createOnDemand ? createRegion(name) : null;
 	}
 
 	/**
@@ -1062,8 +971,7 @@
 	 */
 	public boolean validateRedefinitionContextValid(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations
-			.validateRedefinitionContextValid(this, diagnostics, context);
+		return RedefinableElementOperations.validateRedefinitionContextValid(this, diagnostics, context);
 	}
 
 	/**
@@ -1073,8 +981,7 @@
 	 */
 	public boolean validateRedefinitionConsistent(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations.validateRedefinitionConsistent(this,
-			diagnostics, context);
+		return RedefinableElementOperations.validateRedefinitionConsistent(this, diagnostics, context);
 	}
 
 	/**
@@ -1084,8 +991,7 @@
 	 */
 	public boolean validateNonLeafRedefinition(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations.validateNonLeafRedefinition(this,
-			diagnostics, context);
+		return RedefinableElementOperations.validateNonLeafRedefinition(this, diagnostics, context);
 	}
 
 	/**
@@ -1095,8 +1001,7 @@
 	 */
 	public boolean isRedefinitionContextValid(
 			RedefinableElement redefinedElement) {
-		return StateOperations.isRedefinitionContextValid(this,
-			redefinedElement);
+		return StateOperations.isRedefinitionContextValid(this, redefinedElement);
 	}
 
 	/**
@@ -1115,8 +1020,7 @@
 	 */
 	public boolean validateSubmachineStates(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StateOperations.validateSubmachineStates(this, diagnostics,
-			context);
+		return StateOperations.validateSubmachineStates(this, diagnostics, context);
 	}
 
 	/**
@@ -1126,8 +1030,7 @@
 	 */
 	public boolean validateDestinationsOrSourcesOfTransitions(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return StateOperations.validateDestinationsOrSourcesOfTransitions(this,
-			diagnostics, context);
+		return StateOperations.validateDestinationsOrSourcesOfTransitions(this, diagnostics, context);
 	}
 
 	/**
@@ -1137,8 +1040,7 @@
 	 */
 	public boolean validateSubmachineOrRegions(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StateOperations.validateSubmachineOrRegions(this, diagnostics,
-			context);
+		return StateOperations.validateSubmachineOrRegions(this, diagnostics, context);
 	}
 
 	/**
@@ -1148,8 +1050,7 @@
 	 */
 	public boolean validateCompositeStates(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StateOperations.validateCompositeStates(this, diagnostics,
-			context);
+		return StateOperations.validateCompositeStates(this, diagnostics, context);
 	}
 
 	/**
@@ -1208,38 +1109,29 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.STATE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE__CONTAINER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetContainer((Region) otherEnd, msgs);
-			case UMLPackage.STATE__CONNECTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getConnections())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE__CONNECTION_POINT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getConnectionPoints())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE__SUBMACHINE :
-				StateMachine submachine = basicGetSubmachine();
-				if (submachine != null)
-					msgs = ((InternalEObject) submachine).eInverseRemove(this,
-						UMLPackage.STATE_MACHINE__SUBMACHINE_STATE,
-						StateMachine.class, msgs);
-				return basicSetSubmachine((StateMachine) otherEnd, msgs);
-			case UMLPackage.STATE__REGION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getRegions())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE__CONTAINER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetContainer((Region) otherEnd, msgs);
+		case UMLPackage.STATE__CONNECTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getConnections()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE__CONNECTION_POINT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getConnectionPoints()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE__SUBMACHINE:
+			StateMachine submachine = basicGetSubmachine();
+			if (submachine != null)
+				msgs = ((InternalEObject) submachine).eInverseRemove(this, UMLPackage.STATE_MACHINE__SUBMACHINE_STATE, StateMachine.class, msgs);
+			return basicSetSubmachine((StateMachine) otherEnd, msgs);
+		case UMLPackage.STATE__REGION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getRegions()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -1253,45 +1145,36 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.STATE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.STATE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE__CONTAINER :
-				return basicSetContainer(null, msgs);
-			case UMLPackage.STATE__CONNECTION :
-				return ((InternalEList<?>) getConnections())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE__CONNECTION_POINT :
-				return ((InternalEList<?>) getConnectionPoints())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE__DEFERRABLE_TRIGGER :
-				return ((InternalEList<?>) getDeferrableTriggers())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE__DO_ACTIVITY :
-				return basicSetDoActivity(null, msgs);
-			case UMLPackage.STATE__ENTRY :
-				return basicSetEntry(null, msgs);
-			case UMLPackage.STATE__EXIT :
-				return basicSetExit(null, msgs);
-			case UMLPackage.STATE__SUBMACHINE :
-				return basicSetSubmachine(null, msgs);
-			case UMLPackage.STATE__REGION :
-				return ((InternalEList<?>) getRegions()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.STATE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.STATE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE__CONTAINER:
+			return basicSetContainer(null, msgs);
+		case UMLPackage.STATE__CONNECTION:
+			return ((InternalEList<?>) getConnections()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE__CONNECTION_POINT:
+			return ((InternalEList<?>) getConnectionPoints()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE__DEFERRABLE_TRIGGER:
+			return ((InternalEList<?>) getDeferrableTriggers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE__DO_ACTIVITY:
+			return basicSetDoActivity(null, msgs);
+		case UMLPackage.STATE__ENTRY:
+			return basicSetEntry(null, msgs);
+		case UMLPackage.STATE__EXIT:
+			return basicSetExit(null, msgs);
+		case UMLPackage.STATE__SUBMACHINE:
+			return basicSetSubmachine(null, msgs);
+		case UMLPackage.STATE__REGION:
+			return ((InternalEList<?>) getRegions()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -1305,9 +1188,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.STATE__CONTAINER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.REGION__SUBVERTEX, Region.class, msgs);
+		case UMLPackage.STATE__CONTAINER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.REGION__SUBVERTEX, Region.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -1320,98 +1202,98 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.STATE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.STATE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.STATE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.STATE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.STATE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.STATE__NAME :
-				return getName();
-			case UMLPackage.STATE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.STATE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.STATE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STATE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.STATE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.STATE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.STATE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.STATE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.STATE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.STATE__MEMBER :
-				return getMembers();
-			case UMLPackage.STATE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.STATE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.STATE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.STATE__CONTAINER :
-				if (resolve)
-					return getContainer();
-				return basicGetContainer();
-			case UMLPackage.STATE__INCOMING :
-				return getIncomings();
-			case UMLPackage.STATE__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.STATE__CONNECTION :
-				return getConnections();
-			case UMLPackage.STATE__CONNECTION_POINT :
-				return getConnectionPoints();
-			case UMLPackage.STATE__DEFERRABLE_TRIGGER :
-				return getDeferrableTriggers();
-			case UMLPackage.STATE__DO_ACTIVITY :
-				if (resolve)
-					return getDoActivity();
-				return basicGetDoActivity();
-			case UMLPackage.STATE__ENTRY :
-				if (resolve)
-					return getEntry();
-				return basicGetEntry();
-			case UMLPackage.STATE__EXIT :
-				if (resolve)
-					return getExit();
-				return basicGetExit();
-			case UMLPackage.STATE__IS_COMPOSITE :
-				return isComposite();
-			case UMLPackage.STATE__IS_ORTHOGONAL :
-				return isOrthogonal();
-			case UMLPackage.STATE__IS_SIMPLE :
-				return isSimple();
-			case UMLPackage.STATE__IS_SUBMACHINE_STATE :
-				return isSubmachineState();
-			case UMLPackage.STATE__REDEFINED_STATE :
-				if (resolve)
-					return getRedefinedState();
-				return basicGetRedefinedState();
-			case UMLPackage.STATE__STATE_INVARIANT :
-				if (resolve)
-					return getStateInvariant();
-				return basicGetStateInvariant();
-			case UMLPackage.STATE__SUBMACHINE :
-				if (resolve)
-					return getSubmachine();
-				return basicGetSubmachine();
-			case UMLPackage.STATE__REGION :
-				return getRegions();
+		case UMLPackage.STATE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.STATE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.STATE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.STATE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.STATE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.STATE__NAME:
+			return getName();
+		case UMLPackage.STATE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.STATE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.STATE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STATE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.STATE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.STATE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.STATE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.STATE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.STATE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.STATE__MEMBER:
+			return getMembers();
+		case UMLPackage.STATE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.STATE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.STATE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.STATE__CONTAINER:
+			if (resolve)
+				return getContainer();
+			return basicGetContainer();
+		case UMLPackage.STATE__INCOMING:
+			return getIncomings();
+		case UMLPackage.STATE__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.STATE__CONNECTION:
+			return getConnections();
+		case UMLPackage.STATE__CONNECTION_POINT:
+			return getConnectionPoints();
+		case UMLPackage.STATE__DEFERRABLE_TRIGGER:
+			return getDeferrableTriggers();
+		case UMLPackage.STATE__DO_ACTIVITY:
+			if (resolve)
+				return getDoActivity();
+			return basicGetDoActivity();
+		case UMLPackage.STATE__ENTRY:
+			if (resolve)
+				return getEntry();
+			return basicGetEntry();
+		case UMLPackage.STATE__EXIT:
+			if (resolve)
+				return getExit();
+			return basicGetExit();
+		case UMLPackage.STATE__IS_COMPOSITE:
+			return isComposite();
+		case UMLPackage.STATE__IS_ORTHOGONAL:
+			return isOrthogonal();
+		case UMLPackage.STATE__IS_SIMPLE:
+			return isSimple();
+		case UMLPackage.STATE__IS_SUBMACHINE_STATE:
+			return isSubmachineState();
+		case UMLPackage.STATE__REDEFINED_STATE:
+			if (resolve)
+				return getRedefinedState();
+			return basicGetRedefinedState();
+		case UMLPackage.STATE__STATE_INVARIANT:
+			if (resolve)
+				return getStateInvariant();
+			return basicGetStateInvariant();
+		case UMLPackage.STATE__SUBMACHINE:
+			if (resolve)
+				return getSubmachine();
+			return basicGetSubmachine();
+		case UMLPackage.STATE__REGION:
+			return getRegions();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -1425,83 +1307,75 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.STATE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.STATE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.STATE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.STATE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.STATE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.STATE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.STATE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.STATE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.STATE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.STATE__CONTAINER :
-				setContainer((Region) newValue);
-				return;
-			case UMLPackage.STATE__CONNECTION :
-				getConnections().clear();
-				getConnections().addAll(
-					(Collection<? extends ConnectionPointReference>) newValue);
-				return;
-			case UMLPackage.STATE__CONNECTION_POINT :
-				getConnectionPoints().clear();
-				getConnectionPoints()
-					.addAll((Collection<? extends Pseudostate>) newValue);
-				return;
-			case UMLPackage.STATE__DEFERRABLE_TRIGGER :
-				getDeferrableTriggers().clear();
-				getDeferrableTriggers()
-					.addAll((Collection<? extends Trigger>) newValue);
-				return;
-			case UMLPackage.STATE__DO_ACTIVITY :
-				setDoActivity((Behavior) newValue);
-				return;
-			case UMLPackage.STATE__ENTRY :
-				setEntry((Behavior) newValue);
-				return;
-			case UMLPackage.STATE__EXIT :
-				setExit((Behavior) newValue);
-				return;
-			case UMLPackage.STATE__REDEFINED_STATE :
-				setRedefinedState((State) newValue);
-				return;
-			case UMLPackage.STATE__STATE_INVARIANT :
-				setStateInvariant((Constraint) newValue);
-				return;
-			case UMLPackage.STATE__SUBMACHINE :
-				setSubmachine((StateMachine) newValue);
-				return;
-			case UMLPackage.STATE__REGION :
-				getRegions().clear();
-				getRegions().addAll((Collection<? extends Region>) newValue);
-				return;
+		case UMLPackage.STATE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.STATE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.STATE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.STATE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.STATE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.STATE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.STATE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.STATE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.STATE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.STATE__CONTAINER:
+			setContainer((Region) newValue);
+			return;
+		case UMLPackage.STATE__CONNECTION:
+			getConnections().clear();
+			getConnections().addAll((Collection<? extends ConnectionPointReference>) newValue);
+			return;
+		case UMLPackage.STATE__CONNECTION_POINT:
+			getConnectionPoints().clear();
+			getConnectionPoints().addAll((Collection<? extends Pseudostate>) newValue);
+			return;
+		case UMLPackage.STATE__DEFERRABLE_TRIGGER:
+			getDeferrableTriggers().clear();
+			getDeferrableTriggers().addAll((Collection<? extends Trigger>) newValue);
+			return;
+		case UMLPackage.STATE__DO_ACTIVITY:
+			setDoActivity((Behavior) newValue);
+			return;
+		case UMLPackage.STATE__ENTRY:
+			setEntry((Behavior) newValue);
+			return;
+		case UMLPackage.STATE__EXIT:
+			setExit((Behavior) newValue);
+			return;
+		case UMLPackage.STATE__REDEFINED_STATE:
+			setRedefinedState((State) newValue);
+			return;
+		case UMLPackage.STATE__STATE_INVARIANT:
+			setStateInvariant((Constraint) newValue);
+			return;
+		case UMLPackage.STATE__SUBMACHINE:
+			setSubmachine((StateMachine) newValue);
+			return;
+		case UMLPackage.STATE__REGION:
+			getRegions().clear();
+			getRegions().addAll((Collection<? extends Region>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -1514,66 +1388,66 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STATE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.STATE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.STATE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.STATE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.STATE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.STATE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.STATE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.STATE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.STATE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.STATE__CONTAINER :
-				setContainer((Region) null);
-				return;
-			case UMLPackage.STATE__CONNECTION :
-				getConnections().clear();
-				return;
-			case UMLPackage.STATE__CONNECTION_POINT :
-				getConnectionPoints().clear();
-				return;
-			case UMLPackage.STATE__DEFERRABLE_TRIGGER :
-				getDeferrableTriggers().clear();
-				return;
-			case UMLPackage.STATE__DO_ACTIVITY :
-				setDoActivity((Behavior) null);
-				return;
-			case UMLPackage.STATE__ENTRY :
-				setEntry((Behavior) null);
-				return;
-			case UMLPackage.STATE__EXIT :
-				setExit((Behavior) null);
-				return;
-			case UMLPackage.STATE__REDEFINED_STATE :
-				setRedefinedState((State) null);
-				return;
-			case UMLPackage.STATE__STATE_INVARIANT :
-				setStateInvariant((Constraint) null);
-				return;
-			case UMLPackage.STATE__SUBMACHINE :
-				setSubmachine((StateMachine) null);
-				return;
-			case UMLPackage.STATE__REGION :
-				getRegions().clear();
-				return;
+		case UMLPackage.STATE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.STATE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.STATE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.STATE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.STATE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.STATE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.STATE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.STATE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.STATE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.STATE__CONTAINER:
+			setContainer((Region) null);
+			return;
+		case UMLPackage.STATE__CONNECTION:
+			getConnections().clear();
+			return;
+		case UMLPackage.STATE__CONNECTION_POINT:
+			getConnectionPoints().clear();
+			return;
+		case UMLPackage.STATE__DEFERRABLE_TRIGGER:
+			getDeferrableTriggers().clear();
+			return;
+		case UMLPackage.STATE__DO_ACTIVITY:
+			setDoActivity((Behavior) null);
+			return;
+		case UMLPackage.STATE__ENTRY:
+			setEntry((Behavior) null);
+			return;
+		case UMLPackage.STATE__EXIT:
+			setExit((Behavior) null);
+			return;
+		case UMLPackage.STATE__REDEFINED_STATE:
+			setRedefinedState((State) null);
+			return;
+		case UMLPackage.STATE__STATE_INVARIANT:
+			setStateInvariant((Constraint) null);
+			return;
+		case UMLPackage.STATE__SUBMACHINE:
+			setSubmachine((StateMachine) null);
+			return;
+		case UMLPackage.STATE__REGION:
+			getRegions().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1586,80 +1460,78 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STATE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.STATE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.STATE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.STATE__OWNER :
-				return isSetOwner();
-			case UMLPackage.STATE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.STATE__NAME :
-				return isSetName();
-			case UMLPackage.STATE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.STATE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.STATE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.STATE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.STATE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.STATE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.STATE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.STATE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.STATE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.STATE__MEMBER :
-				return isSetMembers();
-			case UMLPackage.STATE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.STATE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.STATE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.STATE__CONTAINER :
-				return basicGetContainer() != null;
-			case UMLPackage.STATE__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.STATE__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.STATE__CONNECTION :
-				return !getConnections().isEmpty();
-			case UMLPackage.STATE__CONNECTION_POINT :
-				return !getConnectionPoints().isEmpty();
-			case UMLPackage.STATE__DEFERRABLE_TRIGGER :
-				return !getDeferrableTriggers().isEmpty();
-			case UMLPackage.STATE__DO_ACTIVITY :
-				return basicGetDoActivity() != null;
-			case UMLPackage.STATE__ENTRY :
-				return basicGetEntry() != null;
-			case UMLPackage.STATE__EXIT :
-				return basicGetExit() != null;
-			case UMLPackage.STATE__IS_COMPOSITE :
-				return isComposite() != IS_COMPOSITE_EDEFAULT;
-			case UMLPackage.STATE__IS_ORTHOGONAL :
-				return isOrthogonal() != IS_ORTHOGONAL_EDEFAULT;
-			case UMLPackage.STATE__IS_SIMPLE :
-				return isSimple() != IS_SIMPLE_EDEFAULT;
-			case UMLPackage.STATE__IS_SUBMACHINE_STATE :
-				return isSubmachineState() != IS_SUBMACHINE_STATE_EDEFAULT;
-			case UMLPackage.STATE__REDEFINED_STATE :
-				return basicGetRedefinedState() != null;
-			case UMLPackage.STATE__STATE_INVARIANT :
-				return basicGetStateInvariant() != null;
-			case UMLPackage.STATE__SUBMACHINE :
-				return basicGetSubmachine() != null;
-			case UMLPackage.STATE__REGION :
-				return !getRegions().isEmpty();
+		case UMLPackage.STATE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.STATE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.STATE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.STATE__OWNER:
+			return isSetOwner();
+		case UMLPackage.STATE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.STATE__NAME:
+			return isSetName();
+		case UMLPackage.STATE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.STATE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.STATE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.STATE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.STATE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.STATE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.STATE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.STATE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.STATE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.STATE__MEMBER:
+			return isSetMembers();
+		case UMLPackage.STATE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.STATE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.STATE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.STATE__CONTAINER:
+			return basicGetContainer() != null;
+		case UMLPackage.STATE__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.STATE__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.STATE__CONNECTION:
+			return !getConnections().isEmpty();
+		case UMLPackage.STATE__CONNECTION_POINT:
+			return !getConnectionPoints().isEmpty();
+		case UMLPackage.STATE__DEFERRABLE_TRIGGER:
+			return !getDeferrableTriggers().isEmpty();
+		case UMLPackage.STATE__DO_ACTIVITY:
+			return basicGetDoActivity() != null;
+		case UMLPackage.STATE__ENTRY:
+			return basicGetEntry() != null;
+		case UMLPackage.STATE__EXIT:
+			return basicGetExit() != null;
+		case UMLPackage.STATE__IS_COMPOSITE:
+			return isComposite() != IS_COMPOSITE_EDEFAULT;
+		case UMLPackage.STATE__IS_ORTHOGONAL:
+			return isOrthogonal() != IS_ORTHOGONAL_EDEFAULT;
+		case UMLPackage.STATE__IS_SIMPLE:
+			return isSimple() != IS_SIMPLE_EDEFAULT;
+		case UMLPackage.STATE__IS_SUBMACHINE_STATE:
+			return isSubmachineState() != IS_SUBMACHINE_STATE_EDEFAULT;
+		case UMLPackage.STATE__REDEFINED_STATE:
+			return basicGetRedefinedState() != null;
+		case UMLPackage.STATE__STATE_INVARIANT:
+			return basicGetStateInvariant() != null;
+		case UMLPackage.STATE__SUBMACHINE:
+			return basicGetSubmachine() != null;
+		case UMLPackage.STATE__REGION:
+			return !getRegions().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1674,26 +1546,26 @@
 			Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.STATE__IS_LEAF :
-					return UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF;
-				case UMLPackage.STATE__REDEFINED_ELEMENT :
-					return UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT;
-				case UMLPackage.STATE__REDEFINITION_CONTEXT :
-					return UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT;
-				default :
-					return -1;
+			case UMLPackage.STATE__IS_LEAF:
+				return UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF;
+			case UMLPackage.STATE__REDEFINED_ELEMENT:
+				return UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT;
+			case UMLPackage.STATE__REDEFINITION_CONTEXT:
+				return UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == Vertex.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.STATE__CONTAINER :
-					return UMLPackage.VERTEX__CONTAINER;
-				case UMLPackage.STATE__INCOMING :
-					return UMLPackage.VERTEX__INCOMING;
-				case UMLPackage.STATE__OUTGOING :
-					return UMLPackage.VERTEX__OUTGOING;
-				default :
-					return -1;
+			case UMLPackage.STATE__CONTAINER:
+				return UMLPackage.VERTEX__CONTAINER;
+			case UMLPackage.STATE__INCOMING:
+				return UMLPackage.VERTEX__INCOMING;
+			case UMLPackage.STATE__OUTGOING:
+				return UMLPackage.VERTEX__OUTGOING;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -1709,26 +1581,26 @@
 			Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF :
-					return UMLPackage.STATE__IS_LEAF;
-				case UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT :
-					return UMLPackage.STATE__REDEFINED_ELEMENT;
-				case UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT :
-					return UMLPackage.STATE__REDEFINITION_CONTEXT;
-				default :
-					return -1;
+			case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF:
+				return UMLPackage.STATE__IS_LEAF;
+			case UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT:
+				return UMLPackage.STATE__REDEFINED_ELEMENT;
+			case UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT:
+				return UMLPackage.STATE__REDEFINITION_CONTEXT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == Vertex.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.VERTEX__CONTAINER :
-					return UMLPackage.STATE__CONTAINER;
-				case UMLPackage.VERTEX__INCOMING :
-					return UMLPackage.STATE__INCOMING;
-				case UMLPackage.VERTEX__OUTGOING :
-					return UMLPackage.STATE__OUTGOING;
-				default :
-					return -1;
+			case UMLPackage.VERTEX__CONTAINER:
+				return UMLPackage.STATE__CONTAINER;
+			case UMLPackage.VERTEX__INCOMING:
+				return UMLPackage.STATE__INCOMING;
+			case UMLPackage.VERTEX__OUTGOING:
+				return UMLPackage.STATE__OUTGOING;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1743,34 +1615,34 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.STATE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.STATE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.STATE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.REDEFINABLE_ELEMENT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-					return UMLPackage.STATE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT;
-				case UMLPackage.REDEFINABLE_ELEMENT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-					return UMLPackage.STATE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT;
-				default :
-					return -1;
+			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.STATE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.STATE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.STATE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.REDEFINABLE_ELEMENT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+				return UMLPackage.STATE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT;
+			case UMLPackage.REDEFINABLE_ELEMENT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+				return UMLPackage.STATE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == Vertex.class) {
 			switch (baseOperationID) {
-				case UMLPackage.VERTEX___CONTAINING_STATE_MACHINE :
-					return UMLPackage.STATE___CONTAINING_STATE_MACHINE;
-				case UMLPackage.VERTEX___GET_INCOMINGS :
-					return UMLPackage.STATE___GET_INCOMINGS;
-				case UMLPackage.VERTEX___GET_OUTGOINGS :
-					return UMLPackage.STATE___GET_OUTGOINGS;
-				case UMLPackage.VERTEX___IS_CONTAINED_IN_STATE__STATE :
-					return UMLPackage.STATE___IS_CONTAINED_IN_STATE__STATE;
-				case UMLPackage.VERTEX___IS_CONTAINED_IN_REGION__REGION :
-					return UMLPackage.STATE___IS_CONTAINED_IN_REGION__REGION;
-				default :
-					return -1;
+			case UMLPackage.VERTEX___CONTAINING_STATE_MACHINE:
+				return UMLPackage.STATE___CONTAINING_STATE_MACHINE;
+			case UMLPackage.VERTEX___GET_INCOMINGS:
+				return UMLPackage.STATE___GET_INCOMINGS;
+			case UMLPackage.VERTEX___GET_OUTGOINGS:
+				return UMLPackage.STATE___GET_OUTGOINGS;
+			case UMLPackage.VERTEX___IS_CONTAINED_IN_STATE__STATE:
+				return UMLPackage.STATE___IS_CONTAINED_IN_STATE__STATE;
+			case UMLPackage.VERTEX___IS_CONTAINED_IN_REGION__REGION:
+				return UMLPackage.STATE___IS_CONTAINED_IN_REGION__REGION;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -1786,219 +1658,176 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.STATE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.STATE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.STATE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STATE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.STATE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.STATE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.STATE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.STATE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.STATE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.STATE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.STATE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STATE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.STATE___GET_MODEL :
-				return getModel();
-			case UMLPackage.STATE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.STATE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.STATE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.STATE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.STATE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.STATE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.STATE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STATE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.STATE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.STATE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.STATE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STATE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STATE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.STATE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STATE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.STATE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.STATE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.STATE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.STATE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.STATE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STATE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.STATE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.STATE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.STATE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.STATE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.STATE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.STATE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.STATE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.STATE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.STATE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.STATE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STATE___SEPARATOR :
-				return separator();
-			case UMLPackage.STATE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.STATE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.STATE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.STATE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.STATE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.STATE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.STATE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.STATE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.STATE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.STATE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.STATE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.STATE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.STATE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.STATE___CONTAINING_STATE_MACHINE :
-				return containingStateMachine();
-			case UMLPackage.STATE___GET_INCOMINGS :
-				return getIncomings();
-			case UMLPackage.STATE___GET_OUTGOINGS :
-				return getOutgoings();
-			case UMLPackage.STATE___IS_CONTAINED_IN_STATE__STATE :
-				return isContainedInState((State) arguments.get(0));
-			case UMLPackage.STATE___IS_CONTAINED_IN_REGION__REGION :
-				return isContainedInRegion((Region) arguments.get(0));
-			case UMLPackage.STATE___VALIDATE_ENTRY_OR_EXIT__DIAGNOSTICCHAIN_MAP :
-				return validateEntryOrExit((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___VALIDATE_SUBMACHINE_STATES__DIAGNOSTICCHAIN_MAP :
-				return validateSubmachineStates(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___VALIDATE_COMPOSITE_STATES__DIAGNOSTICCHAIN_MAP :
-				return validateCompositeStates(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___VALIDATE_DESTINATIONS_OR_SOURCES_OF_TRANSITIONS__DIAGNOSTICCHAIN_MAP :
-				return validateDestinationsOrSourcesOfTransitions(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___VALIDATE_SUBMACHINE_OR_REGIONS__DIAGNOSTICCHAIN_MAP :
-				return validateSubmachineOrRegions(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE___IS_COMPOSITE :
-				return isComposite();
-			case UMLPackage.STATE___IS_ORTHOGONAL :
-				return isOrthogonal();
-			case UMLPackage.STATE___IS_SIMPLE :
-				return isSimple();
-			case UMLPackage.STATE___IS_SUBMACHINE_STATE :
-				return isSubmachineState();
-			case UMLPackage.STATE___REDEFINITION_CONTEXT :
-				return redefinitionContext();
+		case UMLPackage.STATE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.STATE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.STATE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STATE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.STATE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.STATE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.STATE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.STATE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.STATE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.STATE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.STATE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STATE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.STATE___GET_MODEL:
+			return getModel();
+		case UMLPackage.STATE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.STATE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.STATE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.STATE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.STATE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.STATE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.STATE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STATE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.STATE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.STATE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.STATE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STATE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STATE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.STATE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STATE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.STATE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.STATE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.STATE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.STATE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.STATE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STATE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.STATE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.STATE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.STATE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.STATE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.STATE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.STATE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.STATE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.STATE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.STATE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.STATE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STATE___SEPARATOR:
+			return separator();
+		case UMLPackage.STATE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.STATE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.STATE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.STATE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.STATE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.STATE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.STATE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.STATE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.STATE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.STATE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.STATE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.STATE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.STATE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.STATE___CONTAINING_STATE_MACHINE:
+			return containingStateMachine();
+		case UMLPackage.STATE___GET_INCOMINGS:
+			return getIncomings();
+		case UMLPackage.STATE___GET_OUTGOINGS:
+			return getOutgoings();
+		case UMLPackage.STATE___IS_CONTAINED_IN_STATE__STATE:
+			return isContainedInState((State) arguments.get(0));
+		case UMLPackage.STATE___IS_CONTAINED_IN_REGION__REGION:
+			return isContainedInRegion((Region) arguments.get(0));
+		case UMLPackage.STATE___VALIDATE_ENTRY_OR_EXIT__DIAGNOSTICCHAIN_MAP:
+			return validateEntryOrExit((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___VALIDATE_SUBMACHINE_STATES__DIAGNOSTICCHAIN_MAP:
+			return validateSubmachineStates((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___VALIDATE_COMPOSITE_STATES__DIAGNOSTICCHAIN_MAP:
+			return validateCompositeStates((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___VALIDATE_DESTINATIONS_OR_SOURCES_OF_TRANSITIONS__DIAGNOSTICCHAIN_MAP:
+			return validateDestinationsOrSourcesOfTransitions((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___VALIDATE_SUBMACHINE_OR_REGIONS__DIAGNOSTICCHAIN_MAP:
+			return validateSubmachineOrRegions((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE___IS_COMPOSITE:
+			return isComposite();
+		case UMLPackage.STATE___IS_ORTHOGONAL:
+			return isOrthogonal();
+		case UMLPackage.STATE___IS_SIMPLE:
+			return isSimple();
+		case UMLPackage.STATE___IS_SUBMACHINE_STATE:
+			return isSubmachineState();
+		case UMLPackage.STATE___REDEFINITION_CONTEXT:
+			return redefinitionContext();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -2011,8 +1840,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.STATE__REDEFINED_STATE};
+	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[] { UMLPackage.STATE__REDEFINED_STATE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2030,12 +1858,10 @@
 	 */
 	public RedefinableElement getRedefinedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		redefinedElementLoop : for (RedefinableElement redefinedElement : getRedefinedElements()) {
+		redefinedElementLoop: for (RedefinableElement redefinedElement : getRedefinedElements()) {
 			if (eClass != null && !eClass.isInstance(redefinedElement))
 				continue redefinedElementLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinedElement.getName())
-				: name.equals(redefinedElement.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinedElement.getName()) : name.equals(redefinedElement.getName())))
 				continue redefinedElementLoop;
 			return redefinedElement;
 		}
@@ -2072,7 +1898,8 @@
 	 */
 	@Override
 	public boolean isSetNamespace() {
-		return super.isSetNamespace() || eIsSet(UMLPackage.STATE__CONTAINER);
+		return super.isSetNamespace()
+				|| eIsSet(UMLPackage.STATE__CONTAINER);
 	}
 
 	/**
@@ -2083,9 +1910,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.STATE__OWNED_RULE, UMLPackage.STATE__CONNECTION,
-		UMLPackage.STATE__CONNECTION_POINT, UMLPackage.STATE__REGION};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.STATE__OWNED_RULE, UMLPackage.STATE__CONNECTION, UMLPackage.STATE__CONNECTION_POINT, UMLPackage.STATE__REGION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2094,9 +1919,10 @@
 	 */
 	@Override
 	public boolean isSetOwnedMembers() {
-		return super.isSetOwnedMembers() || eIsSet(UMLPackage.STATE__CONNECTION)
-			|| eIsSet(UMLPackage.STATE__CONNECTION_POINT)
-			|| eIsSet(UMLPackage.STATE__REGION);
+		return super.isSetOwnedMembers()
+				|| eIsSet(UMLPackage.STATE__CONNECTION)
+				|| eIsSet(UMLPackage.STATE__CONNECTION_POINT)
+				|| eIsSet(UMLPackage.STATE__REGION);
 	}
 
 	/**
@@ -2107,12 +1933,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.STATE__OWNED_COMMENT, UMLPackage.STATE__NAME_EXPRESSION,
-		UMLPackage.STATE__ELEMENT_IMPORT, UMLPackage.STATE__PACKAGE_IMPORT,
-		UMLPackage.STATE__OWNED_MEMBER, UMLPackage.STATE__DEFERRABLE_TRIGGER,
-		UMLPackage.STATE__DO_ACTIVITY, UMLPackage.STATE__ENTRY,
-		UMLPackage.STATE__EXIT};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.STATE__OWNED_COMMENT, UMLPackage.STATE__NAME_EXPRESSION, UMLPackage.STATE__ELEMENT_IMPORT, UMLPackage.STATE__PACKAGE_IMPORT, UMLPackage.STATE__OWNED_MEMBER,
+			UMLPackage.STATE__DEFERRABLE_TRIGGER, UMLPackage.STATE__DO_ACTIVITY, UMLPackage.STATE__ENTRY, UMLPackage.STATE__EXIT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2122,15 +1944,13 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Constraint> getOwnedRules() {
-		return (EList<Constraint>) eDynamicGet(
-			UMLPackage.STATE__OWNED_RULE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMESPACE__OWNED_RULE, true, true);
+		return (EList<Constraint>) eDynamicGet(UMLPackage.STATE__OWNED_RULE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMESPACE__OWNED_RULE, true, true);
 	}
 
 	private EList<Constraint> createOwnedRulesList() {
 		return new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Constraint>(
-			Constraint.class, this, UMLPackage.STATE__OWNED_RULE, null,
-			OWNED_RULE_ESUBSETS, UMLPackage.CONSTRAINT__CONTEXT);
+				Constraint.class, this, UMLPackage.STATE__OWNED_RULE, null,
+				OWNED_RULE_ESUBSETS, UMLPackage.CONSTRAINT__CONTEXT);
 	}
 
 	/**
@@ -2141,8 +1961,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_RULE_ESUBSETS = new int[]{
-		UMLPackage.STATE__STATE_INVARIANT};
+	protected static final int[] OWNED_RULE_ESUBSETS = new int[] { UMLPackage.STATE__STATE_INVARIANT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2152,10 +1971,10 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.STATE__DEFERRABLE_TRIGGER)
-			|| eIsSet(UMLPackage.STATE__DO_ACTIVITY)
-			|| eIsSet(UMLPackage.STATE__ENTRY)
-			|| eIsSet(UMLPackage.STATE__EXIT);
+				|| eIsSet(UMLPackage.STATE__DEFERRABLE_TRIGGER)
+				|| eIsSet(UMLPackage.STATE__DO_ACTIVITY)
+				|| eIsSet(UMLPackage.STATE__ENTRY)
+				|| eIsSet(UMLPackage.STATE__EXIT);
 	}
 
 } //StateImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StateInvariantImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StateInvariantImpl.java
index 66e9d91..9087606 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StateInvariantImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StateInvariantImpl.java
@@ -1,18 +1,20 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 212765, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -21,8 +23,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -89,20 +94,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.STATE_INVARIANT__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.STATE_INVARIANT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.STATE_INVARIANT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.STATE_INVARIANT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -111,9 +109,7 @@
 	 * @generated
 	 */
 	public Constraint getInvariant() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.STATE_INVARIANT__INVARIANT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE_INVARIANT__INVARIANT, true, true);
+		return (Constraint) eDynamicGet(UMLPackage.STATE_INVARIANT__INVARIANT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE_INVARIANT__INVARIANT, true, true);
 	}
 
 	/**
@@ -122,9 +118,7 @@
 	 * @generated
 	 */
 	public Constraint basicGetInvariant() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.STATE_INVARIANT__INVARIANT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE_INVARIANT__INVARIANT, false, true);
+		return (Constraint) eDynamicGet(UMLPackage.STATE_INVARIANT__INVARIANT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE_INVARIANT__INVARIANT, false, true);
 	}
 
 	/**
@@ -134,8 +128,7 @@
 	 */
 	public NotificationChain basicSetInvariant(Constraint newInvariant,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newInvariant,
-			UMLPackage.STATE_INVARIANT__INVARIANT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newInvariant, UMLPackage.STATE_INVARIANT__INVARIANT, msgs);
 		return msgs;
 	}
 
@@ -145,9 +138,7 @@
 	 * @generated
 	 */
 	public void setInvariant(Constraint newInvariant) {
-		eDynamicSet(
-			UMLPackage.STATE_INVARIANT__INVARIANT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE_INVARIANT__INVARIANT, newInvariant);
+		eDynamicSet(UMLPackage.STATE_INVARIANT__INVARIANT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE_INVARIANT__INVARIANT, newInvariant);
 	}
 
 	/**
@@ -180,9 +171,7 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Lifeline> getCovereds() {
-		return (EList<Lifeline>) eDynamicGet(
-			UMLPackage.STATE_INVARIANT__COVERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERACTION_FRAGMENT__COVERED, true, true);
+		return (EList<Lifeline>) eDynamicGet(UMLPackage.STATE_INVARIANT__COVERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERACTION_FRAGMENT__COVERED, true, true);
 	}
 
 	/**
@@ -190,7 +179,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Lifeline getCovered(String name) {
 		return getCovered(name, false);
 	}
@@ -200,12 +188,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public Lifeline getCovered(String name, boolean ignoreCase) {
-		coveredLoop : for (Lifeline covered : getCovereds()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(covered.getName())
-				: name.equals(covered.getName())))
+		coveredLoop: for (Lifeline covered : getCovereds()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(covered.getName()) : name.equals(covered.getName())))
 				continue coveredLoop;
 			return covered;
 		}
@@ -231,22 +216,18 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.STATE_INVARIANT__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE_INVARIANT__COVERED :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getCovereds())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE_INVARIANT__ENCLOSING_OPERAND :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetEnclosingOperand((InteractionOperand) otherEnd,
-					msgs);
-			case UMLPackage.STATE_INVARIANT__ENCLOSING_INTERACTION :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetEnclosingInteraction((Interaction) otherEnd,
-					msgs);
+		case UMLPackage.STATE_INVARIANT__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_INVARIANT__COVERED:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getCovereds()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_INVARIANT__ENCLOSING_OPERAND:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetEnclosingOperand((InteractionOperand) otherEnd, msgs);
+		case UMLPackage.STATE_INVARIANT__ENCLOSING_INTERACTION:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetEnclosingInteraction((Interaction) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -260,26 +241,22 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.STATE_INVARIANT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_INVARIANT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_INVARIANT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.STATE_INVARIANT__COVERED :
-				return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.STATE_INVARIANT__ENCLOSING_OPERAND :
-				return basicSetEnclosingOperand(null, msgs);
-			case UMLPackage.STATE_INVARIANT__ENCLOSING_INTERACTION :
-				return basicSetEnclosingInteraction(null, msgs);
-			case UMLPackage.STATE_INVARIANT__GENERAL_ORDERING :
-				return ((InternalEList<?>) getGeneralOrderings())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_INVARIANT__INVARIANT :
-				return basicSetInvariant(null, msgs);
+		case UMLPackage.STATE_INVARIANT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_INVARIANT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_INVARIANT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.STATE_INVARIANT__COVERED:
+			return ((InternalEList<?>) getCovereds()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_INVARIANT__ENCLOSING_OPERAND:
+			return basicSetEnclosingOperand(null, msgs);
+		case UMLPackage.STATE_INVARIANT__ENCLOSING_INTERACTION:
+			return basicSetEnclosingInteraction(null, msgs);
+		case UMLPackage.STATE_INVARIANT__GENERAL_ORDERING:
+			return ((InternalEList<?>) getGeneralOrderings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_INVARIANT__INVARIANT:
+			return basicSetInvariant(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -292,48 +269,48 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.STATE_INVARIANT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.STATE_INVARIANT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.STATE_INVARIANT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.STATE_INVARIANT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.STATE_INVARIANT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.STATE_INVARIANT__NAME :
-				return getName();
-			case UMLPackage.STATE_INVARIANT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.STATE_INVARIANT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.STATE_INVARIANT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STATE_INVARIANT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.STATE_INVARIANT__COVERED :
-				return getCovereds();
-			case UMLPackage.STATE_INVARIANT__ENCLOSING_OPERAND :
-				if (resolve)
-					return getEnclosingOperand();
-				return basicGetEnclosingOperand();
-			case UMLPackage.STATE_INVARIANT__ENCLOSING_INTERACTION :
-				if (resolve)
-					return getEnclosingInteraction();
-				return basicGetEnclosingInteraction();
-			case UMLPackage.STATE_INVARIANT__GENERAL_ORDERING :
-				return getGeneralOrderings();
-			case UMLPackage.STATE_INVARIANT__INVARIANT :
-				if (resolve)
-					return getInvariant();
-				return basicGetInvariant();
+		case UMLPackage.STATE_INVARIANT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.STATE_INVARIANT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.STATE_INVARIANT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.STATE_INVARIANT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.STATE_INVARIANT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.STATE_INVARIANT__NAME:
+			return getName();
+		case UMLPackage.STATE_INVARIANT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.STATE_INVARIANT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.STATE_INVARIANT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STATE_INVARIANT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.STATE_INVARIANT__COVERED:
+			return getCovereds();
+		case UMLPackage.STATE_INVARIANT__ENCLOSING_OPERAND:
+			if (resolve)
+				return getEnclosingOperand();
+			return basicGetEnclosingOperand();
+		case UMLPackage.STATE_INVARIANT__ENCLOSING_INTERACTION:
+			if (resolve)
+				return getEnclosingInteraction();
+			return basicGetEnclosingInteraction();
+		case UMLPackage.STATE_INVARIANT__GENERAL_ORDERING:
+			return getGeneralOrderings();
+		case UMLPackage.STATE_INVARIANT__INVARIANT:
+			if (resolve)
+				return getInvariant();
+			return basicGetInvariant();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -347,43 +324,40 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.STATE_INVARIANT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.STATE_INVARIANT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.STATE_INVARIANT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.STATE_INVARIANT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.STATE_INVARIANT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.STATE_INVARIANT__COVERED :
-				getCovereds().clear();
-				getCovereds().addAll((Collection<? extends Lifeline>) newValue);
-				return;
-			case UMLPackage.STATE_INVARIANT__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) newValue);
-				return;
-			case UMLPackage.STATE_INVARIANT__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) newValue);
-				return;
-			case UMLPackage.STATE_INVARIANT__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				getGeneralOrderings()
-					.addAll((Collection<? extends GeneralOrdering>) newValue);
-				return;
-			case UMLPackage.STATE_INVARIANT__INVARIANT :
-				setInvariant((Constraint) newValue);
-				return;
+		case UMLPackage.STATE_INVARIANT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.STATE_INVARIANT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.STATE_INVARIANT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.STATE_INVARIANT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.STATE_INVARIANT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.STATE_INVARIANT__COVERED:
+			getCovereds().clear();
+			getCovereds().addAll((Collection<? extends Lifeline>) newValue);
+			return;
+		case UMLPackage.STATE_INVARIANT__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) newValue);
+			return;
+		case UMLPackage.STATE_INVARIANT__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) newValue);
+			return;
+		case UMLPackage.STATE_INVARIANT__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			getGeneralOrderings().addAll((Collection<? extends GeneralOrdering>) newValue);
+			return;
+		case UMLPackage.STATE_INVARIANT__INVARIANT:
+			setInvariant((Constraint) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -396,36 +370,36 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STATE_INVARIANT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.STATE_INVARIANT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.STATE_INVARIANT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.STATE_INVARIANT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.STATE_INVARIANT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.STATE_INVARIANT__COVERED :
-				getCovereds().clear();
-				return;
-			case UMLPackage.STATE_INVARIANT__ENCLOSING_OPERAND :
-				setEnclosingOperand((InteractionOperand) null);
-				return;
-			case UMLPackage.STATE_INVARIANT__ENCLOSING_INTERACTION :
-				setEnclosingInteraction((Interaction) null);
-				return;
-			case UMLPackage.STATE_INVARIANT__GENERAL_ORDERING :
-				getGeneralOrderings().clear();
-				return;
-			case UMLPackage.STATE_INVARIANT__INVARIANT :
-				setInvariant((Constraint) null);
-				return;
+		case UMLPackage.STATE_INVARIANT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.STATE_INVARIANT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.STATE_INVARIANT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.STATE_INVARIANT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.STATE_INVARIANT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.STATE_INVARIANT__COVERED:
+			getCovereds().clear();
+			return;
+		case UMLPackage.STATE_INVARIANT__ENCLOSING_OPERAND:
+			setEnclosingOperand((InteractionOperand) null);
+			return;
+		case UMLPackage.STATE_INVARIANT__ENCLOSING_INTERACTION:
+			setEnclosingInteraction((Interaction) null);
+			return;
+		case UMLPackage.STATE_INVARIANT__GENERAL_ORDERING:
+			getGeneralOrderings().clear();
+			return;
+		case UMLPackage.STATE_INVARIANT__INVARIANT:
+			setInvariant((Constraint) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -438,38 +412,36 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STATE_INVARIANT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.STATE_INVARIANT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.STATE_INVARIANT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.STATE_INVARIANT__OWNER :
-				return isSetOwner();
-			case UMLPackage.STATE_INVARIANT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.STATE_INVARIANT__NAME :
-				return isSetName();
-			case UMLPackage.STATE_INVARIANT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.STATE_INVARIANT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.STATE_INVARIANT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.STATE_INVARIANT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.STATE_INVARIANT__COVERED :
-				return isSetCovereds();
-			case UMLPackage.STATE_INVARIANT__ENCLOSING_OPERAND :
-				return basicGetEnclosingOperand() != null;
-			case UMLPackage.STATE_INVARIANT__ENCLOSING_INTERACTION :
-				return basicGetEnclosingInteraction() != null;
-			case UMLPackage.STATE_INVARIANT__GENERAL_ORDERING :
-				return !getGeneralOrderings().isEmpty();
-			case UMLPackage.STATE_INVARIANT__INVARIANT :
-				return basicGetInvariant() != null;
+		case UMLPackage.STATE_INVARIANT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.STATE_INVARIANT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.STATE_INVARIANT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.STATE_INVARIANT__OWNER:
+			return isSetOwner();
+		case UMLPackage.STATE_INVARIANT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.STATE_INVARIANT__NAME:
+			return isSetName();
+		case UMLPackage.STATE_INVARIANT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.STATE_INVARIANT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.STATE_INVARIANT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.STATE_INVARIANT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.STATE_INVARIANT__COVERED:
+			return isSetCovereds();
+		case UMLPackage.STATE_INVARIANT__ENCLOSING_OPERAND:
+			return basicGetEnclosingOperand() != null;
+		case UMLPackage.STATE_INVARIANT__ENCLOSING_INTERACTION:
+			return basicGetEnclosingInteraction() != null;
+		case UMLPackage.STATE_INVARIANT__GENERAL_ORDERING:
+			return !getGeneralOrderings().isEmpty();
+		case UMLPackage.STATE_INVARIANT__INVARIANT:
+			return basicGetInvariant() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -482,11 +454,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.STATE_INVARIANT__OWNED_COMMENT,
-		UMLPackage.STATE_INVARIANT__NAME_EXPRESSION,
-		UMLPackage.STATE_INVARIANT__GENERAL_ORDERING,
-		UMLPackage.STATE_INVARIANT__INVARIANT};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.STATE_INVARIANT__OWNED_COMMENT, UMLPackage.STATE_INVARIANT__NAME_EXPRESSION, UMLPackage.STATE_INVARIANT__GENERAL_ORDERING, UMLPackage.STATE_INVARIANT__INVARIANT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -496,7 +464,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.STATE_INVARIANT__INVARIANT);
+				|| eIsSet(UMLPackage.STATE_INVARIANT__INVARIANT);
 	}
 
 } //StateInvariantImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StateMachineImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StateMachineImpl.java
index 0c8412c..7db7dec 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StateMachineImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StateMachineImpl.java
@@ -1,34 +1,43 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 479276, 485756, 511674
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Map;
 
 import org.eclipse.emf.common.notify.NotificationChain;
 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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectResolvingEList;
+
 import org.eclipse.uml2.uml.AggregationKind;
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.BehavioralFeature;
@@ -68,6 +77,7 @@
 import org.eclipse.uml2.uml.UseCase;
 import org.eclipse.uml2.uml.Vertex;
 import org.eclipse.uml2.uml.VisibilityKind;
+
 import org.eclipse.uml2.uml.internal.operations.StateMachineOperations;
 
 /**
@@ -111,17 +121,9 @@
 		return UMLPackage.Literals.STATE_MACHINE;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.STATE_MACHINE__EXTENDED_STATE_MACHINE) {
 			return createExtendedStateMachinesList();
 		}
@@ -144,21 +146,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.STATE_MACHINE__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.STATE_MACHINE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(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);
 	}
 
 	/**
@@ -168,9 +162,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Region> getRegions() {
-		return (EList<Region>) eDynamicGet(
-			UMLPackage.STATE_MACHINE__REGION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE_MACHINE__REGION, true, true);
+		return (EList<Region>) eDynamicGet(UMLPackage.STATE_MACHINE__REGION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE_MACHINE__REGION, true, true);
 	}
 
 	/**
@@ -202,16 +194,12 @@
 	 */
 	public Region getRegion(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		regionLoop : for (Region region : getRegions()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(region.getName())
-				: name.equals(region.getName())))
+		regionLoop: for (Region region : getRegions()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(region.getName()) : name.equals(region.getName())))
 				continue regionLoop;
 			return region;
 		}
-		return createOnDemand
-			? createRegion(name)
-			: null;
+		return createOnDemand ? createRegion(name) : null;
 	}
 
 	/**
@@ -221,9 +209,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<State> getSubmachineStates() {
-		return (EList<State>) eDynamicGet(
-			UMLPackage.STATE_MACHINE__SUBMACHINE_STATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE_MACHINE__SUBMACHINE_STATE, true, true);
+		return (EList<State>) eDynamicGet(UMLPackage.STATE_MACHINE__SUBMACHINE_STATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE_MACHINE__SUBMACHINE_STATE, true, true);
 	}
 
 	/**
@@ -242,12 +228,10 @@
 	 */
 	public State getSubmachineState(String name, boolean ignoreCase,
 			EClass eClass) {
-		submachineStateLoop : for (State submachineState : getSubmachineStates()) {
+		submachineStateLoop: for (State submachineState : getSubmachineStates()) {
 			if (eClass != null && !eClass.isInstance(submachineState))
 				continue submachineStateLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(submachineState.getName())
-				: name.equals(submachineState.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(submachineState.getName()) : name.equals(submachineState.getName())))
 				continue submachineStateLoop;
 			return submachineState;
 		}
@@ -261,9 +245,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Pseudostate> getConnectionPoints() {
-		return (EList<Pseudostate>) eDynamicGet(
-			UMLPackage.STATE_MACHINE__CONNECTION_POINT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE_MACHINE__CONNECTION_POINT, true, true);
+		return (EList<Pseudostate>) eDynamicGet(UMLPackage.STATE_MACHINE__CONNECTION_POINT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE_MACHINE__CONNECTION_POINT, true, true);
 	}
 
 	/**
@@ -272,8 +254,7 @@
 	 * @generated
 	 */
 	public Pseudostate createConnectionPoint(String name) {
-		Pseudostate newConnectionPoint = (Pseudostate) create(
-			UMLPackage.Literals.PSEUDOSTATE);
+		Pseudostate newConnectionPoint = (Pseudostate) create(UMLPackage.Literals.PSEUDOSTATE);
 		getConnectionPoints().add(newConnectionPoint);
 		if (name != null)
 			newConnectionPoint.setName(name);
@@ -296,16 +277,12 @@
 	 */
 	public Pseudostate getConnectionPoint(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		connectionPointLoop : for (Pseudostate connectionPoint : getConnectionPoints()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(connectionPoint.getName())
-				: name.equals(connectionPoint.getName())))
+		connectionPointLoop: for (Pseudostate connectionPoint : getConnectionPoints()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(connectionPoint.getName()) : name.equals(connectionPoint.getName())))
 				continue connectionPointLoop;
 			return connectionPoint;
 		}
-		return createOnDemand
-			? createConnectionPoint(name)
-			: null;
+		return createOnDemand ? createConnectionPoint(name) : null;
 	}
 
 	/**
@@ -315,18 +292,14 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<StateMachine> getExtendedStateMachines() {
-		return (EList<StateMachine>) eDynamicGet(
-			UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STATE_MACHINE__EXTENDED_STATE_MACHINE, true,
-			true);
+		return (EList<StateMachine>) eDynamicGet(UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STATE_MACHINE__EXTENDED_STATE_MACHINE, true, true);
 	}
 
 	private EList<StateMachine> createExtendedStateMachinesList() {
 		return new SubsetSupersetEObjectResolvingEList<StateMachine>(
-			StateMachine.class, this,
-			UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE,
-			EXTENDED_STATE_MACHINE_ESUPERSETS, null);
+				StateMachine.class, this,
+				UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE,
+				EXTENDED_STATE_MACHINE_ESUPERSETS, null);
 	}
 
 	/**
@@ -345,12 +318,10 @@
 	 */
 	public StateMachine getExtendedStateMachine(String name, boolean ignoreCase,
 			EClass eClass) {
-		extendedStateMachineLoop : for (StateMachine extendedStateMachine : getExtendedStateMachines()) {
+		extendedStateMachineLoop: for (StateMachine extendedStateMachine : getExtendedStateMachines()) {
 			if (eClass != null && !eClass.isInstance(extendedStateMachine))
 				continue extendedStateMachineLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(extendedStateMachine.getName())
-				: name.equals(extendedStateMachine.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(extendedStateMachine.getName()) : name.equals(extendedStateMachine.getName())))
 				continue extendedStateMachineLoop;
 			return extendedStateMachine;
 		}
@@ -373,8 +344,7 @@
 	 */
 	public boolean validateClassifierContext(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StateMachineOperations.validateClassifierContext(this,
-			diagnostics, context);
+		return StateMachineOperations.validateClassifierContext(this, diagnostics, context);
 	}
 
 	/**
@@ -384,8 +354,7 @@
 	 */
 	public boolean validateContextClassifier(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StateMachineOperations.validateContextClassifier(this,
-			diagnostics, context);
+		return StateMachineOperations.validateContextClassifier(this, diagnostics, context);
 	}
 
 	/**
@@ -422,8 +391,7 @@
 	 */
 	public boolean validateConnectionPoints(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StateMachineOperations.validateConnectionPoints(this,
-			diagnostics, context);
+		return StateMachineOperations.validateConnectionPoints(this, diagnostics, context);
 	}
 
 	/**
@@ -433,8 +401,7 @@
 	 */
 	public boolean validateMethod(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StateMachineOperations.validateMethod(this, diagnostics,
-			context);
+		return StateMachineOperations.validateMethod(this, diagnostics, context);
 	}
 
 	/**
@@ -457,79 +424,53 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.STATE_MACHINE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.STATE_MACHINE__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__INTERFACE_REALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__OWNED_OPERATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__SPECIFICATION :
-				BehavioralFeature specification = basicGetSpecification();
-				if (specification != null)
-					msgs = ((InternalEObject) specification).eInverseRemove(
-						this, UMLPackage.BEHAVIORAL_FEATURE__METHOD,
-						BehavioralFeature.class, msgs);
-				return basicSetSpecification((BehavioralFeature) otherEnd,
-					msgs);
-			case UMLPackage.STATE_MACHINE__CONNECTION_POINT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getConnectionPoints())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__SUBMACHINE_STATE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubmachineStates())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__REGION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getRegions())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__INTERFACE_REALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__OWNED_OPERATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedOperations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__SPECIFICATION:
+			BehavioralFeature specification = basicGetSpecification();
+			if (specification != null)
+				msgs = ((InternalEObject) specification).eInverseRemove(this, UMLPackage.BEHAVIORAL_FEATURE__METHOD, BehavioralFeature.class, msgs);
+			return basicSetSpecification((BehavioralFeature) otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__CONNECTION_POINT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getConnectionPoints()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__SUBMACHINE_STATE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubmachineStates()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__REGION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getRegions()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -543,88 +484,64 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.STATE_MACHINE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.STATE_MACHINE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.STATE_MACHINE__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.STATE_MACHINE__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__OWNED_CONNECTOR :
-				return ((InternalEList<?>) getOwnedConnectors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__INTERFACE_REALIZATION :
-				return ((InternalEList<?>) getInterfaceRealizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__OWNED_BEHAVIOR :
-				return ((InternalEList<?>) getOwnedBehaviors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__OWNED_OPERATION :
-				return ((InternalEList<?>) getOwnedOperations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__NESTED_CLASSIFIER :
-				return ((InternalEList<?>) getNestedClassifiers())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__OWNED_RECEPTION :
-				return ((InternalEList<?>) getOwnedReceptions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__SPECIFICATION :
-				return basicSetSpecification(null, msgs);
-			case UMLPackage.STATE_MACHINE__OWNED_PARAMETER :
-				return ((InternalEList<?>) getOwnedParameters())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__OWNED_PARAMETER_SET :
-				return ((InternalEList<?>) getOwnedParameterSets())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__CONNECTION_POINT :
-				return ((InternalEList<?>) getConnectionPoints())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__SUBMACHINE_STATE :
-				return ((InternalEList<?>) getSubmachineStates())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STATE_MACHINE__REGION :
-				return ((InternalEList<?>) getRegions()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.STATE_MACHINE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.STATE_MACHINE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.STATE_MACHINE__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__OWNED_CONNECTOR:
+			return ((InternalEList<?>) getOwnedConnectors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__INTERFACE_REALIZATION:
+			return ((InternalEList<?>) getInterfaceRealizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__OWNED_BEHAVIOR:
+			return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__OWNED_OPERATION:
+			return ((InternalEList<?>) getOwnedOperations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__NESTED_CLASSIFIER:
+			return ((InternalEList<?>) getNestedClassifiers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__OWNED_RECEPTION:
+			return ((InternalEList<?>) getOwnedReceptions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__SPECIFICATION:
+			return basicSetSpecification(null, msgs);
+		case UMLPackage.STATE_MACHINE__OWNED_PARAMETER:
+			return ((InternalEList<?>) getOwnedParameters()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__OWNED_PARAMETER_SET:
+			return ((InternalEList<?>) getOwnedParameterSets()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__CONNECTION_POINT:
+			return ((InternalEList<?>) getConnectionPoints()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__SUBMACHINE_STATE:
+			return ((InternalEList<?>) getSubmachineStates()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STATE_MACHINE__REGION:
+			return ((InternalEList<?>) getRegions()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -637,156 +554,156 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.STATE_MACHINE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.STATE_MACHINE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.STATE_MACHINE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.STATE_MACHINE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.STATE_MACHINE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.STATE_MACHINE__NAME :
-				return getName();
-			case UMLPackage.STATE_MACHINE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.STATE_MACHINE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.STATE_MACHINE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STATE_MACHINE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.STATE_MACHINE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.STATE_MACHINE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.STATE_MACHINE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.STATE_MACHINE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.STATE_MACHINE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.STATE_MACHINE__MEMBER :
-				return getMembers();
-			case UMLPackage.STATE_MACHINE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.STATE_MACHINE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.STATE_MACHINE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.STATE_MACHINE__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.STATE_MACHINE__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.STATE_MACHINE__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.STATE_MACHINE__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.STATE_MACHINE__FEATURE :
-				return getFeatures();
-			case UMLPackage.STATE_MACHINE__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.STATE_MACHINE__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.STATE_MACHINE__GENERAL :
-				return getGenerals();
-			case UMLPackage.STATE_MACHINE__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.STATE_MACHINE__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.STATE_MACHINE__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.STATE_MACHINE__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.STATE_MACHINE__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.STATE_MACHINE__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.STATE_MACHINE__USE_CASE :
-				return getUseCases();
-			case UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.STATE_MACHINE__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.STATE_MACHINE__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.STATE_MACHINE__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.STATE_MACHINE__OWNED_CONNECTOR :
-				return getOwnedConnectors();
-			case UMLPackage.STATE_MACHINE__PART :
-				return getParts();
-			case UMLPackage.STATE_MACHINE__ROLE :
-				return getRoles();
-			case UMLPackage.STATE_MACHINE__OWNED_PORT :
-				return getOwnedPorts();
-			case UMLPackage.STATE_MACHINE__CLASSIFIER_BEHAVIOR :
-				if (resolve)
-					return getClassifierBehavior();
-				return basicGetClassifierBehavior();
-			case UMLPackage.STATE_MACHINE__INTERFACE_REALIZATION :
-				return getInterfaceRealizations();
-			case UMLPackage.STATE_MACHINE__OWNED_BEHAVIOR :
-				return getOwnedBehaviors();
-			case UMLPackage.STATE_MACHINE__OWNED_OPERATION :
-				return getOwnedOperations();
-			case UMLPackage.STATE_MACHINE__EXTENSION :
-				return getExtensions();
-			case UMLPackage.STATE_MACHINE__IS_ACTIVE :
-				return isActive();
-			case UMLPackage.STATE_MACHINE__NESTED_CLASSIFIER :
-				return getNestedClassifiers();
-			case UMLPackage.STATE_MACHINE__OWNED_RECEPTION :
-				return getOwnedReceptions();
-			case UMLPackage.STATE_MACHINE__SUPER_CLASS :
-				return getSuperClasses();
-			case UMLPackage.STATE_MACHINE__SPECIFICATION :
-				if (resolve)
-					return getSpecification();
-				return basicGetSpecification();
-			case UMLPackage.STATE_MACHINE__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.STATE_MACHINE__IS_REENTRANT :
-				return isReentrant();
-			case UMLPackage.STATE_MACHINE__OWNED_PARAMETER :
-				return getOwnedParameters();
-			case UMLPackage.STATE_MACHINE__OWNED_PARAMETER_SET :
-				return getOwnedParameterSets();
-			case UMLPackage.STATE_MACHINE__POSTCONDITION :
-				return getPostconditions();
-			case UMLPackage.STATE_MACHINE__PRECONDITION :
-				return getPreconditions();
-			case UMLPackage.STATE_MACHINE__REDEFINED_BEHAVIOR :
-				return getRedefinedBehaviors();
-			case UMLPackage.STATE_MACHINE__CONNECTION_POINT :
-				return getConnectionPoints();
-			case UMLPackage.STATE_MACHINE__SUBMACHINE_STATE :
-				return getSubmachineStates();
-			case UMLPackage.STATE_MACHINE__REGION :
-				return getRegions();
-			case UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE :
-				return getExtendedStateMachines();
+		case UMLPackage.STATE_MACHINE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.STATE_MACHINE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.STATE_MACHINE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.STATE_MACHINE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.STATE_MACHINE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.STATE_MACHINE__NAME:
+			return getName();
+		case UMLPackage.STATE_MACHINE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.STATE_MACHINE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.STATE_MACHINE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STATE_MACHINE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.STATE_MACHINE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.STATE_MACHINE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.STATE_MACHINE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.STATE_MACHINE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.STATE_MACHINE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.STATE_MACHINE__MEMBER:
+			return getMembers();
+		case UMLPackage.STATE_MACHINE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.STATE_MACHINE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.STATE_MACHINE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.STATE_MACHINE__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.STATE_MACHINE__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.STATE_MACHINE__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.STATE_MACHINE__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.STATE_MACHINE__FEATURE:
+			return getFeatures();
+		case UMLPackage.STATE_MACHINE__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.STATE_MACHINE__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.STATE_MACHINE__GENERAL:
+			return getGenerals();
+		case UMLPackage.STATE_MACHINE__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.STATE_MACHINE__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.STATE_MACHINE__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.STATE_MACHINE__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.STATE_MACHINE__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.STATE_MACHINE__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.STATE_MACHINE__USE_CASE:
+			return getUseCases();
+		case UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.STATE_MACHINE__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.STATE_MACHINE__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.STATE_MACHINE__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.STATE_MACHINE__OWNED_CONNECTOR:
+			return getOwnedConnectors();
+		case UMLPackage.STATE_MACHINE__PART:
+			return getParts();
+		case UMLPackage.STATE_MACHINE__ROLE:
+			return getRoles();
+		case UMLPackage.STATE_MACHINE__OWNED_PORT:
+			return getOwnedPorts();
+		case UMLPackage.STATE_MACHINE__CLASSIFIER_BEHAVIOR:
+			if (resolve)
+				return getClassifierBehavior();
+			return basicGetClassifierBehavior();
+		case UMLPackage.STATE_MACHINE__INTERFACE_REALIZATION:
+			return getInterfaceRealizations();
+		case UMLPackage.STATE_MACHINE__OWNED_BEHAVIOR:
+			return getOwnedBehaviors();
+		case UMLPackage.STATE_MACHINE__OWNED_OPERATION:
+			return getOwnedOperations();
+		case UMLPackage.STATE_MACHINE__EXTENSION:
+			return getExtensions();
+		case UMLPackage.STATE_MACHINE__IS_ACTIVE:
+			return isActive();
+		case UMLPackage.STATE_MACHINE__NESTED_CLASSIFIER:
+			return getNestedClassifiers();
+		case UMLPackage.STATE_MACHINE__OWNED_RECEPTION:
+			return getOwnedReceptions();
+		case UMLPackage.STATE_MACHINE__SUPER_CLASS:
+			return getSuperClasses();
+		case UMLPackage.STATE_MACHINE__SPECIFICATION:
+			if (resolve)
+				return getSpecification();
+			return basicGetSpecification();
+		case UMLPackage.STATE_MACHINE__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.STATE_MACHINE__IS_REENTRANT:
+			return isReentrant();
+		case UMLPackage.STATE_MACHINE__OWNED_PARAMETER:
+			return getOwnedParameters();
+		case UMLPackage.STATE_MACHINE__OWNED_PARAMETER_SET:
+			return getOwnedParameterSets();
+		case UMLPackage.STATE_MACHINE__POSTCONDITION:
+			return getPostconditions();
+		case UMLPackage.STATE_MACHINE__PRECONDITION:
+			return getPreconditions();
+		case UMLPackage.STATE_MACHINE__REDEFINED_BEHAVIOR:
+			return getRedefinedBehaviors();
+		case UMLPackage.STATE_MACHINE__CONNECTION_POINT:
+			return getConnectionPoints();
+		case UMLPackage.STATE_MACHINE__SUBMACHINE_STATE:
+			return getSubmachineStates();
+		case UMLPackage.STATE_MACHINE__REGION:
+			return getRegions();
+		case UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE:
+			return getExtendedStateMachines();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -800,204 +717,175 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.STATE_MACHINE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				getOwnedConnectors()
-					.addAll((Collection<? extends Connector>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll(
-					(Collection<? extends InterfaceRealization>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				getOwnedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__IS_ACTIVE :
-				setIsActive((Boolean) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				getNestedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				getOwnedReceptions()
-					.addAll((Collection<? extends Reception>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__SUPER_CLASS :
-				getSuperClasses().clear();
-				getSuperClasses().addAll(
-					(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__SPECIFICATION :
-				setSpecification((BehavioralFeature) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__IS_REENTRANT :
-				setIsReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				getOwnedParameters()
-					.addAll((Collection<? extends Parameter>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				getOwnedParameterSets()
-					.addAll((Collection<? extends ParameterSet>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__POSTCONDITION :
-				getPostconditions().clear();
-				getPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__PRECONDITION :
-				getPreconditions().clear();
-				getPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__REDEFINED_BEHAVIOR :
-				getRedefinedBehaviors().clear();
-				getRedefinedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__CONNECTION_POINT :
-				getConnectionPoints().clear();
-				getConnectionPoints()
-					.addAll((Collection<? extends Pseudostate>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__SUBMACHINE_STATE :
-				getSubmachineStates().clear();
-				getSubmachineStates()
-					.addAll((Collection<? extends State>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__REGION :
-				getRegions().clear();
-				getRegions().addAll((Collection<? extends Region>) newValue);
-				return;
-			case UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE :
-				getExtendedStateMachines().clear();
-				getExtendedStateMachines()
-					.addAll((Collection<? extends StateMachine>) newValue);
-				return;
+		case UMLPackage.STATE_MACHINE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			getOwnedConnectors().addAll((Collection<? extends Connector>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			getInterfaceRealizations().addAll((Collection<? extends InterfaceRealization>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			getOwnedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__IS_ACTIVE:
+			setIsActive((Boolean) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			getNestedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			getOwnedReceptions().addAll((Collection<? extends Reception>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__SUPER_CLASS:
+			getSuperClasses().clear();
+			getSuperClasses().addAll((Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__SPECIFICATION:
+			setSpecification((BehavioralFeature) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__IS_REENTRANT:
+			setIsReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			getOwnedParameters().addAll((Collection<? extends Parameter>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			getOwnedParameterSets().addAll((Collection<? extends ParameterSet>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__POSTCONDITION:
+			getPostconditions().clear();
+			getPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__PRECONDITION:
+			getPreconditions().clear();
+			getPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__REDEFINED_BEHAVIOR:
+			getRedefinedBehaviors().clear();
+			getRedefinedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__CONNECTION_POINT:
+			getConnectionPoints().clear();
+			getConnectionPoints().addAll((Collection<? extends Pseudostate>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__SUBMACHINE_STATE:
+			getSubmachineStates().clear();
+			getSubmachineStates().addAll((Collection<? extends State>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__REGION:
+			getRegions().clear();
+			getRegions().addAll((Collection<? extends Region>) newValue);
+			return;
+		case UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE:
+			getExtendedStateMachines().clear();
+			getExtendedStateMachines().addAll((Collection<? extends StateMachine>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -1010,144 +898,144 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STATE_MACHINE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.STATE_MACHINE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.STATE_MACHINE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.STATE_MACHINE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.STATE_MACHINE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.STATE_MACHINE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.STATE_MACHINE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.STATE_MACHINE__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.STATE_MACHINE__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.STATE_MACHINE__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) null);
-				return;
-			case UMLPackage.STATE_MACHINE__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__IS_ACTIVE :
-				setIsActive(IS_ACTIVE_EDEFAULT);
-				return;
-			case UMLPackage.STATE_MACHINE__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__SUPER_CLASS :
-				getSuperClasses().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__SPECIFICATION :
-				setSpecification((BehavioralFeature) null);
-				return;
-			case UMLPackage.STATE_MACHINE__IS_REENTRANT :
-				unsetIsReentrant();
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__OWNED_PARAMETER_SET :
-				getOwnedParameterSets().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__POSTCONDITION :
-				getPostconditions().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__PRECONDITION :
-				getPreconditions().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__REDEFINED_BEHAVIOR :
-				getRedefinedBehaviors().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__CONNECTION_POINT :
-				getConnectionPoints().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__SUBMACHINE_STATE :
-				getSubmachineStates().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__REGION :
-				getRegions().clear();
-				return;
-			case UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE :
-				getExtendedStateMachines().clear();
-				return;
+		case UMLPackage.STATE_MACHINE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.STATE_MACHINE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.STATE_MACHINE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.STATE_MACHINE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.STATE_MACHINE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.STATE_MACHINE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.STATE_MACHINE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.STATE_MACHINE__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.STATE_MACHINE__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.STATE_MACHINE__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) null);
+			return;
+		case UMLPackage.STATE_MACHINE__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__IS_ACTIVE:
+			setIsActive(IS_ACTIVE_EDEFAULT);
+			return;
+		case UMLPackage.STATE_MACHINE__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__SUPER_CLASS:
+			getSuperClasses().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__SPECIFICATION:
+			setSpecification((BehavioralFeature) null);
+			return;
+		case UMLPackage.STATE_MACHINE__IS_REENTRANT:
+			unsetIsReentrant();
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__OWNED_PARAMETER_SET:
+			getOwnedParameterSets().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__POSTCONDITION:
+			getPostconditions().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__PRECONDITION:
+			getPreconditions().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__REDEFINED_BEHAVIOR:
+			getRedefinedBehaviors().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__CONNECTION_POINT:
+			getConnectionPoints().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__SUBMACHINE_STATE:
+			getSubmachineStates().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__REGION:
+			getRegions().clear();
+			return;
+		case UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE:
+			getExtendedStateMachines().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1160,136 +1048,134 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STATE_MACHINE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.STATE_MACHINE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.STATE_MACHINE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.STATE_MACHINE__OWNER :
-				return isSetOwner();
-			case UMLPackage.STATE_MACHINE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.STATE_MACHINE__NAME :
-				return isSetName();
-			case UMLPackage.STATE_MACHINE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.STATE_MACHINE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.STATE_MACHINE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.STATE_MACHINE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.STATE_MACHINE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.STATE_MACHINE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.STATE_MACHINE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.STATE_MACHINE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.STATE_MACHINE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.STATE_MACHINE__MEMBER :
-				return isSetMembers();
-			case UMLPackage.STATE_MACHINE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.STATE_MACHINE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.STATE_MACHINE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.STATE_MACHINE__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.STATE_MACHINE__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.STATE_MACHINE__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.STATE_MACHINE__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.STATE_MACHINE__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.STATE_MACHINE__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.STATE_MACHINE__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.STATE_MACHINE__GENERAL :
-				return isSetGenerals();
-			case UMLPackage.STATE_MACHINE__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.STATE_MACHINE__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.STATE_MACHINE__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.STATE_MACHINE__IS_ABSTRACT :
-				return isSetIsAbstract();
-			case UMLPackage.STATE_MACHINE__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.STATE_MACHINE__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.STATE_MACHINE__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.STATE_MACHINE__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.STATE_MACHINE__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.STATE_MACHINE__OWNED_ATTRIBUTE :
-				return isSetOwnedAttributes();
-			case UMLPackage.STATE_MACHINE__OWNED_CONNECTOR :
-				return !getOwnedConnectors().isEmpty();
-			case UMLPackage.STATE_MACHINE__PART :
-				return !getParts().isEmpty();
-			case UMLPackage.STATE_MACHINE__ROLE :
-				return isSetRoles();
-			case UMLPackage.STATE_MACHINE__OWNED_PORT :
-				return !getOwnedPorts().isEmpty();
-			case UMLPackage.STATE_MACHINE__CLASSIFIER_BEHAVIOR :
-				return basicGetClassifierBehavior() != null;
-			case UMLPackage.STATE_MACHINE__INTERFACE_REALIZATION :
-				return !getInterfaceRealizations().isEmpty();
-			case UMLPackage.STATE_MACHINE__OWNED_BEHAVIOR :
-				return !getOwnedBehaviors().isEmpty();
-			case UMLPackage.STATE_MACHINE__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
-			case UMLPackage.STATE_MACHINE__EXTENSION :
-				return !getExtensions().isEmpty();
-			case UMLPackage.STATE_MACHINE__IS_ACTIVE :
-				return isActive() != IS_ACTIVE_EDEFAULT;
-			case UMLPackage.STATE_MACHINE__NESTED_CLASSIFIER :
-				return !getNestedClassifiers().isEmpty();
-			case UMLPackage.STATE_MACHINE__OWNED_RECEPTION :
-				return !getOwnedReceptions().isEmpty();
-			case UMLPackage.STATE_MACHINE__SUPER_CLASS :
-				return isSetSuperClasses();
-			case UMLPackage.STATE_MACHINE__SPECIFICATION :
-				return basicGetSpecification() != null;
-			case UMLPackage.STATE_MACHINE__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.STATE_MACHINE__IS_REENTRANT :
-				return isSetIsReentrant();
-			case UMLPackage.STATE_MACHINE__OWNED_PARAMETER :
-				return !getOwnedParameters().isEmpty();
-			case UMLPackage.STATE_MACHINE__OWNED_PARAMETER_SET :
-				return !getOwnedParameterSets().isEmpty();
-			case UMLPackage.STATE_MACHINE__POSTCONDITION :
-				return !getPostconditions().isEmpty();
-			case UMLPackage.STATE_MACHINE__PRECONDITION :
-				return !getPreconditions().isEmpty();
-			case UMLPackage.STATE_MACHINE__REDEFINED_BEHAVIOR :
-				return isSetRedefinedBehaviors();
-			case UMLPackage.STATE_MACHINE__CONNECTION_POINT :
-				return !getConnectionPoints().isEmpty();
-			case UMLPackage.STATE_MACHINE__SUBMACHINE_STATE :
-				return !getSubmachineStates().isEmpty();
-			case UMLPackage.STATE_MACHINE__REGION :
-				return !getRegions().isEmpty();
-			case UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE :
-				return isSetExtendedStateMachines();
+		case UMLPackage.STATE_MACHINE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.STATE_MACHINE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.STATE_MACHINE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.STATE_MACHINE__OWNER:
+			return isSetOwner();
+		case UMLPackage.STATE_MACHINE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.STATE_MACHINE__NAME:
+			return isSetName();
+		case UMLPackage.STATE_MACHINE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.STATE_MACHINE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.STATE_MACHINE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.STATE_MACHINE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.STATE_MACHINE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.STATE_MACHINE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.STATE_MACHINE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.STATE_MACHINE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.STATE_MACHINE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.STATE_MACHINE__MEMBER:
+			return isSetMembers();
+		case UMLPackage.STATE_MACHINE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.STATE_MACHINE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.STATE_MACHINE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.STATE_MACHINE__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.STATE_MACHINE__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.STATE_MACHINE__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.STATE_MACHINE__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.STATE_MACHINE__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.STATE_MACHINE__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.STATE_MACHINE__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.STATE_MACHINE__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.STATE_MACHINE__GENERAL:
+			return isSetGenerals();
+		case UMLPackage.STATE_MACHINE__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.STATE_MACHINE__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.STATE_MACHINE__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.STATE_MACHINE__IS_ABSTRACT:
+			return isSetIsAbstract();
+		case UMLPackage.STATE_MACHINE__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.STATE_MACHINE__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.STATE_MACHINE__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.STATE_MACHINE__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.STATE_MACHINE__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.STATE_MACHINE__OWNED_ATTRIBUTE:
+			return isSetOwnedAttributes();
+		case UMLPackage.STATE_MACHINE__OWNED_CONNECTOR:
+			return !getOwnedConnectors().isEmpty();
+		case UMLPackage.STATE_MACHINE__PART:
+			return !getParts().isEmpty();
+		case UMLPackage.STATE_MACHINE__ROLE:
+			return isSetRoles();
+		case UMLPackage.STATE_MACHINE__OWNED_PORT:
+			return !getOwnedPorts().isEmpty();
+		case UMLPackage.STATE_MACHINE__CLASSIFIER_BEHAVIOR:
+			return basicGetClassifierBehavior() != null;
+		case UMLPackage.STATE_MACHINE__INTERFACE_REALIZATION:
+			return !getInterfaceRealizations().isEmpty();
+		case UMLPackage.STATE_MACHINE__OWNED_BEHAVIOR:
+			return !getOwnedBehaviors().isEmpty();
+		case UMLPackage.STATE_MACHINE__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
+		case UMLPackage.STATE_MACHINE__EXTENSION:
+			return !getExtensions().isEmpty();
+		case UMLPackage.STATE_MACHINE__IS_ACTIVE:
+			return isActive() != IS_ACTIVE_EDEFAULT;
+		case UMLPackage.STATE_MACHINE__NESTED_CLASSIFIER:
+			return !getNestedClassifiers().isEmpty();
+		case UMLPackage.STATE_MACHINE__OWNED_RECEPTION:
+			return !getOwnedReceptions().isEmpty();
+		case UMLPackage.STATE_MACHINE__SUPER_CLASS:
+			return isSetSuperClasses();
+		case UMLPackage.STATE_MACHINE__SPECIFICATION:
+			return basicGetSpecification() != null;
+		case UMLPackage.STATE_MACHINE__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.STATE_MACHINE__IS_REENTRANT:
+			return isSetIsReentrant();
+		case UMLPackage.STATE_MACHINE__OWNED_PARAMETER:
+			return !getOwnedParameters().isEmpty();
+		case UMLPackage.STATE_MACHINE__OWNED_PARAMETER_SET:
+			return !getOwnedParameterSets().isEmpty();
+		case UMLPackage.STATE_MACHINE__POSTCONDITION:
+			return !getPostconditions().isEmpty();
+		case UMLPackage.STATE_MACHINE__PRECONDITION:
+			return !getPreconditions().isEmpty();
+		case UMLPackage.STATE_MACHINE__REDEFINED_BEHAVIOR:
+			return isSetRedefinedBehaviors();
+		case UMLPackage.STATE_MACHINE__CONNECTION_POINT:
+			return !getConnectionPoints().isEmpty();
+		case UMLPackage.STATE_MACHINE__SUBMACHINE_STATE:
+			return !getSubmachineStates().isEmpty();
+		case UMLPackage.STATE_MACHINE__REGION:
+			return !getRegions().isEmpty();
+		case UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE:
+			return isSetExtendedStateMachines();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1304,346 +1190,269 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.STATE_MACHINE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.STATE_MACHINE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.STATE_MACHINE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.STATE_MACHINE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.STATE_MACHINE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___GET_MODEL :
-				return getModel();
-			case UMLPackage.STATE_MACHINE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.STATE_MACHINE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.STATE_MACHINE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.STATE_MACHINE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.STATE_MACHINE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.STATE_MACHINE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.STATE_MACHINE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.STATE_MACHINE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.STATE_MACHINE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.STATE_MACHINE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.STATE_MACHINE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.STATE_MACHINE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.STATE_MACHINE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.STATE_MACHINE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STATE_MACHINE___SEPARATOR :
-				return separator();
-			case UMLPackage.STATE_MACHINE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.STATE_MACHINE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.STATE_MACHINE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.STATE_MACHINE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.STATE_MACHINE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.STATE_MACHINE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.STATE_MACHINE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.STATE_MACHINE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.STATE_MACHINE___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.STATE_MACHINE___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.STATE_MACHINE___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.STATE_MACHINE___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.STATE_MACHINE___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.STATE_MACHINE___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.STATE_MACHINE___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.STATE_MACHINE___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.STATE_MACHINE___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.STATE_MACHINE___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.STATE_MACHINE___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.STATE_MACHINE___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.STATE_MACHINE___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.STATE_MACHINE___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.STATE_MACHINE___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___PARENTS :
-				return parents();
-			case UMLPackage.STATE_MACHINE___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.STATE_MACHINE___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.STATE_MACHINE___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.STATE_MACHINE___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.STATE_MACHINE___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.STATE_MACHINE___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.STATE_MACHINE___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.STATE_MACHINE___GET_PARTS :
-				return getParts();
-			case UMLPackage.STATE_MACHINE___ALL_ROLES :
-				return allRoles();
-			case UMLPackage.STATE_MACHINE___GET_OWNED_PORTS :
-				return getOwnedPorts();
-			case UMLPackage.STATE_MACHINE___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateClassBehavior((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___GET_ALL_IMPLEMENTED_INTERFACES :
-				return getAllImplementedInterfaces();
-			case UMLPackage.STATE_MACHINE___GET_IMPLEMENTED_INTERFACES :
-				return getImplementedInterfaces();
-			case UMLPackage.STATE_MACHINE___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP :
-				return validatePassiveClass((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
-			case UMLPackage.STATE_MACHINE___IS_METACLASS :
-				return isMetaclass();
-			case UMLPackage.STATE_MACHINE___GET_EXTENSIONS :
-				return getExtensions();
-			case UMLPackage.STATE_MACHINE___GET_SUPER_CLASSES :
-				return getSuperClasses();
-			case UMLPackage.STATE_MACHINE___VALIDATE_MOST_ONE_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateMostOneBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___VALIDATE_PARAMETERS_MATCH__DIAGNOSTICCHAIN_MAP :
-				return validateParametersMatch(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___VALIDATE_FEATURE_OF_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateFeatureOfContextClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.STATE_MACHINE___BEHAVIORED_CLASSIFIER__ELEMENT :
-				return behavioredClassifier((Element) arguments.get(0));
-			case UMLPackage.STATE_MACHINE___INPUT_PARAMETERS :
-				return inputParameters();
-			case UMLPackage.STATE_MACHINE___OUTPUT_PARAMETERS :
-				return outputParameters();
-			case UMLPackage.STATE_MACHINE___VALIDATE_CONNECTION_POINTS__DIAGNOSTICCHAIN_MAP :
-				return validateConnectionPoints(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___VALIDATE_CLASSIFIER_CONTEXT__DIAGNOSTICCHAIN_MAP :
-				return validateClassifierContext(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___VALIDATE_METHOD__DIAGNOSTICCHAIN_MAP :
-				return validateMethod((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___VALIDATE_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateContextClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___LCA__VERTEX_VERTEX :
-				return LCA((Vertex) arguments.get(0),
-					(Vertex) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___ANCESTOR__VERTEX_VERTEX :
-				return ancestor((Vertex) arguments.get(0),
-					(Vertex) arguments.get(1));
-			case UMLPackage.STATE_MACHINE___LCA_STATE__VERTEX_VERTEX :
-				return LCAState((Vertex) arguments.get(0),
-					(Vertex) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.STATE_MACHINE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.STATE_MACHINE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.STATE_MACHINE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.STATE_MACHINE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___GET_MODEL:
+			return getModel();
+		case UMLPackage.STATE_MACHINE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.STATE_MACHINE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.STATE_MACHINE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.STATE_MACHINE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.STATE_MACHINE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.STATE_MACHINE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.STATE_MACHINE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.STATE_MACHINE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.STATE_MACHINE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.STATE_MACHINE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.STATE_MACHINE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.STATE_MACHINE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.STATE_MACHINE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.STATE_MACHINE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STATE_MACHINE___SEPARATOR:
+			return separator();
+		case UMLPackage.STATE_MACHINE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.STATE_MACHINE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.STATE_MACHINE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.STATE_MACHINE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.STATE_MACHINE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.STATE_MACHINE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.STATE_MACHINE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.STATE_MACHINE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.STATE_MACHINE___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.STATE_MACHINE___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.STATE_MACHINE___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.STATE_MACHINE___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.STATE_MACHINE___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.STATE_MACHINE___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.STATE_MACHINE___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.STATE_MACHINE___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.STATE_MACHINE___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.STATE_MACHINE___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.STATE_MACHINE___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.STATE_MACHINE___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.STATE_MACHINE___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.STATE_MACHINE___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.STATE_MACHINE___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___PARENTS:
+			return parents();
+		case UMLPackage.STATE_MACHINE___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.STATE_MACHINE___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.STATE_MACHINE___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.STATE_MACHINE___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.STATE_MACHINE___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.STATE_MACHINE___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.STATE_MACHINE___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.STATE_MACHINE___GET_PARTS:
+			return getParts();
+		case UMLPackage.STATE_MACHINE___ALL_ROLES:
+			return allRoles();
+		case UMLPackage.STATE_MACHINE___GET_OWNED_PORTS:
+			return getOwnedPorts();
+		case UMLPackage.STATE_MACHINE___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateClassBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___GET_ALL_IMPLEMENTED_INTERFACES:
+			return getAllImplementedInterfaces();
+		case UMLPackage.STATE_MACHINE___GET_IMPLEMENTED_INTERFACES:
+			return getImplementedInterfaces();
+		case UMLPackage.STATE_MACHINE___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP:
+			return validatePassiveClass((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.STATE_MACHINE___IS_METACLASS:
+			return isMetaclass();
+		case UMLPackage.STATE_MACHINE___GET_EXTENSIONS:
+			return getExtensions();
+		case UMLPackage.STATE_MACHINE___GET_SUPER_CLASSES:
+			return getSuperClasses();
+		case UMLPackage.STATE_MACHINE___VALIDATE_MOST_ONE_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateMostOneBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___VALIDATE_PARAMETERS_MATCH__DIAGNOSTICCHAIN_MAP:
+			return validateParametersMatch((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___VALIDATE_FEATURE_OF_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateFeatureOfContextClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.STATE_MACHINE___BEHAVIORED_CLASSIFIER__ELEMENT:
+			return behavioredClassifier((Element) arguments.get(0));
+		case UMLPackage.STATE_MACHINE___INPUT_PARAMETERS:
+			return inputParameters();
+		case UMLPackage.STATE_MACHINE___OUTPUT_PARAMETERS:
+			return outputParameters();
+		case UMLPackage.STATE_MACHINE___VALIDATE_CONNECTION_POINTS__DIAGNOSTICCHAIN_MAP:
+			return validateConnectionPoints((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___VALIDATE_CLASSIFIER_CONTEXT__DIAGNOSTICCHAIN_MAP:
+			return validateClassifierContext((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___VALIDATE_METHOD__DIAGNOSTICCHAIN_MAP:
+			return validateMethod((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___VALIDATE_CONTEXT_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateContextClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___LCA__VERTEX_VERTEX:
+			return LCA((Vertex) arguments.get(0), (Vertex) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___ANCESTOR__VERTEX_VERTEX:
+			return ancestor((Vertex) arguments.get(0), (Vertex) arguments.get(1));
+		case UMLPackage.STATE_MACHINE___LCA_STATE__VERTEX_VERTEX:
+			return LCAState((Vertex) arguments.get(0), (Vertex) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1656,19 +1465,9 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.STATE_MACHINE__OWNED_RULE,
-		UMLPackage.STATE_MACHINE__OWNED_USE_CASE,
-		UMLPackage.STATE_MACHINE__OWNED_ATTRIBUTE,
-		UMLPackage.STATE_MACHINE__OWNED_CONNECTOR,
-		UMLPackage.STATE_MACHINE__OWNED_BEHAVIOR,
-		UMLPackage.STATE_MACHINE__OWNED_OPERATION,
-		UMLPackage.STATE_MACHINE__NESTED_CLASSIFIER,
-		UMLPackage.STATE_MACHINE__OWNED_RECEPTION,
-		UMLPackage.STATE_MACHINE__OWNED_PARAMETER,
-		UMLPackage.STATE_MACHINE__OWNED_PARAMETER_SET,
-		UMLPackage.STATE_MACHINE__CONNECTION_POINT,
-		UMLPackage.STATE_MACHINE__REGION};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.STATE_MACHINE__OWNED_RULE, UMLPackage.STATE_MACHINE__OWNED_USE_CASE, UMLPackage.STATE_MACHINE__OWNED_ATTRIBUTE, UMLPackage.STATE_MACHINE__OWNED_CONNECTOR,
+			UMLPackage.STATE_MACHINE__OWNED_BEHAVIOR, UMLPackage.STATE_MACHINE__OWNED_OPERATION, UMLPackage.STATE_MACHINE__NESTED_CLASSIFIER, UMLPackage.STATE_MACHINE__OWNED_RECEPTION, UMLPackage.STATE_MACHINE__OWNED_PARAMETER,
+			UMLPackage.STATE_MACHINE__OWNED_PARAMETER_SET, UMLPackage.STATE_MACHINE__CONNECTION_POINT, UMLPackage.STATE_MACHINE__REGION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1678,17 +1477,14 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Classifier> getRedefinedClassifiers() {
-		return (EList<Classifier>) eDynamicGet(
-			UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CLASSIFIER__REDEFINED_CLASSIFIER, true, true);
+		return (EList<Classifier>) eDynamicGet(UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CLASSIFIER__REDEFINED_CLASSIFIER, true, true);
 	}
 
 	private EList<Classifier> createRedefinedClassifiersList() {
 		return new SubsetSupersetEObjectResolvingEList<Classifier>(
-			Classifier.class, this,
-			UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER, null,
-			REDEFINED_CLASSIFIER_ESUBSETS);
+				Classifier.class, this,
+				UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER, null,
+				REDEFINED_CLASSIFIER_ESUBSETS);
 	}
 
 	/**
@@ -1699,9 +1495,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_CLASSIFIER_ESUBSETS = new int[]{
-		UMLPackage.STATE_MACHINE__REDEFINED_BEHAVIOR,
-		UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE};
+	protected static final int[] REDEFINED_CLASSIFIER_ESUBSETS = new int[] { UMLPackage.STATE_MACHINE__REDEFINED_BEHAVIOR, UMLPackage.STATE_MACHINE__EXTENDED_STATE_MACHINE };
 
 	/**
 	 * The array of superset feature identifiers for the '{@link #getExtendedStateMachines() <em>Extended State Machine</em>}' reference list.
@@ -1711,8 +1505,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] EXTENDED_STATE_MACHINE_ESUPERSETS = new int[]{
-		UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER};
+	protected static final int[] EXTENDED_STATE_MACHINE_ESUPERSETS = new int[] { UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1722,8 +1515,8 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.STATE_MACHINE__CONNECTION_POINT)
-			|| eIsSet(UMLPackage.STATE_MACHINE__REGION);
+				|| eIsSet(UMLPackage.STATE_MACHINE__CONNECTION_POINT)
+				|| eIsSet(UMLPackage.STATE_MACHINE__REGION);
 	}
 
 	/**
@@ -1746,8 +1539,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_BEHAVIOR_ESUPERSETS = new int[]{
-		UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER};
+	protected static final int[] REDEFINED_BEHAVIOR_ESUPERSETS = new int[] { UMLPackage.STATE_MACHINE__REDEFINED_CLASSIFIER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1766,8 +1558,7 @@
 	@Override
 	public boolean isRedefinitionContextValid(
 			RedefinableElement redefinedElement) {
-		return StateMachineOperations.isRedefinitionContextValid(this,
-			redefinedElement);
+		return StateMachineOperations.isRedefinitionContextValid(this, redefinedElement);
 	}
 
 } //StateMachineImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StereotypeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StereotypeImpl.java
index c318403..d75d755 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StereotypeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StereotypeImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -28,6 +28,7 @@
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -119,20 +120,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.STEREOTYPE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.STEREOTYPE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.STEREOTYPE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.STEREOTYPE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -143,19 +137,9 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.STEREOTYPE__OWNED_COMMENT,
-		UMLPackage.STEREOTYPE__NAME_EXPRESSION,
-		UMLPackage.STEREOTYPE__ELEMENT_IMPORT,
-		UMLPackage.STEREOTYPE__PACKAGE_IMPORT,
-		UMLPackage.STEREOTYPE__OWNED_MEMBER,
-		UMLPackage.STEREOTYPE__TEMPLATE_BINDING,
-		UMLPackage.STEREOTYPE__OWNED_TEMPLATE_SIGNATURE,
-		UMLPackage.STEREOTYPE__COLLABORATION_USE,
-		UMLPackage.STEREOTYPE__GENERALIZATION,
-		UMLPackage.STEREOTYPE__SUBSTITUTION,
-		UMLPackage.STEREOTYPE__INTERFACE_REALIZATION,
-		UMLPackage.STEREOTYPE__ICON};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.STEREOTYPE__OWNED_COMMENT, UMLPackage.STEREOTYPE__NAME_EXPRESSION, UMLPackage.STEREOTYPE__ELEMENT_IMPORT, UMLPackage.STEREOTYPE__PACKAGE_IMPORT,
+			UMLPackage.STEREOTYPE__OWNED_MEMBER, UMLPackage.STEREOTYPE__TEMPLATE_BINDING, UMLPackage.STEREOTYPE__OWNED_TEMPLATE_SIGNATURE, UMLPackage.STEREOTYPE__COLLABORATION_USE, UMLPackage.STEREOTYPE__GENERALIZATION, UMLPackage.STEREOTYPE__SUBSTITUTION,
+			UMLPackage.STEREOTYPE__INTERFACE_REALIZATION, UMLPackage.STEREOTYPE__ICON };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -164,9 +148,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Image> getIcons() {
-		return (EList<Image>) eDynamicGet(
-			UMLPackage.STEREOTYPE__ICON - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STEREOTYPE__ICON, true, true);
+		return (EList<Image>) eDynamicGet(UMLPackage.STEREOTYPE__ICON - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STEREOTYPE__ICON, true, true);
 	}
 
 	/**
@@ -187,8 +169,7 @@
 	 */
 	public boolean validateNameNotClash(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StereotypeOperations.validateNameNotClash(this, diagnostics,
-			context);
+		return StereotypeOperations.validateNameNotClash(this, diagnostics, context);
 	}
 
 	/**
@@ -198,8 +179,7 @@
 	 */
 	public boolean validateAssociationEndOwnership(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StereotypeOperations.validateAssociationEndOwnership(this,
-			diagnostics, context);
+		return StereotypeOperations.validateAssociationEndOwnership(this, diagnostics, context);
 	}
 
 	/**
@@ -209,8 +189,7 @@
 	 */
 	public boolean validateBasePropertyUpperBound(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StereotypeOperations.validateBasePropertyUpperBound(this,
-			diagnostics, context);
+		return StereotypeOperations.validateBasePropertyUpperBound(this, diagnostics, context);
 	}
 
 	/**
@@ -220,9 +199,7 @@
 	 */
 	public boolean validateBasePropertyMultiplicitySingleExtension(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return StereotypeOperations
-			.validateBasePropertyMultiplicitySingleExtension(this, diagnostics,
-				context);
+		return StereotypeOperations.validateBasePropertyMultiplicitySingleExtension(this, diagnostics, context);
 	}
 
 	/**
@@ -232,9 +209,7 @@
 	 */
 	public boolean validateBasePropertyMultiplicityMultipleExtension(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return StereotypeOperations
-			.validateBasePropertyMultiplicityMultipleExtension(this,
-				diagnostics, context);
+		return StereotypeOperations.validateBasePropertyMultiplicityMultipleExtension(this, diagnostics, context);
 	}
 
 	/**
@@ -244,8 +219,7 @@
 	 */
 	public boolean validateGeneralize(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StereotypeOperations.validateGeneralize(this, diagnostics,
-			context);
+		return StereotypeOperations.validateGeneralize(this, diagnostics, context);
 	}
 
 	/**
@@ -255,8 +229,7 @@
 	 */
 	public Extension createExtension(org.eclipse.uml2.uml.Class metaclass,
 			boolean isRequired) {
-		return StereotypeOperations.createExtension(this, metaclass,
-			isRequired);
+		return StereotypeOperations.createExtension(this, metaclass, isRequired);
 	}
 
 	/**
@@ -266,9 +239,7 @@
 	 */
 	public Profile getProfile() {
 		Profile profile = basicGetProfile();
-		return profile != null && profile.eIsProxy()
-			? (Profile) eResolveProxy((InternalEObject) profile)
-			: profile;
+		return profile != null && profile.eIsProxy() ? (Profile) eResolveProxy((InternalEObject) profile) : profile;
 	}
 
 	/**
@@ -287,8 +258,7 @@
 	 */
 	public boolean validateBinaryAssociationsOnly(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StereotypeOperations.validateBinaryAssociationsOnly(this,
-			diagnostics, context);
+		return StereotypeOperations.validateBinaryAssociationsOnly(this, diagnostics, context);
 	}
 
 	/**
@@ -327,13 +297,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<org.eclipse.uml2.uml.Class> result = (EList<org.eclipse.uml2.uml.Class>) cache
-				.get(this,
-					UMLPackage.Literals.STEREOTYPE___GET_EXTENDED_METACLASSES);
+			EList<org.eclipse.uml2.uml.Class> result = (EList<org.eclipse.uml2.uml.Class>) cache.get(this, UMLPackage.Literals.STEREOTYPE___GET_EXTENDED_METACLASSES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.STEREOTYPE___GET_EXTENDED_METACLASSES,
-					result = StereotypeOperations.getExtendedMetaclasses(this));
+				cache.put(this, UMLPackage.Literals.STEREOTYPE___GET_EXTENDED_METACLASSES, result = StereotypeOperations.getExtendedMetaclasses(this));
 			}
 			return result;
 		}
@@ -349,14 +315,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<org.eclipse.uml2.uml.Class> result = (EList<org.eclipse.uml2.uml.Class>) cache
-				.get(this,
-					UMLPackage.Literals.STEREOTYPE___GET_ALL_EXTENDED_METACLASSES);
+			EList<org.eclipse.uml2.uml.Class> result = (EList<org.eclipse.uml2.uml.Class>) cache.get(this, UMLPackage.Literals.STEREOTYPE___GET_ALL_EXTENDED_METACLASSES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.STEREOTYPE___GET_ALL_EXTENDED_METACLASSES,
-					result = StereotypeOperations
-						.getAllExtendedMetaclasses(this));
+				cache.put(this, UMLPackage.Literals.STEREOTYPE___GET_ALL_EXTENDED_METACLASSES, result = StereotypeOperations.getAllExtendedMetaclasses(this));
 			}
 			return result;
 		}
@@ -399,74 +360,54 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.STEREOTYPE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.STEREOTYPE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.STEREOTYPE__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.STEREOTYPE__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__OWNED_CONNECTOR :
-				return ((InternalEList<?>) getOwnedConnectors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__INTERFACE_REALIZATION :
-				return ((InternalEList<?>) getInterfaceRealizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__OWNED_BEHAVIOR :
-				return ((InternalEList<?>) getOwnedBehaviors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__OWNED_OPERATION :
-				return ((InternalEList<?>) getOwnedOperations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__NESTED_CLASSIFIER :
-				return ((InternalEList<?>) getNestedClassifiers())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__OWNED_RECEPTION :
-				return ((InternalEList<?>) getOwnedReceptions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STEREOTYPE__ICON :
-				return ((InternalEList<?>) getIcons()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.STEREOTYPE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.STEREOTYPE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.STEREOTYPE__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__OWNED_CONNECTOR:
+			return ((InternalEList<?>) getOwnedConnectors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__INTERFACE_REALIZATION:
+			return ((InternalEList<?>) getInterfaceRealizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__OWNED_BEHAVIOR:
+			return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__OWNED_OPERATION:
+			return ((InternalEList<?>) getOwnedOperations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__NESTED_CLASSIFIER:
+			return ((InternalEList<?>) getNestedClassifiers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__OWNED_RECEPTION:
+			return ((InternalEList<?>) getOwnedReceptions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STEREOTYPE__ICON:
+			return ((InternalEList<?>) getIcons()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -479,134 +420,134 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.STEREOTYPE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.STEREOTYPE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.STEREOTYPE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.STEREOTYPE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.STEREOTYPE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.STEREOTYPE__NAME :
-				return getName();
-			case UMLPackage.STEREOTYPE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.STEREOTYPE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.STEREOTYPE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STEREOTYPE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.STEREOTYPE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.STEREOTYPE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.STEREOTYPE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.STEREOTYPE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.STEREOTYPE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.STEREOTYPE__MEMBER :
-				return getMembers();
-			case UMLPackage.STEREOTYPE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.STEREOTYPE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.STEREOTYPE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.STEREOTYPE__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.STEREOTYPE__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.STEREOTYPE__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.STEREOTYPE__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.STEREOTYPE__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.STEREOTYPE__FEATURE :
-				return getFeatures();
-			case UMLPackage.STEREOTYPE__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.STEREOTYPE__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.STEREOTYPE__GENERAL :
-				return getGenerals();
-			case UMLPackage.STEREOTYPE__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.STEREOTYPE__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.STEREOTYPE__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.STEREOTYPE__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.STEREOTYPE__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.STEREOTYPE__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.STEREOTYPE__USE_CASE :
-				return getUseCases();
-			case UMLPackage.STEREOTYPE__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.STEREOTYPE__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.STEREOTYPE__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.STEREOTYPE__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.STEREOTYPE__OWNED_CONNECTOR :
-				return getOwnedConnectors();
-			case UMLPackage.STEREOTYPE__PART :
-				return getParts();
-			case UMLPackage.STEREOTYPE__ROLE :
-				return getRoles();
-			case UMLPackage.STEREOTYPE__OWNED_PORT :
-				return getOwnedPorts();
-			case UMLPackage.STEREOTYPE__CLASSIFIER_BEHAVIOR :
-				if (resolve)
-					return getClassifierBehavior();
-				return basicGetClassifierBehavior();
-			case UMLPackage.STEREOTYPE__INTERFACE_REALIZATION :
-				return getInterfaceRealizations();
-			case UMLPackage.STEREOTYPE__OWNED_BEHAVIOR :
-				return getOwnedBehaviors();
-			case UMLPackage.STEREOTYPE__OWNED_OPERATION :
-				return getOwnedOperations();
-			case UMLPackage.STEREOTYPE__EXTENSION :
-				return getExtensions();
-			case UMLPackage.STEREOTYPE__IS_ACTIVE :
-				return isActive();
-			case UMLPackage.STEREOTYPE__NESTED_CLASSIFIER :
-				return getNestedClassifiers();
-			case UMLPackage.STEREOTYPE__OWNED_RECEPTION :
-				return getOwnedReceptions();
-			case UMLPackage.STEREOTYPE__SUPER_CLASS :
-				return getSuperClasses();
-			case UMLPackage.STEREOTYPE__ICON :
-				return getIcons();
-			case UMLPackage.STEREOTYPE__PROFILE :
-				if (resolve)
-					return getProfile();
-				return basicGetProfile();
+		case UMLPackage.STEREOTYPE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.STEREOTYPE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.STEREOTYPE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.STEREOTYPE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.STEREOTYPE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.STEREOTYPE__NAME:
+			return getName();
+		case UMLPackage.STEREOTYPE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.STEREOTYPE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.STEREOTYPE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STEREOTYPE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.STEREOTYPE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.STEREOTYPE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.STEREOTYPE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.STEREOTYPE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.STEREOTYPE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.STEREOTYPE__MEMBER:
+			return getMembers();
+		case UMLPackage.STEREOTYPE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.STEREOTYPE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.STEREOTYPE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.STEREOTYPE__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.STEREOTYPE__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.STEREOTYPE__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.STEREOTYPE__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.STEREOTYPE__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.STEREOTYPE__FEATURE:
+			return getFeatures();
+		case UMLPackage.STEREOTYPE__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.STEREOTYPE__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.STEREOTYPE__GENERAL:
+			return getGenerals();
+		case UMLPackage.STEREOTYPE__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.STEREOTYPE__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.STEREOTYPE__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.STEREOTYPE__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.STEREOTYPE__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.STEREOTYPE__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.STEREOTYPE__USE_CASE:
+			return getUseCases();
+		case UMLPackage.STEREOTYPE__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.STEREOTYPE__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.STEREOTYPE__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.STEREOTYPE__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.STEREOTYPE__OWNED_CONNECTOR:
+			return getOwnedConnectors();
+		case UMLPackage.STEREOTYPE__PART:
+			return getParts();
+		case UMLPackage.STEREOTYPE__ROLE:
+			return getRoles();
+		case UMLPackage.STEREOTYPE__OWNED_PORT:
+			return getOwnedPorts();
+		case UMLPackage.STEREOTYPE__CLASSIFIER_BEHAVIOR:
+			if (resolve)
+				return getClassifierBehavior();
+			return basicGetClassifierBehavior();
+		case UMLPackage.STEREOTYPE__INTERFACE_REALIZATION:
+			return getInterfaceRealizations();
+		case UMLPackage.STEREOTYPE__OWNED_BEHAVIOR:
+			return getOwnedBehaviors();
+		case UMLPackage.STEREOTYPE__OWNED_OPERATION:
+			return getOwnedOperations();
+		case UMLPackage.STEREOTYPE__EXTENSION:
+			return getExtensions();
+		case UMLPackage.STEREOTYPE__IS_ACTIVE:
+			return isActive();
+		case UMLPackage.STEREOTYPE__NESTED_CLASSIFIER:
+			return getNestedClassifiers();
+		case UMLPackage.STEREOTYPE__OWNED_RECEPTION:
+			return getOwnedReceptions();
+		case UMLPackage.STEREOTYPE__SUPER_CLASS:
+			return getSuperClasses();
+		case UMLPackage.STEREOTYPE__ICON:
+			return getIcons();
+		case UMLPackage.STEREOTYPE__PROFILE:
+			if (resolve)
+				return getProfile();
+			return basicGetProfile();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -620,158 +561,137 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.STEREOTYPE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				getOwnedConnectors()
-					.addAll((Collection<? extends Connector>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll(
-					(Collection<? extends InterfaceRealization>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				getOwnedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				getOwnedOperations()
-					.addAll((Collection<? extends Operation>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__IS_ACTIVE :
-				setIsActive((Boolean) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				getNestedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				getOwnedReceptions()
-					.addAll((Collection<? extends Reception>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__SUPER_CLASS :
-				getSuperClasses().clear();
-				getSuperClasses().addAll(
-					(Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
-				return;
-			case UMLPackage.STEREOTYPE__ICON :
-				getIcons().clear();
-				getIcons().addAll((Collection<? extends Image>) newValue);
-				return;
+		case UMLPackage.STEREOTYPE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			getOwnedConnectors().addAll((Collection<? extends Connector>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			getInterfaceRealizations().addAll((Collection<? extends InterfaceRealization>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			getOwnedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			getOwnedOperations().addAll((Collection<? extends Operation>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__IS_ACTIVE:
+			setIsActive((Boolean) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			getNestedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			getOwnedReceptions().addAll((Collection<? extends Reception>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__SUPER_CLASS:
+			getSuperClasses().clear();
+			getSuperClasses().addAll((Collection<? extends org.eclipse.uml2.uml.Class>) newValue);
+			return;
+		case UMLPackage.STEREOTYPE__ICON:
+			getIcons().clear();
+			getIcons().addAll((Collection<? extends Image>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -784,114 +704,114 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STEREOTYPE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.STEREOTYPE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.STEREOTYPE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.STEREOTYPE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.STEREOTYPE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.STEREOTYPE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.STEREOTYPE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.STEREOTYPE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.STEREOTYPE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.STEREOTYPE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.STEREOTYPE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.STEREOTYPE__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.STEREOTYPE__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.STEREOTYPE__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.STEREOTYPE__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.STEREOTYPE__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.STEREOTYPE__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.STEREOTYPE__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.STEREOTYPE__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.STEREOTYPE__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.STEREOTYPE__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				return;
-			case UMLPackage.STEREOTYPE__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) null);
-				return;
-			case UMLPackage.STEREOTYPE__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_OPERATION :
-				getOwnedOperations().clear();
-				return;
-			case UMLPackage.STEREOTYPE__IS_ACTIVE :
-				setIsActive(IS_ACTIVE_EDEFAULT);
-				return;
-			case UMLPackage.STEREOTYPE__NESTED_CLASSIFIER :
-				getNestedClassifiers().clear();
-				return;
-			case UMLPackage.STEREOTYPE__OWNED_RECEPTION :
-				getOwnedReceptions().clear();
-				return;
-			case UMLPackage.STEREOTYPE__SUPER_CLASS :
-				getSuperClasses().clear();
-				return;
-			case UMLPackage.STEREOTYPE__ICON :
-				getIcons().clear();
-				return;
+		case UMLPackage.STEREOTYPE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.STEREOTYPE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.STEREOTYPE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.STEREOTYPE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.STEREOTYPE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.STEREOTYPE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.STEREOTYPE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.STEREOTYPE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.STEREOTYPE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.STEREOTYPE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.STEREOTYPE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.STEREOTYPE__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.STEREOTYPE__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.STEREOTYPE__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.STEREOTYPE__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.STEREOTYPE__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.STEREOTYPE__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.STEREOTYPE__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.STEREOTYPE__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.STEREOTYPE__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.STEREOTYPE__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			return;
+		case UMLPackage.STEREOTYPE__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) null);
+			return;
+		case UMLPackage.STEREOTYPE__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_OPERATION:
+			getOwnedOperations().clear();
+			return;
+		case UMLPackage.STEREOTYPE__IS_ACTIVE:
+			setIsActive(IS_ACTIVE_EDEFAULT);
+			return;
+		case UMLPackage.STEREOTYPE__NESTED_CLASSIFIER:
+			getNestedClassifiers().clear();
+			return;
+		case UMLPackage.STEREOTYPE__OWNED_RECEPTION:
+			getOwnedReceptions().clear();
+			return;
+		case UMLPackage.STEREOTYPE__SUPER_CLASS:
+			getSuperClasses().clear();
+			return;
+		case UMLPackage.STEREOTYPE__ICON:
+			getIcons().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -904,116 +824,114 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STEREOTYPE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.STEREOTYPE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.STEREOTYPE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.STEREOTYPE__OWNER :
-				return isSetOwner();
-			case UMLPackage.STEREOTYPE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.STEREOTYPE__NAME :
-				return isSetName();
-			case UMLPackage.STEREOTYPE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.STEREOTYPE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.STEREOTYPE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.STEREOTYPE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.STEREOTYPE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.STEREOTYPE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.STEREOTYPE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.STEREOTYPE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.STEREOTYPE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.STEREOTYPE__MEMBER :
-				return isSetMembers();
-			case UMLPackage.STEREOTYPE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.STEREOTYPE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.STEREOTYPE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.STEREOTYPE__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.STEREOTYPE__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.STEREOTYPE__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.STEREOTYPE__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.STEREOTYPE__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.STEREOTYPE__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.STEREOTYPE__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.STEREOTYPE__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.STEREOTYPE__GENERAL :
-				return isSetGenerals();
-			case UMLPackage.STEREOTYPE__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.STEREOTYPE__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.STEREOTYPE__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.STEREOTYPE__IS_ABSTRACT :
-				return isSetIsAbstract();
-			case UMLPackage.STEREOTYPE__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.STEREOTYPE__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.STEREOTYPE__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.STEREOTYPE__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.STEREOTYPE__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.STEREOTYPE__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.STEREOTYPE__OWNED_ATTRIBUTE :
-				return isSetOwnedAttributes();
-			case UMLPackage.STEREOTYPE__OWNED_CONNECTOR :
-				return !getOwnedConnectors().isEmpty();
-			case UMLPackage.STEREOTYPE__PART :
-				return !getParts().isEmpty();
-			case UMLPackage.STEREOTYPE__ROLE :
-				return isSetRoles();
-			case UMLPackage.STEREOTYPE__OWNED_PORT :
-				return !getOwnedPorts().isEmpty();
-			case UMLPackage.STEREOTYPE__CLASSIFIER_BEHAVIOR :
-				return basicGetClassifierBehavior() != null;
-			case UMLPackage.STEREOTYPE__INTERFACE_REALIZATION :
-				return !getInterfaceRealizations().isEmpty();
-			case UMLPackage.STEREOTYPE__OWNED_BEHAVIOR :
-				return !getOwnedBehaviors().isEmpty();
-			case UMLPackage.STEREOTYPE__OWNED_OPERATION :
-				return !getOwnedOperations().isEmpty();
-			case UMLPackage.STEREOTYPE__EXTENSION :
-				return !getExtensions().isEmpty();
-			case UMLPackage.STEREOTYPE__IS_ACTIVE :
-				return isActive() != IS_ACTIVE_EDEFAULT;
-			case UMLPackage.STEREOTYPE__NESTED_CLASSIFIER :
-				return !getNestedClassifiers().isEmpty();
-			case UMLPackage.STEREOTYPE__OWNED_RECEPTION :
-				return !getOwnedReceptions().isEmpty();
-			case UMLPackage.STEREOTYPE__SUPER_CLASS :
-				return isSetSuperClasses();
-			case UMLPackage.STEREOTYPE__ICON :
-				return !getIcons().isEmpty();
-			case UMLPackage.STEREOTYPE__PROFILE :
-				return basicGetProfile() != null;
+		case UMLPackage.STEREOTYPE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.STEREOTYPE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.STEREOTYPE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.STEREOTYPE__OWNER:
+			return isSetOwner();
+		case UMLPackage.STEREOTYPE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.STEREOTYPE__NAME:
+			return isSetName();
+		case UMLPackage.STEREOTYPE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.STEREOTYPE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.STEREOTYPE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.STEREOTYPE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.STEREOTYPE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.STEREOTYPE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.STEREOTYPE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.STEREOTYPE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.STEREOTYPE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.STEREOTYPE__MEMBER:
+			return isSetMembers();
+		case UMLPackage.STEREOTYPE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.STEREOTYPE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.STEREOTYPE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.STEREOTYPE__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.STEREOTYPE__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.STEREOTYPE__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.STEREOTYPE__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.STEREOTYPE__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.STEREOTYPE__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.STEREOTYPE__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.STEREOTYPE__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.STEREOTYPE__GENERAL:
+			return isSetGenerals();
+		case UMLPackage.STEREOTYPE__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.STEREOTYPE__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.STEREOTYPE__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.STEREOTYPE__IS_ABSTRACT:
+			return isSetIsAbstract();
+		case UMLPackage.STEREOTYPE__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.STEREOTYPE__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.STEREOTYPE__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.STEREOTYPE__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.STEREOTYPE__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.STEREOTYPE__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.STEREOTYPE__OWNED_ATTRIBUTE:
+			return isSetOwnedAttributes();
+		case UMLPackage.STEREOTYPE__OWNED_CONNECTOR:
+			return !getOwnedConnectors().isEmpty();
+		case UMLPackage.STEREOTYPE__PART:
+			return !getParts().isEmpty();
+		case UMLPackage.STEREOTYPE__ROLE:
+			return isSetRoles();
+		case UMLPackage.STEREOTYPE__OWNED_PORT:
+			return !getOwnedPorts().isEmpty();
+		case UMLPackage.STEREOTYPE__CLASSIFIER_BEHAVIOR:
+			return basicGetClassifierBehavior() != null;
+		case UMLPackage.STEREOTYPE__INTERFACE_REALIZATION:
+			return !getInterfaceRealizations().isEmpty();
+		case UMLPackage.STEREOTYPE__OWNED_BEHAVIOR:
+			return !getOwnedBehaviors().isEmpty();
+		case UMLPackage.STEREOTYPE__OWNED_OPERATION:
+			return !getOwnedOperations().isEmpty();
+		case UMLPackage.STEREOTYPE__EXTENSION:
+			return !getExtensions().isEmpty();
+		case UMLPackage.STEREOTYPE__IS_ACTIVE:
+			return isActive() != IS_ACTIVE_EDEFAULT;
+		case UMLPackage.STEREOTYPE__NESTED_CLASSIFIER:
+			return !getNestedClassifiers().isEmpty();
+		case UMLPackage.STEREOTYPE__OWNED_RECEPTION:
+			return !getOwnedReceptions().isEmpty();
+		case UMLPackage.STEREOTYPE__SUPER_CLASS:
+			return isSetSuperClasses();
+		case UMLPackage.STEREOTYPE__ICON:
+			return !getIcons().isEmpty();
+		case UMLPackage.STEREOTYPE__PROFILE:
+			return basicGetProfile() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1028,351 +946,275 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.STEREOTYPE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.STEREOTYPE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.STEREOTYPE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STEREOTYPE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.STEREOTYPE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.STEREOTYPE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.STEREOTYPE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.STEREOTYPE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.STEREOTYPE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.STEREOTYPE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.STEREOTYPE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STEREOTYPE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.STEREOTYPE___GET_MODEL :
-				return getModel();
-			case UMLPackage.STEREOTYPE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.STEREOTYPE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.STEREOTYPE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.STEREOTYPE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.STEREOTYPE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.STEREOTYPE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.STEREOTYPE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STEREOTYPE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.STEREOTYPE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.STEREOTYPE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.STEREOTYPE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STEREOTYPE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STEREOTYPE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.STEREOTYPE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STEREOTYPE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.STEREOTYPE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.STEREOTYPE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.STEREOTYPE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.STEREOTYPE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.STEREOTYPE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STEREOTYPE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.STEREOTYPE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.STEREOTYPE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.STEREOTYPE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.STEREOTYPE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.STEREOTYPE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.STEREOTYPE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.STEREOTYPE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.STEREOTYPE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.STEREOTYPE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.STEREOTYPE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STEREOTYPE___SEPARATOR :
-				return separator();
-			case UMLPackage.STEREOTYPE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.STEREOTYPE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.STEREOTYPE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.STEREOTYPE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.STEREOTYPE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.STEREOTYPE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.STEREOTYPE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.STEREOTYPE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.STEREOTYPE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.STEREOTYPE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.STEREOTYPE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.STEREOTYPE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.STEREOTYPE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.STEREOTYPE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.STEREOTYPE___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.STEREOTYPE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.STEREOTYPE___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.STEREOTYPE___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.STEREOTYPE___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.STEREOTYPE___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.STEREOTYPE___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.STEREOTYPE___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.STEREOTYPE___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.STEREOTYPE___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.STEREOTYPE___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.STEREOTYPE___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.STEREOTYPE___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.STEREOTYPE___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.STEREOTYPE___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.STEREOTYPE___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.STEREOTYPE___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.STEREOTYPE___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.STEREOTYPE___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.STEREOTYPE___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.STEREOTYPE___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.STEREOTYPE___PARENTS :
-				return parents();
-			case UMLPackage.STEREOTYPE___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.STEREOTYPE___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.STEREOTYPE___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.STEREOTYPE___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.STEREOTYPE___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.STEREOTYPE___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.STEREOTYPE___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.STEREOTYPE___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.STEREOTYPE___GET_PARTS :
-				return getParts();
-			case UMLPackage.STEREOTYPE___ALL_ROLES :
-				return allRoles();
-			case UMLPackage.STEREOTYPE___GET_OWNED_PORTS :
-				return getOwnedPorts();
-			case UMLPackage.STEREOTYPE___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateClassBehavior((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___GET_ALL_IMPLEMENTED_INTERFACES :
-				return getAllImplementedInterfaces();
-			case UMLPackage.STEREOTYPE___GET_IMPLEMENTED_INTERFACES :
-				return getImplementedInterfaces();
-			case UMLPackage.STEREOTYPE___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP :
-				return validatePassiveClass((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE :
-				return createOwnedOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Type) arguments.get(3));
-			case UMLPackage.STEREOTYPE___IS_METACLASS :
-				return isMetaclass();
-			case UMLPackage.STEREOTYPE___GET_EXTENSIONS :
-				return getExtensions();
-			case UMLPackage.STEREOTYPE___GET_SUPER_CLASSES :
-				return getSuperClasses();
-			case UMLPackage.STEREOTYPE___VALIDATE_BINARY_ASSOCIATIONS_ONLY__DIAGNOSTICCHAIN_MAP :
-				return validateBinaryAssociationsOnly(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_GENERALIZE__DIAGNOSTICCHAIN_MAP :
-				return validateGeneralize((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_NAME_NOT_CLASH__DIAGNOSTICCHAIN_MAP :
-				return validateNameNotClash((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_ASSOCIATION_END_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateAssociationEndOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_BASE_PROPERTY_UPPER_BOUND__DIAGNOSTICCHAIN_MAP :
-				return validateBasePropertyUpperBound(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_BASE_PROPERTY_MULTIPLICITY_SINGLE_EXTENSION__DIAGNOSTICCHAIN_MAP :
-				return validateBasePropertyMultiplicitySingleExtension(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___VALIDATE_BASE_PROPERTY_MULTIPLICITY_MULTIPLE_EXTENSION__DIAGNOSTICCHAIN_MAP :
-				return validateBasePropertyMultiplicityMultipleExtension(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STEREOTYPE___CREATE_EXTENSION__CLASS_BOOLEAN :
-				return createExtension(
-					(org.eclipse.uml2.uml.Class) arguments.get(0),
-					(Boolean) arguments.get(1));
-			case UMLPackage.STEREOTYPE___CREATE_ICON__STRING :
-				return createIcon((String) arguments.get(0));
-			case UMLPackage.STEREOTYPE___CREATE_ICON__STRING_STRING :
-				return createIcon((String) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STEREOTYPE___GET_ALL_EXTENDED_METACLASSES :
-				return getAllExtendedMetaclasses();
-			case UMLPackage.STEREOTYPE___GET_DEFINITION :
-				return getDefinition();
-			case UMLPackage.STEREOTYPE___GET_EXTENDED_METACLASSES :
-				return getExtendedMetaclasses();
-			case UMLPackage.STEREOTYPE___GET_KEYWORD :
-				return getKeyword();
-			case UMLPackage.STEREOTYPE___GET_KEYWORD__BOOLEAN :
-				return getKeyword((Boolean) arguments.get(0));
-			case UMLPackage.STEREOTYPE___CONTAINING_PROFILE :
-				return containingProfile();
-			case UMLPackage.STEREOTYPE___GET_PROFILE :
-				return getProfile();
+		case UMLPackage.STEREOTYPE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.STEREOTYPE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.STEREOTYPE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STEREOTYPE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.STEREOTYPE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.STEREOTYPE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.STEREOTYPE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.STEREOTYPE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.STEREOTYPE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.STEREOTYPE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.STEREOTYPE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STEREOTYPE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.STEREOTYPE___GET_MODEL:
+			return getModel();
+		case UMLPackage.STEREOTYPE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.STEREOTYPE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.STEREOTYPE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.STEREOTYPE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.STEREOTYPE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.STEREOTYPE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.STEREOTYPE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STEREOTYPE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.STEREOTYPE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.STEREOTYPE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.STEREOTYPE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STEREOTYPE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STEREOTYPE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.STEREOTYPE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STEREOTYPE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.STEREOTYPE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.STEREOTYPE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.STEREOTYPE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.STEREOTYPE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.STEREOTYPE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STEREOTYPE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.STEREOTYPE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.STEREOTYPE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.STEREOTYPE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.STEREOTYPE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.STEREOTYPE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.STEREOTYPE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.STEREOTYPE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.STEREOTYPE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.STEREOTYPE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.STEREOTYPE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STEREOTYPE___SEPARATOR:
+			return separator();
+		case UMLPackage.STEREOTYPE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.STEREOTYPE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.STEREOTYPE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.STEREOTYPE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.STEREOTYPE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.STEREOTYPE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.STEREOTYPE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.STEREOTYPE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.STEREOTYPE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.STEREOTYPE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.STEREOTYPE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.STEREOTYPE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.STEREOTYPE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.STEREOTYPE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.STEREOTYPE___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.STEREOTYPE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.STEREOTYPE___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.STEREOTYPE___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.STEREOTYPE___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.STEREOTYPE___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.STEREOTYPE___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.STEREOTYPE___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.STEREOTYPE___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.STEREOTYPE___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.STEREOTYPE___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.STEREOTYPE___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.STEREOTYPE___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.STEREOTYPE___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.STEREOTYPE___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.STEREOTYPE___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.STEREOTYPE___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.STEREOTYPE___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.STEREOTYPE___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.STEREOTYPE___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.STEREOTYPE___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.STEREOTYPE___PARENTS:
+			return parents();
+		case UMLPackage.STEREOTYPE___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.STEREOTYPE___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.STEREOTYPE___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.STEREOTYPE___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.STEREOTYPE___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.STEREOTYPE___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.STEREOTYPE___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.STEREOTYPE___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.STEREOTYPE___GET_PARTS:
+			return getParts();
+		case UMLPackage.STEREOTYPE___ALL_ROLES:
+			return allRoles();
+		case UMLPackage.STEREOTYPE___GET_OWNED_PORTS:
+			return getOwnedPorts();
+		case UMLPackage.STEREOTYPE___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateClassBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___GET_ALL_IMPLEMENTED_INTERFACES:
+			return getAllImplementedInterfaces();
+		case UMLPackage.STEREOTYPE___GET_IMPLEMENTED_INTERFACES:
+			return getImplementedInterfaces();
+		case UMLPackage.STEREOTYPE___VALIDATE_PASSIVE_CLASS__DIAGNOSTICCHAIN_MAP:
+			return validatePassiveClass((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___CREATE_OWNED_OPERATION__STRING_ELIST_ELIST_TYPE:
+			return createOwnedOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Type) arguments.get(3));
+		case UMLPackage.STEREOTYPE___IS_METACLASS:
+			return isMetaclass();
+		case UMLPackage.STEREOTYPE___GET_EXTENSIONS:
+			return getExtensions();
+		case UMLPackage.STEREOTYPE___GET_SUPER_CLASSES:
+			return getSuperClasses();
+		case UMLPackage.STEREOTYPE___VALIDATE_BINARY_ASSOCIATIONS_ONLY__DIAGNOSTICCHAIN_MAP:
+			return validateBinaryAssociationsOnly((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_GENERALIZE__DIAGNOSTICCHAIN_MAP:
+			return validateGeneralize((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_NAME_NOT_CLASH__DIAGNOSTICCHAIN_MAP:
+			return validateNameNotClash((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_ASSOCIATION_END_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateAssociationEndOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_BASE_PROPERTY_UPPER_BOUND__DIAGNOSTICCHAIN_MAP:
+			return validateBasePropertyUpperBound((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_BASE_PROPERTY_MULTIPLICITY_SINGLE_EXTENSION__DIAGNOSTICCHAIN_MAP:
+			return validateBasePropertyMultiplicitySingleExtension((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___VALIDATE_BASE_PROPERTY_MULTIPLICITY_MULTIPLE_EXTENSION__DIAGNOSTICCHAIN_MAP:
+			return validateBasePropertyMultiplicityMultipleExtension((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STEREOTYPE___CREATE_EXTENSION__CLASS_BOOLEAN:
+			return createExtension((org.eclipse.uml2.uml.Class) arguments.get(0), (Boolean) arguments.get(1));
+		case UMLPackage.STEREOTYPE___CREATE_ICON__STRING:
+			return createIcon((String) arguments.get(0));
+		case UMLPackage.STEREOTYPE___CREATE_ICON__STRING_STRING:
+			return createIcon((String) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STEREOTYPE___GET_ALL_EXTENDED_METACLASSES:
+			return getAllExtendedMetaclasses();
+		case UMLPackage.STEREOTYPE___GET_DEFINITION:
+			return getDefinition();
+		case UMLPackage.STEREOTYPE___GET_EXTENDED_METACLASSES:
+			return getExtendedMetaclasses();
+		case UMLPackage.STEREOTYPE___GET_KEYWORD:
+			return getKeyword();
+		case UMLPackage.STEREOTYPE___GET_KEYWORD__BOOLEAN:
+			return getKeyword((Boolean) arguments.get(0));
+		case UMLPackage.STEREOTYPE___CONTAINING_PROFILE:
+			return containingProfile();
+		case UMLPackage.STEREOTYPE___GET_PROFILE:
+			return getProfile();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1385,7 +1227,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.STEREOTYPE__ICON);
+				|| eIsSet(UMLPackage.STEREOTYPE__ICON);
 	}
 
 } //StereotypeImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StringExpressionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StringExpressionImpl.java
index 6839443..b2b9cd1 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StringExpressionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StringExpressionImpl.java
@@ -1,13 +1,13 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,8 +28,12 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -105,21 +110,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.STRING_EXPRESSION__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.STRING_EXPRESSION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.STRING_EXPRESSION__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.STRING_EXPRESSION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -129,11 +126,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<TemplateBinding> getTemplateBindings() {
-		return (EList<TemplateBinding>) eDynamicGet(
-			UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING, true,
-			true);
+		return (EList<TemplateBinding>) eDynamicGet(UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING, true, true);
 	}
 
 	/**
@@ -142,8 +135,7 @@
 	 * @generated
 	 */
 	public TemplateBinding createTemplateBinding(TemplateSignature signature) {
-		TemplateBinding newTemplateBinding = (TemplateBinding) create(
-			UMLPackage.Literals.TEMPLATE_BINDING);
+		TemplateBinding newTemplateBinding = (TemplateBinding) create(UMLPackage.Literals.TEMPLATE_BINDING);
 		getTemplateBindings().add(newTemplateBinding);
 		if (signature != null)
 			newTemplateBinding.setSignature(signature);
@@ -166,15 +158,12 @@
 	 */
 	public TemplateBinding getTemplateBinding(TemplateSignature signature,
 			boolean createOnDemand) {
-		templateBindingLoop : for (TemplateBinding templateBinding : getTemplateBindings()) {
-			if (signature != null
-				&& !signature.equals(templateBinding.getSignature()))
+		templateBindingLoop: for (TemplateBinding templateBinding : getTemplateBindings()) {
+			if (signature != null && !signature.equals(templateBinding.getSignature()))
 				continue templateBindingLoop;
 			return templateBinding;
 		}
-		return createOnDemand
-			? createTemplateBinding(signature)
-			: null;
+		return createOnDemand ? createTemplateBinding(signature) : null;
 	}
 
 	/**
@@ -183,11 +172,7 @@
 	 * @generated
 	 */
 	public TemplateSignature getOwnedTemplateSignature() {
-		return (TemplateSignature) eDynamicGet(
-			UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-			true, true);
+		return (TemplateSignature) eDynamicGet(UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, true, true);
 	}
 
 	/**
@@ -196,11 +181,7 @@
 	 * @generated
 	 */
 	public TemplateSignature basicGetOwnedTemplateSignature() {
-		return (TemplateSignature) eDynamicGet(
-			UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-			false, true);
+		return (TemplateSignature) eDynamicGet(UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, false, true);
 	}
 
 	/**
@@ -211,8 +192,7 @@
 	public NotificationChain basicSetOwnedTemplateSignature(
 			TemplateSignature newOwnedTemplateSignature,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newOwnedTemplateSignature,
-			UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newOwnedTemplateSignature, UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE, msgs);
 		return msgs;
 	}
 
@@ -223,11 +203,7 @@
 	 */
 	public void setOwnedTemplateSignature(
 			TemplateSignature newOwnedTemplateSignature) {
-		eDynamicSet(
-			UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-			newOwnedTemplateSignature);
+		eDynamicSet(UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, newOwnedTemplateSignature);
 	}
 
 	/**
@@ -236,8 +212,7 @@
 	 * @generated
 	 */
 	public TemplateSignature createOwnedTemplateSignature(EClass eClass) {
-		TemplateSignature newOwnedTemplateSignature = (TemplateSignature) create(
-			eClass);
+		TemplateSignature newOwnedTemplateSignature = (TemplateSignature) create(eClass);
 		setOwnedTemplateSignature(newOwnedTemplateSignature);
 		return newOwnedTemplateSignature;
 	}
@@ -248,8 +223,7 @@
 	 * @generated
 	 */
 	public TemplateSignature createOwnedTemplateSignature() {
-		return createOwnedTemplateSignature(
-			UMLPackage.Literals.TEMPLATE_SIGNATURE);
+		return createOwnedTemplateSignature(UMLPackage.Literals.TEMPLATE_SIGNATURE);
 	}
 
 	/**
@@ -260,9 +234,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -272,10 +244,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<StringExpression> getSubExpressions() {
-		return (EList<StringExpression>) eDynamicGet(
-			UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRING_EXPRESSION__SUB_EXPRESSION, true, true);
+		return (EList<StringExpression>) eDynamicGet(UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRING_EXPRESSION__SUB_EXPRESSION, true, true);
 	}
 
 	/**
@@ -284,8 +253,7 @@
 	 * @generated
 	 */
 	public StringExpression createSubExpression(String name, Type type) {
-		StringExpression newSubExpression = (StringExpression) create(
-			UMLPackage.Literals.STRING_EXPRESSION);
+		StringExpression newSubExpression = (StringExpression) create(UMLPackage.Literals.STRING_EXPRESSION);
 		getSubExpressions().add(newSubExpression);
 		if (name != null)
 			newSubExpression.setName(name);
@@ -310,18 +278,14 @@
 	 */
 	public StringExpression getSubExpression(String name, Type type,
 			boolean ignoreCase, boolean createOnDemand) {
-		subExpressionLoop : for (StringExpression subExpression : getSubExpressions()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(subExpression.getName())
-				: name.equals(subExpression.getName())))
+		subExpressionLoop: for (StringExpression subExpression : getSubExpressions()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(subExpression.getName()) : name.equals(subExpression.getName())))
 				continue subExpressionLoop;
 			if (type != null && !type.equals(subExpression.getType()))
 				continue subExpressionLoop;
 			return subExpression;
 		}
-		return createOnDemand
-			? createSubExpression(name, type)
-			: null;
+		return createOnDemand ? createSubExpression(name, type) : null;
 	}
 
 	/**
@@ -330,11 +294,7 @@
 	 * @generated
 	 */
 	public StringExpression getOwningExpression() {
-		return (StringExpression) eDynamicGet(
-			UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRING_EXPRESSION__OWNING_EXPRESSION, true,
-			true);
+		return (StringExpression) eDynamicGet(UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRING_EXPRESSION__OWNING_EXPRESSION, true, true);
 	}
 
 	/**
@@ -343,11 +303,7 @@
 	 * @generated
 	 */
 	public StringExpression basicGetOwningExpression() {
-		return (StringExpression) eDynamicGet(
-			UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRING_EXPRESSION__OWNING_EXPRESSION, false,
-			true);
+		return (StringExpression) eDynamicGet(UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRING_EXPRESSION__OWNING_EXPRESSION, false, true);
 	}
 
 	/**
@@ -357,8 +313,7 @@
 	 */
 	public NotificationChain basicSetOwningExpression(
 			StringExpression newOwningExpression, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newOwningExpression,
-			UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newOwningExpression, UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION, msgs);
 		return msgs;
 	}
 
@@ -368,11 +323,7 @@
 	 * @generated
 	 */
 	public void setOwningExpression(StringExpression newOwningExpression) {
-		eDynamicSet(
-			UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRING_EXPRESSION__OWNING_EXPRESSION,
-			newOwningExpression);
+		eDynamicSet(UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRING_EXPRESSION__OWNING_EXPRESSION, newOwningExpression);
 	}
 
 	/**
@@ -384,14 +335,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<ParameterableElement> result = (EList<ParameterableElement>) cache
-				.get(this,
-					UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS);
+			EList<ParameterableElement> result = (EList<ParameterableElement>) cache.get(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS,
-					result = TemplateableElementOperations
-						.parameterableElements(this));
+				cache.put(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS, result = TemplateableElementOperations.parameterableElements(this));
 			}
 			return result;
 		}
@@ -414,8 +360,7 @@
 	 */
 	public boolean validateOperands(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StringExpressionOperations.validateOperands(this, diagnostics,
-			context);
+		return StringExpressionOperations.validateOperands(this, diagnostics, context);
 	}
 
 	/**
@@ -425,8 +370,7 @@
 	 */
 	public boolean validateSubexpressions(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StringExpressionOperations.validateSubexpressions(this,
-			diagnostics, context);
+		return StringExpressionOperations.validateSubexpressions(this, diagnostics, context);
 	}
 
 	/**
@@ -449,43 +393,30 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.STRING_EXPRESSION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.STRING_EXPRESSION__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningExpression((StringExpression) otherEnd,
-					msgs);
-			case UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubExpressions())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.STRING_EXPRESSION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.STRING_EXPRESSION__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningExpression((StringExpression) otherEnd, msgs);
+		case UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubExpressions()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -499,31 +430,26 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.STRING_EXPRESSION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRING_EXPRESSION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRING_EXPRESSION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.STRING_EXPRESSION__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.STRING_EXPRESSION__OPERAND :
-				return ((InternalEList<?>) getOperands()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING :
-				return ((InternalEList<?>) getTemplateBindings())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION :
-				return basicSetOwningExpression(null, msgs);
-			case UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION :
-				return ((InternalEList<?>) getSubExpressions())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.STRING_EXPRESSION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRING_EXPRESSION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRING_EXPRESSION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.STRING_EXPRESSION__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.STRING_EXPRESSION__OPERAND:
+			return ((InternalEList<?>) getOperands()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING:
+			return ((InternalEList<?>) getTemplateBindings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION:
+			return basicSetOwningExpression(null, msgs);
+		case UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION:
+			return ((InternalEList<?>) getSubExpressions()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -537,14 +463,10 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
-			case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION,
-					StringExpression.class, msgs);
+		case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+		case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION, StringExpression.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -557,60 +479,60 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.STRING_EXPRESSION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.STRING_EXPRESSION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.STRING_EXPRESSION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.STRING_EXPRESSION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.STRING_EXPRESSION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.STRING_EXPRESSION__NAME :
-				return getName();
-			case UMLPackage.STRING_EXPRESSION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.STRING_EXPRESSION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.STRING_EXPRESSION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STRING_EXPRESSION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.STRING_EXPRESSION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.STRING_EXPRESSION__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.STRING_EXPRESSION__OPERAND :
-				return getOperands();
-			case UMLPackage.STRING_EXPRESSION__SYMBOL :
-				return getSymbol();
-			case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION :
-				if (resolve)
-					return getOwningExpression();
-				return basicGetOwningExpression();
-			case UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION :
-				return getSubExpressions();
+		case UMLPackage.STRING_EXPRESSION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.STRING_EXPRESSION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.STRING_EXPRESSION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.STRING_EXPRESSION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.STRING_EXPRESSION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.STRING_EXPRESSION__NAME:
+			return getName();
+		case UMLPackage.STRING_EXPRESSION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.STRING_EXPRESSION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.STRING_EXPRESSION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STRING_EXPRESSION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.STRING_EXPRESSION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.STRING_EXPRESSION__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.STRING_EXPRESSION__OPERAND:
+			return getOperands();
+		case UMLPackage.STRING_EXPRESSION__SYMBOL:
+			return getSymbol();
+		case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION:
+			if (resolve)
+				return getOwningExpression();
+			return basicGetOwningExpression();
+		case UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION:
+			return getSubExpressions();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -624,58 +546,53 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.STRING_EXPRESSION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.STRING_EXPRESSION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.STRING_EXPRESSION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.STRING_EXPRESSION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.STRING_EXPRESSION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.STRING_EXPRESSION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.STRING_EXPRESSION__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.STRING_EXPRESSION__OPERAND :
-				getOperands().clear();
-				getOperands().addAll(
-					(Collection<? extends ValueSpecification>) newValue);
-				return;
-			case UMLPackage.STRING_EXPRESSION__SYMBOL :
-				setSymbol((String) newValue);
-				return;
-			case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION :
-				setOwningExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION :
-				getSubExpressions().clear();
-				getSubExpressions()
-					.addAll((Collection<? extends StringExpression>) newValue);
-				return;
+		case UMLPackage.STRING_EXPRESSION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.STRING_EXPRESSION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.STRING_EXPRESSION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.STRING_EXPRESSION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.STRING_EXPRESSION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.STRING_EXPRESSION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.STRING_EXPRESSION__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.STRING_EXPRESSION__OPERAND:
+			getOperands().clear();
+			getOperands().addAll((Collection<? extends ValueSpecification>) newValue);
+			return;
+		case UMLPackage.STRING_EXPRESSION__SYMBOL:
+			setSymbol((String) newValue);
+			return;
+		case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION:
+			setOwningExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION:
+			getSubExpressions().clear();
+			getSubExpressions().addAll((Collection<? extends StringExpression>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -688,48 +605,48 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STRING_EXPRESSION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.STRING_EXPRESSION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.STRING_EXPRESSION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.STRING_EXPRESSION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.STRING_EXPRESSION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.STRING_EXPRESSION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.STRING_EXPRESSION__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.STRING_EXPRESSION__OPERAND :
-				getOperands().clear();
-				return;
-			case UMLPackage.STRING_EXPRESSION__SYMBOL :
-				unsetSymbol();
-				return;
-			case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION :
-				setOwningExpression((StringExpression) null);
-				return;
-			case UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION :
-				getSubExpressions().clear();
-				return;
+		case UMLPackage.STRING_EXPRESSION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.STRING_EXPRESSION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.STRING_EXPRESSION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.STRING_EXPRESSION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.STRING_EXPRESSION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.STRING_EXPRESSION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.STRING_EXPRESSION__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.STRING_EXPRESSION__OPERAND:
+			getOperands().clear();
+			return;
+		case UMLPackage.STRING_EXPRESSION__SYMBOL:
+			unsetSymbol();
+			return;
+		case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION:
+			setOwningExpression((StringExpression) null);
+			return;
+		case UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION:
+			getSubExpressions().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -742,46 +659,44 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STRING_EXPRESSION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.STRING_EXPRESSION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.STRING_EXPRESSION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.STRING_EXPRESSION__OWNER :
-				return isSetOwner();
-			case UMLPackage.STRING_EXPRESSION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.STRING_EXPRESSION__NAME :
-				return isSetName();
-			case UMLPackage.STRING_EXPRESSION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.STRING_EXPRESSION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.STRING_EXPRESSION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.STRING_EXPRESSION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.STRING_EXPRESSION__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.STRING_EXPRESSION__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.STRING_EXPRESSION__OPERAND :
-				return !getOperands().isEmpty();
-			case UMLPackage.STRING_EXPRESSION__SYMBOL :
-				return isSetSymbol();
-			case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE :
-				return basicGetOwnedTemplateSignature() != null;
-			case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION :
-				return basicGetOwningExpression() != null;
-			case UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION :
-				return !getSubExpressions().isEmpty();
+		case UMLPackage.STRING_EXPRESSION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.STRING_EXPRESSION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.STRING_EXPRESSION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.STRING_EXPRESSION__OWNER:
+			return isSetOwner();
+		case UMLPackage.STRING_EXPRESSION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.STRING_EXPRESSION__NAME:
+			return isSetName();
+		case UMLPackage.STRING_EXPRESSION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.STRING_EXPRESSION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.STRING_EXPRESSION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.STRING_EXPRESSION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.STRING_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.STRING_EXPRESSION__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.STRING_EXPRESSION__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.STRING_EXPRESSION__OPERAND:
+			return !getOperands().isEmpty();
+		case UMLPackage.STRING_EXPRESSION__SYMBOL:
+			return isSetSymbol();
+		case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE:
+			return basicGetOwnedTemplateSignature() != null;
+		case UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION:
+			return basicGetOwningExpression() != null;
+		case UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION:
+			return !getSubExpressions().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -796,12 +711,12 @@
 			Class<?> baseClass) {
 		if (baseClass == TemplateableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING :
-					return UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING;
-				case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE :
-					return UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE;
-				default :
-					return -1;
+			case UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING:
+				return UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING;
+			case UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE:
+				return UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -817,12 +732,12 @@
 			Class<?> baseClass) {
 		if (baseClass == TemplateableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING :
-					return UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING;
-				case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE :
-					return UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE;
-				default :
-					return -1;
+			case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING:
+				return UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING;
+			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE:
+				return UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -837,12 +752,12 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == TemplateableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.TEMPLATEABLE_ELEMENT___IS_TEMPLATE :
-					return UMLPackage.STRING_EXPRESSION___IS_TEMPLATE;
-				case UMLPackage.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS :
-					return UMLPackage.STRING_EXPRESSION___PARAMETERABLE_ELEMENTS;
-				default :
-					return -1;
+			case UMLPackage.TEMPLATEABLE_ELEMENT___IS_TEMPLATE:
+				return UMLPackage.STRING_EXPRESSION___IS_TEMPLATE;
+			case UMLPackage.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS:
+				return UMLPackage.STRING_EXPRESSION___PARAMETERABLE_ELEMENTS;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -858,159 +773,138 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.STRING_EXPRESSION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRING_EXPRESSION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRING_EXPRESSION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.STRING_EXPRESSION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.STRING_EXPRESSION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.STRING_EXPRESSION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.STRING_EXPRESSION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STRING_EXPRESSION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___GET_MODEL :
-				return getModel();
-			case UMLPackage.STRING_EXPRESSION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.STRING_EXPRESSION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.STRING_EXPRESSION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.STRING_EXPRESSION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.STRING_EXPRESSION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.STRING_EXPRESSION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.STRING_EXPRESSION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STRING_EXPRESSION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STRING_EXPRESSION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.STRING_EXPRESSION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.STRING_EXPRESSION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.STRING_EXPRESSION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRING_EXPRESSION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRING_EXPRESSION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRING_EXPRESSION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.STRING_EXPRESSION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.STRING_EXPRESSION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.STRING_EXPRESSION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.STRING_EXPRESSION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.STRING_EXPRESSION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STRING_EXPRESSION___SEPARATOR :
-				return separator();
-			case UMLPackage.STRING_EXPRESSION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.STRING_EXPRESSION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.STRING_EXPRESSION___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.STRING_EXPRESSION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRING_EXPRESSION___BOOLEAN_VALUE :
-				return booleanValue();
-			case UMLPackage.STRING_EXPRESSION___INTEGER_VALUE :
-				return integerValue();
-			case UMLPackage.STRING_EXPRESSION___IS_COMPUTABLE :
-				return isComputable();
-			case UMLPackage.STRING_EXPRESSION___IS_NULL :
-				return isNull();
-			case UMLPackage.STRING_EXPRESSION___REAL_VALUE :
-				return realValue();
-			case UMLPackage.STRING_EXPRESSION___STRING_VALUE :
-				return stringValue();
-			case UMLPackage.STRING_EXPRESSION___UNLIMITED_VALUE :
-				return unlimitedValue();
-			case UMLPackage.STRING_EXPRESSION___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.STRING_EXPRESSION___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.STRING_EXPRESSION___VALIDATE_OPERANDS__DIAGNOSTICCHAIN_MAP :
-				return validateOperands((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRING_EXPRESSION___VALIDATE_SUBEXPRESSIONS__DIAGNOSTICCHAIN_MAP :
-				return validateSubexpressions(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRING_EXPRESSION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRING_EXPRESSION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRING_EXPRESSION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.STRING_EXPRESSION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.STRING_EXPRESSION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.STRING_EXPRESSION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.STRING_EXPRESSION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STRING_EXPRESSION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___GET_MODEL:
+			return getModel();
+		case UMLPackage.STRING_EXPRESSION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.STRING_EXPRESSION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.STRING_EXPRESSION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.STRING_EXPRESSION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.STRING_EXPRESSION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.STRING_EXPRESSION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.STRING_EXPRESSION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STRING_EXPRESSION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STRING_EXPRESSION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.STRING_EXPRESSION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.STRING_EXPRESSION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.STRING_EXPRESSION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRING_EXPRESSION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRING_EXPRESSION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRING_EXPRESSION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.STRING_EXPRESSION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.STRING_EXPRESSION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.STRING_EXPRESSION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.STRING_EXPRESSION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.STRING_EXPRESSION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STRING_EXPRESSION___SEPARATOR:
+			return separator();
+		case UMLPackage.STRING_EXPRESSION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.STRING_EXPRESSION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.STRING_EXPRESSION___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.STRING_EXPRESSION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRING_EXPRESSION___BOOLEAN_VALUE:
+			return booleanValue();
+		case UMLPackage.STRING_EXPRESSION___INTEGER_VALUE:
+			return integerValue();
+		case UMLPackage.STRING_EXPRESSION___IS_COMPUTABLE:
+			return isComputable();
+		case UMLPackage.STRING_EXPRESSION___IS_NULL:
+			return isNull();
+		case UMLPackage.STRING_EXPRESSION___REAL_VALUE:
+			return realValue();
+		case UMLPackage.STRING_EXPRESSION___STRING_VALUE:
+			return stringValue();
+		case UMLPackage.STRING_EXPRESSION___UNLIMITED_VALUE:
+			return unlimitedValue();
+		case UMLPackage.STRING_EXPRESSION___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.STRING_EXPRESSION___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.STRING_EXPRESSION___VALIDATE_OPERANDS__DIAGNOSTICCHAIN_MAP:
+			return validateOperands((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRING_EXPRESSION___VALIDATE_SUBEXPRESSIONS__DIAGNOSTICCHAIN_MAP:
+			return validateSubexpressions((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1023,13 +917,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.STRING_EXPRESSION__OWNED_COMMENT,
-		UMLPackage.STRING_EXPRESSION__NAME_EXPRESSION,
-		UMLPackage.STRING_EXPRESSION__OPERAND,
-		UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING,
-		UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE,
-		UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.STRING_EXPRESSION__OWNED_COMMENT, UMLPackage.STRING_EXPRESSION__NAME_EXPRESSION, UMLPackage.STRING_EXPRESSION__OPERAND, UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING,
+			UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE, UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1039,9 +928,9 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING)
-			|| eIsSet(UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE)
-			|| eIsSet(UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION);
+				|| eIsSet(UMLPackage.STRING_EXPRESSION__TEMPLATE_BINDING)
+				|| eIsSet(UMLPackage.STRING_EXPRESSION__OWNED_TEMPLATE_SIGNATURE)
+				|| eIsSet(UMLPackage.STRING_EXPRESSION__SUB_EXPRESSION);
 	}
 
 	/**
@@ -1066,7 +955,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION);
+				|| eIsSet(UMLPackage.STRING_EXPRESSION__OWNING_EXPRESSION);
 	}
 
 } //StringExpressionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuralFeatureActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuralFeatureActionImpl.java
index 62722f8..3923ccf 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuralFeatureActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuralFeatureActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -106,19 +109,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.STRUCTURAL_FEATURE_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.STRUCTURAL_FEATURE_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.STRUCTURAL_FEATURE_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.STRUCTURAL_FEATURE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -127,11 +124,7 @@
 	 * @generated
 	 */
 	public StructuralFeature getStructuralFeature() {
-		return (StructuralFeature) eDynamicGet(
-			UMLPackage.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE,
-			true, true);
+		return (StructuralFeature) eDynamicGet(UMLPackage.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE, true, true);
 	}
 
 	/**
@@ -140,11 +133,7 @@
 	 * @generated
 	 */
 	public StructuralFeature basicGetStructuralFeature() {
-		return (StructuralFeature) eDynamicGet(
-			UMLPackage.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE,
-			false, true);
+		return (StructuralFeature) eDynamicGet(UMLPackage.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE, false, true);
 	}
 
 	/**
@@ -153,11 +142,7 @@
 	 * @generated
 	 */
 	public void setStructuralFeature(StructuralFeature newStructuralFeature) {
-		eDynamicSet(
-			UMLPackage.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE,
-			newStructuralFeature);
+		eDynamicSet(UMLPackage.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE, newStructuralFeature);
 	}
 
 	/**
@@ -166,10 +151,7 @@
 	 * @generated
 	 */
 	public InputPin getObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURAL_FEATURE_ACTION__OBJECT, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURAL_FEATURE_ACTION__OBJECT, true, true);
 	}
 
 	/**
@@ -178,10 +160,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURAL_FEATURE_ACTION__OBJECT, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURAL_FEATURE_ACTION__OBJECT, false, true);
 	}
 
 	/**
@@ -191,8 +170,7 @@
 	 */
 	public NotificationChain basicSetObject(InputPin newObject,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newObject,
-			UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newObject, UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT, msgs);
 		return msgs;
 	}
 
@@ -202,10 +180,7 @@
 	 * @generated
 	 */
 	public void setObject(InputPin newObject) {
-		eDynamicSet(
-			UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURAL_FEATURE_ACTION__OBJECT, newObject);
+		eDynamicSet(UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURAL_FEATURE_ACTION__OBJECT, newObject);
 	}
 
 	/**
@@ -239,8 +214,7 @@
 	 */
 	public boolean validateNotStatic(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StructuralFeatureActionOperations.validateNotStatic(this,
-			diagnostics, context);
+		return StructuralFeatureActionOperations.validateNotStatic(this, diagnostics, context);
 	}
 
 	/**
@@ -250,8 +224,7 @@
 	 */
 	public boolean validateMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StructuralFeatureActionOperations.validateMultiplicity(this,
-			diagnostics, context);
+		return StructuralFeatureActionOperations.validateMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -261,8 +234,7 @@
 	 */
 	public boolean validateObjectType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StructuralFeatureActionOperations.validateObjectType(this,
-			diagnostics, context);
+		return StructuralFeatureActionOperations.validateObjectType(this, diagnostics, context);
 	}
 
 	/**
@@ -272,8 +244,7 @@
 	 */
 	public boolean validateVisibility(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StructuralFeatureActionOperations.validateVisibility(this,
-			diagnostics, context);
+		return StructuralFeatureActionOperations.validateVisibility(this, diagnostics, context);
 	}
 
 	/**
@@ -283,8 +254,7 @@
 	 */
 	public boolean validateOneFeaturingClassifier(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StructuralFeatureActionOperations
-			.validateOneFeaturingClassifier(this, diagnostics, context);
+		return StructuralFeatureActionOperations.validateOneFeaturingClassifier(this, diagnostics, context);
 	}
 
 	/**
@@ -296,39 +266,30 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT :
-				return basicSetObject(null, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT:
+			return basicSetObject(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -341,82 +302,82 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME :
-				return getName();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT :
-				if (resolve)
-					return getObject();
-				return basicGetObject();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				if (resolve)
-					return getStructuralFeature();
-				return basicGetStructuralFeature();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME:
+			return getName();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT:
+			if (resolve)
+				return getObject();
+			return basicGetObject();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			if (resolve)
+				return getStructuralFeature();
+			return basicGetStructuralFeature();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -430,83 +391,73 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT :
-				setObject((InputPin) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				setStructuralFeature((StructuralFeature) newValue);
-				return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT:
+			setObject((InputPin) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			setStructuralFeature((StructuralFeature) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -519,63 +470,63 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT :
-				setObject((InputPin) null);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				setStructuralFeature((StructuralFeature) null);
-				return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT:
+			setObject((InputPin) null);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			setStructuralFeature((StructuralFeature) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -588,68 +539,66 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT :
-				return basicGetObject() != null;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				return basicGetStructuralFeature() != null;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT:
+			return basicGetObject() != null;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			return basicGetStructuralFeature() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -664,168 +613,140 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_OBJECT_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateObjectType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateVisibility((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP :
-				return validateNotStatic((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_ONE_FEATURING_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateOneFeaturingClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_OBJECT_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateObjectType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP:
+			return validateNotStatic((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE_ACTION___VALIDATE_ONE_FEATURING_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateOneFeaturingClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -838,8 +759,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -849,7 +769,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT);
+				|| eIsSet(UMLPackage.STRUCTURAL_FEATURE_ACTION__OBJECT);
 	}
 
 } //StructuralFeatureActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuralFeatureImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuralFeatureImpl.java
index 4e40963..35cc3ff 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuralFeatureImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuralFeatureImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,6 +29,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -152,9 +155,7 @@
 	 * @generated
 	 */
 	public Type getType() {
-		return (Type) eDynamicGet(
-			UMLPackage.STRUCTURAL_FEATURE__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TYPED_ELEMENT__TYPE, true, true);
+		return (Type) eDynamicGet(UMLPackage.STRUCTURAL_FEATURE__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TYPED_ELEMENT__TYPE, true, true);
 	}
 
 	/**
@@ -163,9 +164,7 @@
 	 * @generated
 	 */
 	public Type basicGetType() {
-		return (Type) eDynamicGet(
-			UMLPackage.STRUCTURAL_FEATURE__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TYPED_ELEMENT__TYPE, false, true);
+		return (Type) eDynamicGet(UMLPackage.STRUCTURAL_FEATURE__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TYPED_ELEMENT__TYPE, false, true);
 	}
 
 	/**
@@ -174,8 +173,7 @@
 	 * @generated
 	 */
 	public void setType(Type newType) {
-		eDynamicSet(UMLPackage.STRUCTURAL_FEATURE__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TYPED_ELEMENT__TYPE, newType);
+		eDynamicSet(UMLPackage.STRUCTURAL_FEATURE__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TYPED_ELEMENT__TYPE, newType);
 	}
 
 	/**
@@ -189,21 +187,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.STRUCTURAL_FEATURE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.STRUCTURAL_FEATURE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.STRUCTURAL_FEATURE__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.STRUCTURAL_FEATURE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -212,9 +202,7 @@
 	 * @generated
 	 */
 	public boolean isOrdered() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, true, true);
 	}
 
 	/**
@@ -223,9 +211,7 @@
 	 * @generated
 	 */
 	public void setIsOrdered(boolean newIsOrdered) {
-		eDynamicSet(
-			UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, newIsOrdered);
+		eDynamicSet(UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, newIsOrdered);
 	}
 
 	/**
@@ -234,9 +220,7 @@
 	 * @generated
 	 */
 	public boolean isUnique() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, true, true);
 	}
 
 	/**
@@ -245,9 +229,7 @@
 	 * @generated
 	 */
 	public void setIsUnique(boolean newIsUnique) {
-		eDynamicSet(
-			UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, newIsUnique);
+		eDynamicSet(UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, newIsUnique);
 	}
 
 	/**
@@ -292,9 +274,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getUpperValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, true, true);
 	}
 
 	/**
@@ -303,9 +283,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetUpperValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, false, true);
 	}
 
 	/**
@@ -315,8 +293,7 @@
 	 */
 	public NotificationChain basicSetUpperValue(
 			ValueSpecification newUpperValue, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newUpperValue,
-			UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newUpperValue, UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE, msgs);
 		return msgs;
 	}
 
@@ -326,10 +303,7 @@
 	 * @generated
 	 */
 	public void setUpperValue(ValueSpecification newUpperValue) {
-		eDynamicSet(
-			UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE,
-			newUpperValue);
+		eDynamicSet(UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, newUpperValue);
 	}
 
 	/**
@@ -354,9 +328,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getLowerValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, true, true);
 	}
 
 	/**
@@ -365,9 +337,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetLowerValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, false, true);
 	}
 
 	/**
@@ -377,8 +347,7 @@
 	 */
 	public NotificationChain basicSetLowerValue(
 			ValueSpecification newLowerValue, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newLowerValue,
-			UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newLowerValue, UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE, msgs);
 		return msgs;
 	}
 
@@ -388,10 +357,7 @@
 	 * @generated
 	 */
 	public void setLowerValue(ValueSpecification newLowerValue) {
-		eDynamicSet(
-			UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE,
-			newLowerValue);
+		eDynamicSet(UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, newLowerValue);
 	}
 
 	/**
@@ -416,9 +382,7 @@
 	 * @generated
 	 */
 	public boolean isReadOnly() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.STRUCTURAL_FEATURE__IS_READ_ONLY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURAL_FEATURE__IS_READ_ONLY, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.STRUCTURAL_FEATURE__IS_READ_ONLY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURAL_FEATURE__IS_READ_ONLY, true, true);
 	}
 
 	/**
@@ -427,10 +391,7 @@
 	 * @generated
 	 */
 	public void setIsReadOnly(boolean newIsReadOnly) {
-		eDynamicSet(
-			UMLPackage.STRUCTURAL_FEATURE__IS_READ_ONLY - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURAL_FEATURE__IS_READ_ONLY,
-			newIsReadOnly);
+		eDynamicSet(UMLPackage.STRUCTURAL_FEATURE__IS_READ_ONLY - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURAL_FEATURE__IS_READ_ONLY, newIsReadOnly);
 	}
 
 	/**
@@ -440,8 +401,7 @@
 	 */
 	public boolean validateLowerGe0(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations.validateLowerGe0(this, diagnostics,
-			context);
+		return MultiplicityElementOperations.validateLowerGe0(this, diagnostics, context);
 	}
 
 	/**
@@ -451,8 +411,7 @@
 	 */
 	public boolean validateUpperGeLower(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations.validateUpperGeLower(this,
-			diagnostics, context);
+		return MultiplicityElementOperations.validateUpperGeLower(this, diagnostics, context);
 	}
 
 	/**
@@ -462,9 +421,7 @@
 	 */
 	public boolean validateValueSpecificationNoSideEffects(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return MultiplicityElementOperations
-			.validateValueSpecificationNoSideEffects(this, diagnostics,
-				context);
+		return MultiplicityElementOperations.validateValueSpecificationNoSideEffects(this, diagnostics, context);
 	}
 
 	/**
@@ -474,8 +431,7 @@
 	 */
 	public boolean validateValueSpecificationConstant(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return MultiplicityElementOperations
-			.validateValueSpecificationConstant(this, diagnostics, context);
+		return MultiplicityElementOperations.validateValueSpecificationConstant(this, diagnostics, context);
 	}
 
 	/**
@@ -485,8 +441,7 @@
 	 */
 	public boolean validateLowerIsInteger(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations.validateLowerIsInteger(this,
-			diagnostics, context);
+		return MultiplicityElementOperations.validateLowerIsInteger(this, diagnostics, context);
 	}
 
 	/**
@@ -496,8 +451,7 @@
 	 */
 	public boolean validateUpperIsUnlimitedNatural(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations
-			.validateUpperIsUnlimitedNatural(this, diagnostics, context);
+		return MultiplicityElementOperations.validateUpperIsUnlimitedNatural(this, diagnostics, context);
 	}
 
 	/**
@@ -563,18 +517,16 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURAL_FEATURE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURAL_FEATURE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURAL_FEATURE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE :
-				return basicSetLowerValue(null, msgs);
-			case UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE :
-				return basicSetUpperValue(null, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE:
+			return basicSetLowerValue(null, msgs);
+		case UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE:
+			return basicSetUpperValue(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -587,64 +539,64 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURAL_FEATURE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.STRUCTURAL_FEATURE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.STRUCTURAL_FEATURE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.STRUCTURAL_FEATURE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.STRUCTURAL_FEATURE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.STRUCTURAL_FEATURE__NAME :
-				return getName();
-			case UMLPackage.STRUCTURAL_FEATURE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.STRUCTURAL_FEATURE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.STRUCTURAL_FEATURE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STRUCTURAL_FEATURE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.STRUCTURAL_FEATURE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.STRUCTURAL_FEATURE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.STRUCTURAL_FEATURE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.STRUCTURAL_FEATURE__FEATURING_CLASSIFIER :
-				return getFeaturingClassifiers();
-			case UMLPackage.STRUCTURAL_FEATURE__IS_STATIC :
-				return isStatic();
-			case UMLPackage.STRUCTURAL_FEATURE__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED :
-				return isOrdered();
-			case UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE :
-				return isUnique();
-			case UMLPackage.STRUCTURAL_FEATURE__LOWER :
-				return getLower();
-			case UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE :
-				if (resolve)
-					return getLowerValue();
-				return basicGetLowerValue();
-			case UMLPackage.STRUCTURAL_FEATURE__UPPER :
-				return getUpper();
-			case UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE :
-				if (resolve)
-					return getUpperValue();
-				return basicGetUpperValue();
-			case UMLPackage.STRUCTURAL_FEATURE__IS_READ_ONLY :
-				return isReadOnly();
+		case UMLPackage.STRUCTURAL_FEATURE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.STRUCTURAL_FEATURE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.STRUCTURAL_FEATURE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.STRUCTURAL_FEATURE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.STRUCTURAL_FEATURE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.STRUCTURAL_FEATURE__NAME:
+			return getName();
+		case UMLPackage.STRUCTURAL_FEATURE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.STRUCTURAL_FEATURE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.STRUCTURAL_FEATURE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STRUCTURAL_FEATURE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.STRUCTURAL_FEATURE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.STRUCTURAL_FEATURE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.STRUCTURAL_FEATURE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.STRUCTURAL_FEATURE__FEATURING_CLASSIFIER:
+			return getFeaturingClassifiers();
+		case UMLPackage.STRUCTURAL_FEATURE__IS_STATIC:
+			return isStatic();
+		case UMLPackage.STRUCTURAL_FEATURE__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED:
+			return isOrdered();
+		case UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE:
+			return isUnique();
+		case UMLPackage.STRUCTURAL_FEATURE__LOWER:
+			return getLower();
+		case UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE:
+			if (resolve)
+				return getLowerValue();
+			return basicGetLowerValue();
+		case UMLPackage.STRUCTURAL_FEATURE__UPPER:
+			return getUpper();
+		case UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE:
+			if (resolve)
+				return getUpperValue();
+			return basicGetUpperValue();
+		case UMLPackage.STRUCTURAL_FEATURE__IS_READ_ONLY:
+			return isReadOnly();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -658,55 +610,53 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURAL_FEATURE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__IS_STATIC :
-				setIsStatic((Boolean) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED :
-				setIsOrdered((Boolean) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE :
-				setIsUnique((Boolean) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__LOWER :
-				setLower((Integer) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE :
-				setLowerValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__UPPER :
-				setUpper((Integer) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE :
-				setUpperValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__IS_READ_ONLY :
-				setIsReadOnly((Boolean) newValue);
-				return;
+		case UMLPackage.STRUCTURAL_FEATURE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__IS_STATIC:
+			setIsStatic((Boolean) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED:
+			setIsOrdered((Boolean) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE:
+			setIsUnique((Boolean) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__LOWER:
+			setLower((Integer) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE:
+			setLowerValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__UPPER:
+			setUpper((Integer) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE:
+			setUpperValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__IS_READ_ONLY:
+			setIsReadOnly((Boolean) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -719,51 +669,51 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURAL_FEATURE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__IS_STATIC :
-				setIsStatic(IS_STATIC_EDEFAULT);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED :
-				setIsOrdered(IS_ORDERED_EDEFAULT);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE :
-				setIsUnique(IS_UNIQUE_EDEFAULT);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__LOWER :
-				setLower(LOWER_EDEFAULT);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE :
-				setLowerValue((ValueSpecification) null);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__UPPER :
-				setUpper(UPPER_EDEFAULT);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE :
-				setUpperValue((ValueSpecification) null);
-				return;
-			case UMLPackage.STRUCTURAL_FEATURE__IS_READ_ONLY :
-				setIsReadOnly(IS_READ_ONLY_EDEFAULT);
-				return;
+		case UMLPackage.STRUCTURAL_FEATURE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__IS_STATIC:
+			setIsStatic(IS_STATIC_EDEFAULT);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED:
+			setIsOrdered(IS_ORDERED_EDEFAULT);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE:
+			setIsUnique(IS_UNIQUE_EDEFAULT);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__LOWER:
+			setLower(LOWER_EDEFAULT);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE:
+			setLowerValue((ValueSpecification) null);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__UPPER:
+			setUpper(UPPER_EDEFAULT);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE:
+			setUpperValue((ValueSpecification) null);
+			return;
+		case UMLPackage.STRUCTURAL_FEATURE__IS_READ_ONLY:
+			setIsReadOnly(IS_READ_ONLY_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -776,54 +726,52 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURAL_FEATURE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.STRUCTURAL_FEATURE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.STRUCTURAL_FEATURE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.STRUCTURAL_FEATURE__OWNER :
-				return isSetOwner();
-			case UMLPackage.STRUCTURAL_FEATURE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.STRUCTURAL_FEATURE__NAME :
-				return isSetName();
-			case UMLPackage.STRUCTURAL_FEATURE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.STRUCTURAL_FEATURE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.STRUCTURAL_FEATURE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.STRUCTURAL_FEATURE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.STRUCTURAL_FEATURE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.STRUCTURAL_FEATURE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.STRUCTURAL_FEATURE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.STRUCTURAL_FEATURE__FEATURING_CLASSIFIER :
-				return isSetFeaturingClassifiers();
-			case UMLPackage.STRUCTURAL_FEATURE__IS_STATIC :
-				return isStatic() != IS_STATIC_EDEFAULT;
-			case UMLPackage.STRUCTURAL_FEATURE__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED :
-				return isOrdered() != IS_ORDERED_EDEFAULT;
-			case UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE :
-				return isUnique() != IS_UNIQUE_EDEFAULT;
-			case UMLPackage.STRUCTURAL_FEATURE__LOWER :
-				return getLower() != LOWER_EDEFAULT;
-			case UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE :
-				return basicGetLowerValue() != null;
-			case UMLPackage.STRUCTURAL_FEATURE__UPPER :
-				return getUpper() != UPPER_EDEFAULT;
-			case UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE :
-				return basicGetUpperValue() != null;
-			case UMLPackage.STRUCTURAL_FEATURE__IS_READ_ONLY :
-				return isReadOnly() != IS_READ_ONLY_EDEFAULT;
+		case UMLPackage.STRUCTURAL_FEATURE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.STRUCTURAL_FEATURE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.STRUCTURAL_FEATURE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.STRUCTURAL_FEATURE__OWNER:
+			return isSetOwner();
+		case UMLPackage.STRUCTURAL_FEATURE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.STRUCTURAL_FEATURE__NAME:
+			return isSetName();
+		case UMLPackage.STRUCTURAL_FEATURE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.STRUCTURAL_FEATURE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.STRUCTURAL_FEATURE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.STRUCTURAL_FEATURE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.STRUCTURAL_FEATURE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.STRUCTURAL_FEATURE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.STRUCTURAL_FEATURE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.STRUCTURAL_FEATURE__FEATURING_CLASSIFIER:
+			return isSetFeaturingClassifiers();
+		case UMLPackage.STRUCTURAL_FEATURE__IS_STATIC:
+			return isStatic() != IS_STATIC_EDEFAULT;
+		case UMLPackage.STRUCTURAL_FEATURE__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED:
+			return isOrdered() != IS_ORDERED_EDEFAULT;
+		case UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE:
+			return isUnique() != IS_UNIQUE_EDEFAULT;
+		case UMLPackage.STRUCTURAL_FEATURE__LOWER:
+			return getLower() != LOWER_EDEFAULT;
+		case UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE:
+			return basicGetLowerValue() != null;
+		case UMLPackage.STRUCTURAL_FEATURE__UPPER:
+			return getUpper() != UPPER_EDEFAULT;
+		case UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE:
+			return basicGetUpperValue() != null;
+		case UMLPackage.STRUCTURAL_FEATURE__IS_READ_ONLY:
+			return isReadOnly() != IS_READ_ONLY_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -838,28 +786,28 @@
 			Class<?> baseClass) {
 		if (baseClass == TypedElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.STRUCTURAL_FEATURE__TYPE :
-					return UMLPackage.TYPED_ELEMENT__TYPE;
-				default :
-					return -1;
+			case UMLPackage.STRUCTURAL_FEATURE__TYPE:
+				return UMLPackage.TYPED_ELEMENT__TYPE;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == MultiplicityElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED :
-					return UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED;
-				case UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE :
-					return UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE;
-				case UMLPackage.STRUCTURAL_FEATURE__LOWER :
-					return UMLPackage.MULTIPLICITY_ELEMENT__LOWER;
-				case UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE :
-					return UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE;
-				case UMLPackage.STRUCTURAL_FEATURE__UPPER :
-					return UMLPackage.MULTIPLICITY_ELEMENT__UPPER;
-				case UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE :
-					return UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE;
-				default :
-					return -1;
+			case UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED:
+				return UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED;
+			case UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE:
+				return UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE;
+			case UMLPackage.STRUCTURAL_FEATURE__LOWER:
+				return UMLPackage.MULTIPLICITY_ELEMENT__LOWER;
+			case UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE:
+				return UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE;
+			case UMLPackage.STRUCTURAL_FEATURE__UPPER:
+				return UMLPackage.MULTIPLICITY_ELEMENT__UPPER;
+			case UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE:
+				return UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -875,28 +823,28 @@
 			Class<?> baseClass) {
 		if (baseClass == TypedElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.TYPED_ELEMENT__TYPE :
-					return UMLPackage.STRUCTURAL_FEATURE__TYPE;
-				default :
-					return -1;
+			case UMLPackage.TYPED_ELEMENT__TYPE:
+				return UMLPackage.STRUCTURAL_FEATURE__TYPE;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == MultiplicityElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED :
-					return UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED;
-				case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE :
-					return UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE;
-				case UMLPackage.MULTIPLICITY_ELEMENT__LOWER :
-					return UMLPackage.STRUCTURAL_FEATURE__LOWER;
-				case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE :
-					return UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE;
-				case UMLPackage.MULTIPLICITY_ELEMENT__UPPER :
-					return UMLPackage.STRUCTURAL_FEATURE__UPPER;
-				case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE :
-					return UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE;
-				default :
-					return -1;
+			case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED:
+				return UMLPackage.STRUCTURAL_FEATURE__IS_ORDERED;
+			case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE:
+				return UMLPackage.STRUCTURAL_FEATURE__IS_UNIQUE;
+			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER:
+				return UMLPackage.STRUCTURAL_FEATURE__LOWER;
+			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE:
+				return UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE;
+			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER:
+				return UMLPackage.STRUCTURAL_FEATURE__UPPER;
+			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE:
+				return UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -911,46 +859,46 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == TypedElement.class) {
 			switch (baseOperationID) {
-				default :
-					return -1;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == MultiplicityElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.STRUCTURAL_FEATURE___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.STRUCTURAL_FEATURE___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.STRUCTURAL_FEATURE___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.STRUCTURAL_FEATURE___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.STRUCTURAL_FEATURE___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.STRUCTURAL_FEATURE___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___SET_LOWER__INT :
-					return UMLPackage.STRUCTURAL_FEATURE___SET_LOWER__INT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___SET_UPPER__INT :
-					return UMLPackage.STRUCTURAL_FEATURE___SET_UPPER__INT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-					return UMLPackage.STRUCTURAL_FEATURE___COMPATIBLE_WITH__MULTIPLICITYELEMENT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-					return UMLPackage.STRUCTURAL_FEATURE___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___IS__INT_INT :
-					return UMLPackage.STRUCTURAL_FEATURE___IS__INT_INT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___IS_MULTIVALUED :
-					return UMLPackage.STRUCTURAL_FEATURE___IS_MULTIVALUED;
-				case UMLPackage.MULTIPLICITY_ELEMENT___GET_LOWER :
-					return UMLPackage.STRUCTURAL_FEATURE___GET_LOWER;
-				case UMLPackage.MULTIPLICITY_ELEMENT___LOWER_BOUND :
-					return UMLPackage.STRUCTURAL_FEATURE___LOWER_BOUND;
-				case UMLPackage.MULTIPLICITY_ELEMENT___GET_UPPER :
-					return UMLPackage.STRUCTURAL_FEATURE___GET_UPPER;
-				case UMLPackage.MULTIPLICITY_ELEMENT___UPPER_BOUND :
-					return UMLPackage.STRUCTURAL_FEATURE___UPPER_BOUND;
-				default :
-					return -1;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.STRUCTURAL_FEATURE___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.STRUCTURAL_FEATURE___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.STRUCTURAL_FEATURE___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.STRUCTURAL_FEATURE___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.STRUCTURAL_FEATURE___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.STRUCTURAL_FEATURE___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___SET_LOWER__INT:
+				return UMLPackage.STRUCTURAL_FEATURE___SET_LOWER__INT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___SET_UPPER__INT:
+				return UMLPackage.STRUCTURAL_FEATURE___SET_UPPER__INT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+				return UMLPackage.STRUCTURAL_FEATURE___COMPATIBLE_WITH__MULTIPLICITYELEMENT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+				return UMLPackage.STRUCTURAL_FEATURE___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___IS__INT_INT:
+				return UMLPackage.STRUCTURAL_FEATURE___IS__INT_INT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___IS_MULTIVALUED:
+				return UMLPackage.STRUCTURAL_FEATURE___IS_MULTIVALUED;
+			case UMLPackage.MULTIPLICITY_ELEMENT___GET_LOWER:
+				return UMLPackage.STRUCTURAL_FEATURE___GET_LOWER;
+			case UMLPackage.MULTIPLICITY_ELEMENT___LOWER_BOUND:
+				return UMLPackage.STRUCTURAL_FEATURE___LOWER_BOUND;
+			case UMLPackage.MULTIPLICITY_ELEMENT___GET_UPPER:
+				return UMLPackage.STRUCTURAL_FEATURE___GET_UPPER;
+			case UMLPackage.MULTIPLICITY_ELEMENT___UPPER_BOUND:
+				return UMLPackage.STRUCTURAL_FEATURE___UPPER_BOUND;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -966,188 +914,154 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.STRUCTURAL_FEATURE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.STRUCTURAL_FEATURE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.STRUCTURAL_FEATURE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.STRUCTURAL_FEATURE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.STRUCTURAL_FEATURE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___GET_MODEL :
-				return getModel();
-			case UMLPackage.STRUCTURAL_FEATURE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.STRUCTURAL_FEATURE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.STRUCTURAL_FEATURE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.STRUCTURAL_FEATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.STRUCTURAL_FEATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.STRUCTURAL_FEATURE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.STRUCTURAL_FEATURE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.STRUCTURAL_FEATURE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.STRUCTURAL_FEATURE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.STRUCTURAL_FEATURE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.STRUCTURAL_FEATURE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.STRUCTURAL_FEATURE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.STRUCTURAL_FEATURE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STRUCTURAL_FEATURE___SEPARATOR :
-				return separator();
-			case UMLPackage.STRUCTURAL_FEATURE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-				return validateUpperGeLower((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-				return validateLowerGe0((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationNoSideEffects(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationConstant(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-				return validateLowerIsInteger(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-				return validateUpperIsUnlimitedNatural(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___SET_LOWER__INT :
-				setLower((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.STRUCTURAL_FEATURE___SET_UPPER__INT :
-				setUpper((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.STRUCTURAL_FEATURE___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-				return compatibleWith((MultiplicityElement) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-				return includesMultiplicity(
-					(MultiplicityElement) arguments.get(0));
-			case UMLPackage.STRUCTURAL_FEATURE___IS__INT_INT :
-				return is((Integer) arguments.get(0),
-					(Integer) arguments.get(1));
-			case UMLPackage.STRUCTURAL_FEATURE___IS_MULTIVALUED :
-				return isMultivalued();
-			case UMLPackage.STRUCTURAL_FEATURE___GET_LOWER :
-				return getLower();
-			case UMLPackage.STRUCTURAL_FEATURE___LOWER_BOUND :
-				return lowerBound();
-			case UMLPackage.STRUCTURAL_FEATURE___GET_UPPER :
-				return getUpper();
-			case UMLPackage.STRUCTURAL_FEATURE___UPPER_BOUND :
-				return upperBound();
+		case UMLPackage.STRUCTURAL_FEATURE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.STRUCTURAL_FEATURE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.STRUCTURAL_FEATURE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.STRUCTURAL_FEATURE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.STRUCTURAL_FEATURE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___GET_MODEL:
+			return getModel();
+		case UMLPackage.STRUCTURAL_FEATURE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.STRUCTURAL_FEATURE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.STRUCTURAL_FEATURE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.STRUCTURAL_FEATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.STRUCTURAL_FEATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.STRUCTURAL_FEATURE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.STRUCTURAL_FEATURE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.STRUCTURAL_FEATURE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.STRUCTURAL_FEATURE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.STRUCTURAL_FEATURE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.STRUCTURAL_FEATURE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.STRUCTURAL_FEATURE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.STRUCTURAL_FEATURE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STRUCTURAL_FEATURE___SEPARATOR:
+			return separator();
+		case UMLPackage.STRUCTURAL_FEATURE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+			return validateUpperGeLower((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+			return validateLowerGe0((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationConstant((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+			return validateLowerIsInteger((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+			return validateUpperIsUnlimitedNatural((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___SET_LOWER__INT:
+			setLower((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.STRUCTURAL_FEATURE___SET_UPPER__INT:
+			setUpper((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.STRUCTURAL_FEATURE___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+			return compatibleWith((MultiplicityElement) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+			return includesMultiplicity((MultiplicityElement) arguments.get(0));
+		case UMLPackage.STRUCTURAL_FEATURE___IS__INT_INT:
+			return is((Integer) arguments.get(0), (Integer) arguments.get(1));
+		case UMLPackage.STRUCTURAL_FEATURE___IS_MULTIVALUED:
+			return isMultivalued();
+		case UMLPackage.STRUCTURAL_FEATURE___GET_LOWER:
+			return getLower();
+		case UMLPackage.STRUCTURAL_FEATURE___LOWER_BOUND:
+			return lowerBound();
+		case UMLPackage.STRUCTURAL_FEATURE___GET_UPPER:
+			return getUpper();
+		case UMLPackage.STRUCTURAL_FEATURE___UPPER_BOUND:
+			return upperBound();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1160,11 +1074,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.STRUCTURAL_FEATURE__OWNED_COMMENT,
-		UMLPackage.STRUCTURAL_FEATURE__NAME_EXPRESSION,
-		UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE,
-		UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.STRUCTURAL_FEATURE__OWNED_COMMENT, UMLPackage.STRUCTURAL_FEATURE__NAME_EXPRESSION, UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE, UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1174,8 +1084,8 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE)
-			|| eIsSet(UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE);
+				|| eIsSet(UMLPackage.STRUCTURAL_FEATURE__LOWER_VALUE)
+				|| eIsSet(UMLPackage.STRUCTURAL_FEATURE__UPPER_VALUE);
 	}
 
 } //StructuralFeatureImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuredActivityNodeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuredActivityNodeImpl.java
index 03f7ac0..587febb 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuredActivityNodeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuredActivityNodeImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 465214, 485756, 491587
  *
  */
@@ -33,6 +33,8 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
@@ -147,21 +149,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -175,20 +169,20 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+					eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
 			if (ownedMembers == null) {
 				cache.put(eResource, this,
-					UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
-					ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+						UMLPackage.Literals.NAMESPACE__OWNED_MEMBER,
+						ownedMembers = new DerivedUnionEObjectEList<NamedElement>(
+								NamedElement.class, this,
+								UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER,
+								OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
 		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER,
-			OWNED_MEMBER_ESUBSETS);
+				this, UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER,
+				OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -201,20 +195,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> members = (EList<NamedElement>) cache
-				.get(eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER);
+			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>(
-						NamedElement.class, this,
-						UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER,
-						MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER, members = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER, MEMBER_ESUBSETS));
 			}
 			return members;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER, MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER, MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -224,10 +211,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ElementImport> getElementImports() {
-		return (EList<ElementImport>) eDynamicGet(
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMESPACE__ELEMENT_IMPORT, true, true);
+		return (EList<ElementImport>) eDynamicGet(UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMESPACE__ELEMENT_IMPORT, true, true);
 	}
 
 	/**
@@ -237,8 +221,7 @@
 	 */
 	public ElementImport createElementImport(
 			PackageableElement importedElement) {
-		ElementImport newElementImport = (ElementImport) create(
-			UMLPackage.Literals.ELEMENT_IMPORT);
+		ElementImport newElementImport = (ElementImport) create(UMLPackage.Literals.ELEMENT_IMPORT);
 		getElementImports().add(newElementImport);
 		if (importedElement != null)
 			newElementImport.setImportedElement(importedElement);
@@ -261,15 +244,12 @@
 	 */
 	public ElementImport getElementImport(PackageableElement importedElement,
 			boolean createOnDemand) {
-		elementImportLoop : for (ElementImport elementImport : getElementImports()) {
-			if (importedElement != null
-				&& !importedElement.equals(elementImport.getImportedElement()))
+		elementImportLoop: for (ElementImport elementImport : getElementImports()) {
+			if (importedElement != null && !importedElement.equals(elementImport.getImportedElement()))
 				continue elementImportLoop;
 			return elementImport;
 		}
-		return createOnDemand
-			? createElementImport(importedElement)
-			: null;
+		return createOnDemand ? createElementImport(importedElement) : null;
 	}
 
 	/**
@@ -279,10 +259,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<PackageImport> getPackageImports() {
-		return (EList<PackageImport>) eDynamicGet(
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMESPACE__PACKAGE_IMPORT, true, true);
+		return (EList<PackageImport>) eDynamicGet(UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMESPACE__PACKAGE_IMPORT, true, true);
 	}
 
 	/**
@@ -292,8 +269,7 @@
 	 */
 	public PackageImport createPackageImport(
 			org.eclipse.uml2.uml.Package importedPackage) {
-		PackageImport newPackageImport = (PackageImport) create(
-			UMLPackage.Literals.PACKAGE_IMPORT);
+		PackageImport newPackageImport = (PackageImport) create(UMLPackage.Literals.PACKAGE_IMPORT);
 		getPackageImports().add(newPackageImport);
 		if (importedPackage != null)
 			newPackageImport.setImportedPackage(importedPackage);
@@ -318,15 +294,12 @@
 	public PackageImport getPackageImport(
 			org.eclipse.uml2.uml.Package importedPackage,
 			boolean createOnDemand) {
-		packageImportLoop : for (PackageImport packageImport : getPackageImports()) {
-			if (importedPackage != null
-				&& !importedPackage.equals(packageImport.getImportedPackage()))
+		packageImportLoop: for (PackageImport packageImport : getPackageImports()) {
+			if (importedPackage != null && !importedPackage.equals(packageImport.getImportedPackage()))
 				continue packageImportLoop;
 			return packageImport;
 		}
-		return createOnDemand
-			? createPackageImport(importedPackage)
-			: null;
+		return createOnDemand ? createPackageImport(importedPackage) : null;
 	}
 
 	/**
@@ -336,10 +309,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Constraint> getOwnedRules() {
-		return (EList<Constraint>) eDynamicGet(
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMESPACE__OWNED_RULE, true, true);
+		return (EList<Constraint>) eDynamicGet(UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMESPACE__OWNED_RULE, true, true);
 	}
 
 	/**
@@ -380,18 +350,14 @@
 	 */
 	public Constraint getOwnedRule(String name, boolean ignoreCase,
 			EClass eClass, boolean createOnDemand) {
-		ownedRuleLoop : for (Constraint ownedRule : getOwnedRules()) {
+		ownedRuleLoop: for (Constraint ownedRule : getOwnedRules()) {
 			if (eClass != null && !eClass.isInstance(ownedRule))
 				continue ownedRuleLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedRule.getName())
-				: name.equals(ownedRule.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedRule.getName()) : name.equals(ownedRule.getName())))
 				continue ownedRuleLoop;
 			return ownedRule;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedRule(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedRule(name, eClass) : null;
 	}
 
 	/**
@@ -403,11 +369,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<PackageableElement> result = (EList<PackageableElement>) cache
-				.get(this, UMLPackage.Literals.NAMESPACE__IMPORTED_MEMBER);
+			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));
+				cache.put(this, UMLPackage.Literals.NAMESPACE__IMPORTED_MEMBER, result = NamespaceOperations.getImportedMembers(this));
 			}
 			return result;
 		}
@@ -430,12 +394,10 @@
 	 */
 	public PackageableElement getImportedMember(String name, boolean ignoreCase,
 			EClass eClass) {
-		importedMemberLoop : for (PackageableElement importedMember : getImportedMembers()) {
+		importedMemberLoop: for (PackageableElement importedMember : getImportedMembers()) {
 			if (eClass != null && !eClass.isInstance(importedMember))
 				continue importedMemberLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(importedMember.getName())
-				: name.equals(importedMember.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(importedMember.getName()) : name.equals(importedMember.getName())))
 				continue importedMemberLoop;
 			return importedMember;
 		}
@@ -452,19 +414,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<ActivityGroup> subgroups = (EList<ActivityGroup>) cache.get(
-				eResource, this, UMLPackage.Literals.ACTIVITY_GROUP__SUBGROUP);
+			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<ActivityGroup>(
-						ActivityGroup.class, this,
-						UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP, null));
+				cache.put(eResource, this, UMLPackage.Literals.ACTIVITY_GROUP__SUBGROUP, subgroups = new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class, this, UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP, null));
 			}
 			return subgroups;
 		}
-		return new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class,
-			this, UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP, null);
+		return new DerivedUnionEObjectEList<ActivityGroup>(ActivityGroup.class, this, UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP, null);
 	}
 
 	/**
@@ -483,12 +439,10 @@
 	 */
 	public ActivityGroup getSubgroup(String name, boolean ignoreCase,
 			EClass eClass) {
-		subgroupLoop : for (ActivityGroup subgroup : getSubgroups()) {
+		subgroupLoop: for (ActivityGroup subgroup : getSubgroups()) {
 			if (eClass != null && !eClass.isInstance(subgroup))
 				continue subgroupLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(subgroup.getName())
-				: name.equals(subgroup.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(subgroup.getName()) : name.equals(subgroup.getName())))
 				continue subgroupLoop;
 			return subgroup;
 		}
@@ -505,22 +459,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<ActivityNode> containedNodes = (EList<ActivityNode>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_NODE);
+			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>(
-						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>(ActivityNode.class,
-			this, UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_NODE,
-			CONTAINED_NODE_ESUBSETS);
+		return new DerivedUnionEObjectEList<ActivityNode>(ActivityNode.class, this, UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_NODE, CONTAINED_NODE_ESUBSETS);
 	}
 
 	/**
@@ -533,22 +478,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<ActivityEdge> containedEdges = (EList<ActivityEdge>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.ACTIVITY_GROUP__CONTAINED_EDGE);
+			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>(
-						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>(ActivityEdge.class,
-			this, UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_EDGE,
-			CONTAINED_EDGE_ESUBSETS);
+		return new DerivedUnionEObjectEList<ActivityEdge>(ActivityEdge.class, this, UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_EDGE, CONTAINED_EDGE_ESUBSETS);
 	}
 
 	/**
@@ -558,10 +494,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Variable> getVariables() {
-		return (EList<Variable>) eDynamicGet(
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE__VARIABLE, true, true);
+		return (EList<Variable>) eDynamicGet(UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE__VARIABLE, true, true);
 	}
 
 	/**
@@ -595,18 +528,14 @@
 	 */
 	public Variable getVariable(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		variableLoop : for (Variable variable : getVariables()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(variable.getName())
-				: name.equals(variable.getName())))
+		variableLoop: for (Variable variable : getVariables()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(variable.getName()) : name.equals(variable.getName())))
 				continue variableLoop;
 			if (type != null && !type.equals(variable.getType()))
 				continue variableLoop;
 			return variable;
 		}
-		return createOnDemand
-			? createVariable(name, type)
-			: null;
+		return createOnDemand ? createVariable(name, type) : null;
 	}
 
 	/**
@@ -616,9 +545,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityNode> getNodes() {
-		return (EList<ActivityNode>) eDynamicGet(
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE__NODE, true, true);
+		return (EList<ActivityNode>) eDynamicGet(UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE__NODE, true, true);
 	}
 
 	/**
@@ -650,18 +577,14 @@
 	 */
 	public ActivityNode getNode(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		nodeLoop : for (ActivityNode node : getNodes()) {
+		nodeLoop: for (ActivityNode node : getNodes()) {
 			if (eClass != null && !eClass.isInstance(node))
 				continue nodeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(node.getName())
-				: name.equals(node.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(node.getName()) : name.equals(node.getName())))
 				continue nodeLoop;
 			return node;
 		}
-		return createOnDemand && eClass != null
-			? createNode(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createNode(name, eClass) : null;
 	}
 
 	/**
@@ -671,11 +594,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<InputPin> getStructuredNodeInputs() {
-		return (EList<InputPin>) eDynamicGet(
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT,
-			true, true);
+		return (EList<InputPin>) eDynamicGet(UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT, true, true);
 	}
 
 	/**
@@ -700,8 +619,7 @@
 	 * @generated
 	 */
 	public InputPin createStructuredNodeInput(String name, Type type) {
-		return createStructuredNodeInput(name, type,
-			UMLPackage.Literals.INPUT_PIN);
+		return createStructuredNodeInput(name, type, UMLPackage.Literals.INPUT_PIN);
 	}
 
 	/**
@@ -720,20 +638,16 @@
 	 */
 	public InputPin getStructuredNodeInput(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		structuredNodeInputLoop : for (InputPin structuredNodeInput : getStructuredNodeInputs()) {
+		structuredNodeInputLoop: for (InputPin structuredNodeInput : getStructuredNodeInputs()) {
 			if (eClass != null && !eClass.isInstance(structuredNodeInput))
 				continue structuredNodeInputLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(structuredNodeInput.getName())
-				: name.equals(structuredNodeInput.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(structuredNodeInput.getName()) : name.equals(structuredNodeInput.getName())))
 				continue structuredNodeInputLoop;
 			if (type != null && !type.equals(structuredNodeInput.getType()))
 				continue structuredNodeInputLoop;
 			return structuredNodeInput;
 		}
-		return createOnDemand && eClass != null
-			? createStructuredNodeInput(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createStructuredNodeInput(name, type, eClass) : null;
 	}
 
 	/**
@@ -743,11 +657,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<OutputPin> getStructuredNodeOutputs() {
-		return (EList<OutputPin>) eDynamicGet(
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT,
-			true, true);
+		return (EList<OutputPin>) eDynamicGet(UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT, true, true);
 	}
 
 	/**
@@ -756,8 +666,7 @@
 	 * @generated
 	 */
 	public OutputPin createStructuredNodeOutput(String name, Type type) {
-		OutputPin newStructuredNodeOutput = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newStructuredNodeOutput = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		getStructuredNodeOutputs().add(newStructuredNodeOutput);
 		if (name != null)
 			newStructuredNodeOutput.setName(name);
@@ -782,18 +691,14 @@
 	 */
 	public OutputPin getStructuredNodeOutput(String name, Type type,
 			boolean ignoreCase, boolean createOnDemand) {
-		structuredNodeOutputLoop : for (OutputPin structuredNodeOutput : getStructuredNodeOutputs()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(structuredNodeOutput.getName())
-				: name.equals(structuredNodeOutput.getName())))
+		structuredNodeOutputLoop: for (OutputPin structuredNodeOutput : getStructuredNodeOutputs()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(structuredNodeOutput.getName()) : name.equals(structuredNodeOutput.getName())))
 				continue structuredNodeOutputLoop;
 			if (type != null && !type.equals(structuredNodeOutput.getType()))
 				continue structuredNodeOutputLoop;
 			return structuredNodeOutput;
 		}
-		return createOnDemand
-			? createStructuredNodeOutput(name, type)
-			: null;
+		return createOnDemand ? createStructuredNodeOutput(name, type) : null;
 	}
 
 	/**
@@ -802,11 +707,7 @@
 	 * @generated
 	 */
 	public boolean isMustIsolate() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE, true,
-			true);
+		return (Boolean) eDynamicGet(UMLPackage.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE, true, true);
 	}
 
 	/**
@@ -815,11 +716,7 @@
 	 * @generated
 	 */
 	public void setMustIsolate(boolean newMustIsolate) {
-		eDynamicSet(
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE,
-			newMustIsolate);
+		eDynamicSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE, newMustIsolate);
 	}
 
 	/**
@@ -829,9 +726,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ActivityEdge> getEdges() {
-		return (EList<ActivityEdge>) eDynamicGet(
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE__EDGE, true, true);
+		return (EList<ActivityEdge>) eDynamicGet(UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE__EDGE, true, true);
 	}
 
 	/**
@@ -863,18 +758,14 @@
 	 */
 	public ActivityEdge getEdge(String name, boolean ignoreCase, EClass eClass,
 			boolean createOnDemand) {
-		edgeLoop : for (ActivityEdge edge : getEdges()) {
+		edgeLoop: for (ActivityEdge edge : getEdges()) {
 			if (eClass != null && !eClass.isInstance(edge))
 				continue edgeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(edge.getName())
-				: name.equals(edge.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(edge.getName()) : name.equals(edge.getName())))
 				continue edgeLoop;
 			return edge;
 		}
-		return createOnDemand && eClass != null
-			? createEdge(name, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createEdge(name, eClass) : null;
 	}
 
 	/**
@@ -885,9 +776,7 @@
 	@Override
 	public Activity getActivity() {
 		Activity activity = basicGetActivity();
-		return activity != null && activity.eIsProxy()
-			? (Activity) eResolveProxy((InternalEObject) activity)
-			: activity;
+		return activity != null && activity.eIsProxy() ? (Activity) eResolveProxy((InternalEObject) activity) : activity;
 	}
 
 	/**
@@ -900,15 +789,14 @@
 		return super.basicGetActivity();
 	}
 
-	@Override
 	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
 		InternalEObject eInternalContainer = eInternalContainer();
 		if (eInternalContainer instanceof Activity) {
 			Activity activity = (Activity) eInternalContainer;
 			msgs = ((InternalEList<ActivityGroup>) activity.getGroups())
-				.basicRemove(this, msgs);
+					.basicRemove(this, msgs);
 			return ((InternalEList<ActivityNode>) activity.getNodes())
-				.basicRemove(this, msgs);
+					.basicRemove(this, msgs);
 		}
 		return super.eBasicRemoveFromContainer(msgs);
 	}
@@ -920,12 +808,12 @@
 		if (eInternalContainer instanceof Activity) {
 			Activity activity = (Activity) eInternalContainer;
 			msgs = ((InternalEList<ActivityGroup>) activity.getGroups())
-				.basicRemove(this, msgs);
+					.basicRemove(this, msgs);
 			msgs = ((InternalEList<ActivityNode>) activity.getNodes())
-				.basicRemove(this, msgs);
+					.basicRemove(this, msgs);
 		}
 		return super.eBasicSetContainer(newContainer, newContainerFeatureID,
-			msgs);
+				msgs);
 	}
 
 	/**
@@ -939,22 +827,22 @@
 		if (newActivity != eInternalContaner) {
 			if (EcoreUtil.isAncestor(this, newActivity))
 				throw new IllegalArgumentException(
-					"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
+						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
 			NotificationChain msgs = null;
 			if (eInternalContaner != null)
 				msgs = eBasicRemoveFromContainer(msgs);
 			if (newActivity != null)
 				msgs = ((InternalEList<StructuredActivityNode>) newActivity
-					.getStructuredNodes()).basicAdd(this, msgs);
+						.getStructuredNodes()).basicAdd(this, msgs);
 			msgs = eBasicSetContainer((InternalEObject) newActivity,
-				InternalEObject.EOPPOSITE_FEATURE_BASE
-					- UMLPackage.ACTIVITY__STRUCTURED_NODE,
-				msgs);
+					InternalEObject.EOPPOSITE_FEATURE_BASE
+							- UMLPackage.ACTIVITY__STRUCTURED_NODE,
+					msgs);
 			if (msgs != null)
 				msgs.dispatch();
 		} else if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET,
-				UMLPackage.ACTIVITY_NODE__ACTIVITY, newActivity, newActivity));
+					UMLPackage.ACTIVITY_NODE__ACTIVITY, newActivity, newActivity));
 	}
 
 	/**
@@ -973,8 +861,7 @@
 	 */
 	public boolean validateMembersDistinguishable(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return NamespaceOperations.validateMembersDistinguishable(this,
-			diagnostics, context);
+		return NamespaceOperations.validateMembersDistinguishable(this, diagnostics, context);
 	}
 
 	/**
@@ -984,8 +871,7 @@
 	 */
 	public boolean validateCannotImportSelf(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return NamespaceOperations.validateCannotImportSelf(this, diagnostics,
-			context);
+		return NamespaceOperations.validateCannotImportSelf(this, diagnostics, context);
 	}
 
 	/**
@@ -995,8 +881,7 @@
 	 */
 	public boolean validateCannotImportOwnedMembers(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return NamespaceOperations.validateCannotImportOwnedMembers(this,
-			diagnostics, context);
+		return NamespaceOperations.validateCannotImportOwnedMembers(this, diagnostics, context);
 	}
 
 	/**
@@ -1006,8 +891,7 @@
 	 */
 	public ElementImport createElementImport(PackageableElement element,
 			VisibilityKind visibility) {
-		return NamespaceOperations.createElementImport(this, element,
-			visibility);
+		return NamespaceOperations.createElementImport(this, element, visibility);
 	}
 
 	/**
@@ -1017,8 +901,7 @@
 	 */
 	public PackageImport createPackageImport(
 			org.eclipse.uml2.uml.Package package_, VisibilityKind visibility) {
-		return NamespaceOperations.createPackageImport(this, package_,
-			visibility);
+		return NamespaceOperations.createPackageImport(this, package_, visibility);
 	}
 
 	/**
@@ -1030,13 +913,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<PackageableElement> result = (EList<PackageableElement>) cache
-				.get(this,
-					UMLPackage.Literals.NAMESPACE___GET_IMPORTED_ELEMENTS);
+			EList<PackageableElement> result = (EList<PackageableElement>) cache.get(this, UMLPackage.Literals.NAMESPACE___GET_IMPORTED_ELEMENTS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.NAMESPACE___GET_IMPORTED_ELEMENTS,
-					result = NamespaceOperations.getImportedElements(this));
+				cache.put(this, UMLPackage.Literals.NAMESPACE___GET_IMPORTED_ELEMENTS, result = NamespaceOperations.getImportedElements(this));
 			}
 			return result;
 		}
@@ -1052,13 +931,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<org.eclipse.uml2.uml.Package> result = (EList<org.eclipse.uml2.uml.Package>) cache
-				.get(this,
-					UMLPackage.Literals.NAMESPACE___GET_IMPORTED_PACKAGES);
+			EList<org.eclipse.uml2.uml.Package> result = (EList<org.eclipse.uml2.uml.Package>) cache.get(this, UMLPackage.Literals.NAMESPACE___GET_IMPORTED_PACKAGES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.NAMESPACE___GET_IMPORTED_PACKAGES,
-					result = NamespaceOperations.getImportedPackages(this));
+				cache.put(this, UMLPackage.Literals.NAMESPACE___GET_IMPORTED_PACKAGES, result = NamespaceOperations.getImportedPackages(this));
 			}
 			return result;
 		}
@@ -1110,8 +985,7 @@
 	 */
 	public boolean validateNodesAndEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActivityGroupOperations.validateNodesAndEdges(this, diagnostics,
-			context);
+		return ActivityGroupOperations.validateNodesAndEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -1121,8 +995,7 @@
 	 */
 	public boolean validateNotContained(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ActivityGroupOperations.validateNotContained(this, diagnostics,
-			context);
+		return ActivityGroupOperations.validateNotContained(this, diagnostics, context);
 	}
 
 	/**
@@ -1142,8 +1015,7 @@
 	 */
 	public boolean validateOutputPinEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StructuredActivityNodeOperations.validateOutputPinEdges(this,
-			diagnostics, context);
+		return StructuredActivityNodeOperations.validateOutputPinEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -1153,8 +1025,7 @@
 	 */
 	public boolean validateEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StructuredActivityNodeOperations.validateEdges(this, diagnostics,
-			context);
+		return StructuredActivityNodeOperations.validateEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -1164,8 +1035,7 @@
 	 */
 	public boolean validateInputPinEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return StructuredActivityNodeOperations.validateInputPinEdges(this,
-			diagnostics, context);
+		return StructuredActivityNodeOperations.validateInputPinEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -1196,11 +1066,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Action> result = (EList<Action>) cache.get(this,
-				UMLPackage.Literals.ACTION___ALL_ACTIONS);
+			EList<Action> result = (EList<Action>) cache.get(this, UMLPackage.Literals.ACTION___ALL_ACTIONS);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.ACTION___ALL_ACTIONS,
-					result = StructuredActivityNodeOperations.allActions(this));
+				cache.put(this, UMLPackage.Literals.ACTION___ALL_ACTIONS, result = StructuredActivityNodeOperations.allActions(this));
 			}
 			return result;
 		}
@@ -1217,12 +1085,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<ActivityNode> result = (EList<ActivityNode>) cache.get(this,
-				UMLPackage.Literals.ACTION___ALL_OWNED_NODES);
+			EList<ActivityNode> result = (EList<ActivityNode>) cache.get(this, UMLPackage.Literals.ACTION___ALL_OWNED_NODES);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.ACTION___ALL_OWNED_NODES,
-					result = StructuredActivityNodeOperations
-						.allOwnedNodes(this));
+				cache.put(this, UMLPackage.Literals.ACTION___ALL_OWNED_NODES, result = StructuredActivityNodeOperations.allOwnedNodes(this));
 			}
 			return result;
 		}
@@ -1239,47 +1104,34 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_STRUCTURED_NODE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetInStructuredNode(
-					(StructuredActivityNode) otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__INCOMING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTGOING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_PARTITION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getHandlers())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEdges())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getVariables())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getNodes())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInInterruptibleRegions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_STRUCTURED_NODE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetInStructuredNode((StructuredActivityNode) otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__INCOMING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTGOING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_PARTITION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInPartitions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getHandlers()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEdges()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getVariables()).basicAdd(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getNodes()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -1293,61 +1145,44 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE :
-				return ((InternalEList<?>) getEdges()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT :
-				return ((InternalEList<?>) getStructuredNodeInputs())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT :
-				return ((InternalEList<?>) getStructuredNodeOutputs())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE :
-				return ((InternalEList<?>) getVariables()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE :
-				return ((InternalEList<?>) getNodes()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE:
+			return ((InternalEList<?>) getEdges()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT:
+			return ((InternalEList<?>) getStructuredNodeInputs()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT:
+			return ((InternalEList<?>) getStructuredNodeOutputs()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE:
+			return ((InternalEList<?>) getVariables()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE:
+			return ((InternalEList<?>) getNodes()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -1360,112 +1195,112 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME :
-				return getName();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__INCOMING :
-				return getIncomings();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER :
-				return getHandlers();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__INPUT :
-				return getInputs();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTPUT :
-				return getOutputs();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER :
-				return getMembers();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_EDGE :
-				return getContainedEdges();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_NODE :
-				return getContainedNodes();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_ACTIVITY :
-				if (resolve)
-					return getInActivity();
-				return basicGetInActivity();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP :
-				return getSubgroups();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__SUPER_GROUP :
-				if (resolve)
-					return getSuperGroup();
-				return basicGetSuperGroup();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE :
-				return getEdges();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE :
-				return isMustIsolate();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT :
-				return getStructuredNodeInputs();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT :
-				return getStructuredNodeOutputs();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE :
-				return getVariables();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE :
-				return getNodes();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME:
+			return getName();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__INCOMING:
+			return getIncomings();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER:
+			return getHandlers();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__INPUT:
+			return getInputs();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTPUT:
+			return getOutputs();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER:
+			return getMembers();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_EDGE:
+			return getContainedEdges();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_NODE:
+			return getContainedNodes();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_ACTIVITY:
+			if (resolve)
+				return getInActivity();
+			return basicGetInActivity();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP:
+			return getSubgroups();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__SUPER_GROUP:
+			if (resolve)
+				return getSuperGroup();
+			return basicGetSuperGroup();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE:
+			return getEdges();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE:
+			return isMustIsolate();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT:
+			return getStructuredNodeInputs();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT:
+			return getStructuredNodeOutputs();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE:
+			return getVariables();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE:
+			return getNodes();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -1479,123 +1314,105 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_ACTIVITY :
-				setInActivity((Activity) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE :
-				getEdges().clear();
-				getEdges()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE :
-				setMustIsolate((Boolean) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT :
-				getStructuredNodeInputs().clear();
-				getStructuredNodeInputs()
-					.addAll((Collection<? extends InputPin>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT :
-				getStructuredNodeOutputs().clear();
-				getStructuredNodeOutputs()
-					.addAll((Collection<? extends OutputPin>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE :
-				getVariables().clear();
-				getVariables()
-					.addAll((Collection<? extends Variable>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE :
-				getNodes().clear();
-				getNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_ACTIVITY:
+			setInActivity((Activity) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE:
+			getEdges().clear();
+			getEdges().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE:
+			setMustIsolate((Boolean) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT:
+			getStructuredNodeInputs().clear();
+			getStructuredNodeInputs().addAll((Collection<? extends InputPin>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT:
+			getStructuredNodeOutputs().clear();
+			getStructuredNodeOutputs().addAll((Collection<? extends OutputPin>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE:
+			getVariables().clear();
+			getVariables().addAll((Collection<? extends Variable>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE:
+			getNodes().clear();
+			getNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -1608,87 +1425,87 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_ACTIVITY :
-				setInActivity((Activity) null);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE :
-				getEdges().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE :
-				setMustIsolate(MUST_ISOLATE_EDEFAULT);
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT :
-				getStructuredNodeInputs().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT :
-				getStructuredNodeOutputs().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE :
-				getVariables().clear();
-				return;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE :
-				getNodes().clear();
-				return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_ACTIVITY:
+			setInActivity((Activity) null);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE:
+			getEdges().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE:
+			setMustIsolate(MUST_ISOLATE_EDEFAULT);
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT:
+			getStructuredNodeInputs().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT:
+			getStructuredNodeOutputs().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE:
+			getVariables().clear();
+			return;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE:
+			getNodes().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1701,98 +1518,96 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNER :
-				return isSetOwner();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME :
-				return isSetName();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__ACTIVITY :
-				return isSetActivity();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__INPUT :
-				return isSetInputs();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER :
-				return isSetMembers();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_EDGE :
-				return isSetContainedEdges();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_NODE :
-				return isSetContainedNodes();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_ACTIVITY :
-				return isSetInActivity();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP :
-				return isSetSubgroups();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__SUPER_GROUP :
-				return isSetSuperGroup();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE :
-				return !getEdges().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE :
-				return isMustIsolate() != MUST_ISOLATE_EDEFAULT;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT :
-				return !getStructuredNodeInputs().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT :
-				return !getStructuredNodeOutputs().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE :
-				return !getVariables().isEmpty();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE :
-				return !getNodes().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNER:
+			return isSetOwner();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME:
+			return isSetName();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__ACTIVITY:
+			return isSetActivity();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__INPUT:
+			return isSetInputs();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER:
+			return isSetMembers();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_EDGE:
+			return isSetContainedEdges();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_NODE:
+			return isSetContainedNodes();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_ACTIVITY:
+			return isSetInActivity();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP:
+			return isSetSubgroups();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__SUPER_GROUP:
+			return isSetSuperGroup();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE:
+			return !getEdges().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__MUST_ISOLATE:
+			return isMustIsolate() != MUST_ISOLATE_EDEFAULT;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT:
+			return !getStructuredNodeInputs().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT:
+			return !getStructuredNodeOutputs().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE:
+			return !getVariables().isEmpty();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE:
+			return !getNodes().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1807,36 +1622,36 @@
 			Class<?> baseClass) {
 		if (baseClass == Namespace.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE :
-					return UMLPackage.NAMESPACE__OWNED_RULE;
-				case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT :
-					return UMLPackage.NAMESPACE__ELEMENT_IMPORT;
-				case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT :
-					return UMLPackage.NAMESPACE__PACKAGE_IMPORT;
-				case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER :
-					return UMLPackage.NAMESPACE__OWNED_MEMBER;
-				case UMLPackage.STRUCTURED_ACTIVITY_NODE__IMPORTED_MEMBER :
-					return UMLPackage.NAMESPACE__IMPORTED_MEMBER;
-				case UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER :
-					return UMLPackage.NAMESPACE__MEMBER;
-				default :
-					return -1;
+			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE:
+				return UMLPackage.NAMESPACE__OWNED_RULE;
+			case UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT:
+				return UMLPackage.NAMESPACE__ELEMENT_IMPORT;
+			case UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT:
+				return UMLPackage.NAMESPACE__PACKAGE_IMPORT;
+			case UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER:
+				return UMLPackage.NAMESPACE__OWNED_MEMBER;
+			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IMPORTED_MEMBER:
+				return UMLPackage.NAMESPACE__IMPORTED_MEMBER;
+			case UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER:
+				return UMLPackage.NAMESPACE__MEMBER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == ActivityGroup.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_EDGE :
-					return UMLPackage.ACTIVITY_GROUP__CONTAINED_EDGE;
-				case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_NODE :
-					return UMLPackage.ACTIVITY_GROUP__CONTAINED_NODE;
-				case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_ACTIVITY :
-					return UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY;
-				case UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP :
-					return UMLPackage.ACTIVITY_GROUP__SUBGROUP;
-				case UMLPackage.STRUCTURED_ACTIVITY_NODE__SUPER_GROUP :
-					return UMLPackage.ACTIVITY_GROUP__SUPER_GROUP;
-				default :
-					return -1;
+			case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_EDGE:
+				return UMLPackage.ACTIVITY_GROUP__CONTAINED_EDGE;
+			case UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_NODE:
+				return UMLPackage.ACTIVITY_GROUP__CONTAINED_NODE;
+			case UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_ACTIVITY:
+				return UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY;
+			case UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP:
+				return UMLPackage.ACTIVITY_GROUP__SUBGROUP;
+			case UMLPackage.STRUCTURED_ACTIVITY_NODE__SUPER_GROUP:
+				return UMLPackage.ACTIVITY_GROUP__SUPER_GROUP;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -1852,36 +1667,36 @@
 			Class<?> baseClass) {
 		if (baseClass == Namespace.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.NAMESPACE__OWNED_RULE :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE;
-				case UMLPackage.NAMESPACE__ELEMENT_IMPORT :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT;
-				case UMLPackage.NAMESPACE__PACKAGE_IMPORT :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT;
-				case UMLPackage.NAMESPACE__OWNED_MEMBER :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER;
-				case UMLPackage.NAMESPACE__IMPORTED_MEMBER :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE__IMPORTED_MEMBER;
-				case UMLPackage.NAMESPACE__MEMBER :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER;
-				default :
-					return -1;
+			case UMLPackage.NAMESPACE__OWNED_RULE:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE;
+			case UMLPackage.NAMESPACE__ELEMENT_IMPORT:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT;
+			case UMLPackage.NAMESPACE__PACKAGE_IMPORT:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT;
+			case UMLPackage.NAMESPACE__OWNED_MEMBER:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER;
+			case UMLPackage.NAMESPACE__IMPORTED_MEMBER:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE__IMPORTED_MEMBER;
+			case UMLPackage.NAMESPACE__MEMBER:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE__MEMBER;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == ActivityGroup.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.ACTIVITY_GROUP__CONTAINED_EDGE :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_EDGE;
-				case UMLPackage.ACTIVITY_GROUP__CONTAINED_NODE :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_NODE;
-				case UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_ACTIVITY;
-				case UMLPackage.ACTIVITY_GROUP__SUBGROUP :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP;
-				case UMLPackage.ACTIVITY_GROUP__SUPER_GROUP :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE__SUPER_GROUP;
-				default :
-					return -1;
+			case UMLPackage.ACTIVITY_GROUP__CONTAINED_EDGE:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_EDGE;
+			case UMLPackage.ACTIVITY_GROUP__CONTAINED_NODE:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE__CONTAINED_NODE;
+			case UMLPackage.ACTIVITY_GROUP__IN_ACTIVITY:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE__IN_ACTIVITY;
+			case UMLPackage.ACTIVITY_GROUP__SUBGROUP:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP;
+			case UMLPackage.ACTIVITY_GROUP__SUPER_GROUP:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE__SUPER_GROUP;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1896,44 +1711,44 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == Namespace.class) {
 			switch (baseOperationID) {
-				case UMLPackage.NAMESPACE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.NAMESPACE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.NAMESPACE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.NAMESPACE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND;
-				case UMLPackage.NAMESPACE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND;
-				case UMLPackage.NAMESPACE___GET_IMPORTED_ELEMENTS :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_IMPORTED_ELEMENTS;
-				case UMLPackage.NAMESPACE___GET_IMPORTED_PACKAGES :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_IMPORTED_PACKAGES;
-				case UMLPackage.NAMESPACE___GET_OWNED_MEMBERS :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_OWNED_MEMBERS;
-				case UMLPackage.NAMESPACE___EXCLUDE_COLLISIONS__ELIST :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE___EXCLUDE_COLLISIONS__ELIST;
-				case UMLPackage.NAMESPACE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_NAMES_OF_MEMBER__NAMEDELEMENT;
-				case UMLPackage.NAMESPACE___IMPORT_MEMBERS__ELIST :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE___IMPORT_MEMBERS__ELIST;
-				case UMLPackage.NAMESPACE___GET_IMPORTED_MEMBERS :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_IMPORTED_MEMBERS;
-				case UMLPackage.NAMESPACE___MEMBERS_ARE_DISTINGUISHABLE :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE___MEMBERS_ARE_DISTINGUISHABLE;
-				default :
-					return -1;
+			case UMLPackage.NAMESPACE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.NAMESPACE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.NAMESPACE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.NAMESPACE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND;
+			case UMLPackage.NAMESPACE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND;
+			case UMLPackage.NAMESPACE___GET_IMPORTED_ELEMENTS:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_IMPORTED_ELEMENTS;
+			case UMLPackage.NAMESPACE___GET_IMPORTED_PACKAGES:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_IMPORTED_PACKAGES;
+			case UMLPackage.NAMESPACE___GET_OWNED_MEMBERS:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_OWNED_MEMBERS;
+			case UMLPackage.NAMESPACE___EXCLUDE_COLLISIONS__ELIST:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE___EXCLUDE_COLLISIONS__ELIST;
+			case UMLPackage.NAMESPACE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_NAMES_OF_MEMBER__NAMEDELEMENT;
+			case UMLPackage.NAMESPACE___IMPORT_MEMBERS__ELIST:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE___IMPORT_MEMBERS__ELIST;
+			case UMLPackage.NAMESPACE___GET_IMPORTED_MEMBERS:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_IMPORTED_MEMBERS;
+			case UMLPackage.NAMESPACE___MEMBERS_ARE_DISTINGUISHABLE:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE___MEMBERS_ARE_DISTINGUISHABLE;
+			default:
+				return -1;
 			}
 		}
 		if (baseClass == ActivityGroup.class) {
 			switch (baseOperationID) {
-				case UMLPackage.ACTIVITY_GROUP___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.ACTIVITY_GROUP___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP;
-				default :
-					return -1;
+			case UMLPackage.ACTIVITY_GROUP___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.ACTIVITY_GROUP___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -1949,210 +1764,170 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_MODEL :
-				return getModel();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___SEPARATOR :
-				return separator();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateNodesAndEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP :
-				return validateNotContained((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_OUTPUT_PIN_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateOutputPinEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_INPUT_PIN_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateInputPinEdges((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___SOURCE_NODES :
-				return sourceNodes();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE___TARGET_NODES :
-				return targetNodes();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_MODEL:
+			return getModel();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___SEPARATOR:
+			return separator();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_NODES_AND_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateNodesAndEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_NOT_CONTAINED__DIAGNOSTICCHAIN_MAP:
+			return validateNotContained((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_OUTPUT_PIN_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateOutputPinEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___VALIDATE_INPUT_PIN_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateInputPinEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___SOURCE_NODES:
+			return sourceNodes();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE___TARGET_NODES:
+			return targetNodes();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -2165,11 +1940,12 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT)
-			|| eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT)
-			|| isSetOwnedMembers() || isSetSubgroups()
-			|| eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE)
-			|| eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE);
+				|| eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT)
+				|| eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT)
+				|| isSetOwnedMembers()
+				|| isSetSubgroups()
+				|| eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE)
+				|| eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE);
 	}
 
 	/**
@@ -2180,9 +1956,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE,
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE, UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedElements() <em>Owned Element</em>}' reference list.
@@ -2192,20 +1966,10 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_COMMENT,
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME_EXPRESSION,
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER,
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__INPUT,
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_POSTCONDITION,
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_PRECONDITION,
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTPUT,
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT,
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT,
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER,
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP,
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE,
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_COMMENT, UMLPackage.STRUCTURED_ACTIVITY_NODE__NAME_EXPRESSION, UMLPackage.STRUCTURED_ACTIVITY_NODE__HANDLER,
+			UMLPackage.STRUCTURED_ACTIVITY_NODE__INPUT, UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_POSTCONDITION, UMLPackage.STRUCTURED_ACTIVITY_NODE__LOCAL_PRECONDITION, UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTPUT,
+			UMLPackage.STRUCTURED_ACTIVITY_NODE__ELEMENT_IMPORT, UMLPackage.STRUCTURED_ACTIVITY_NODE__PACKAGE_IMPORT, UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER, UMLPackage.STRUCTURED_ACTIVITY_NODE__SUBGROUP, UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE,
+			UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2223,12 +1987,10 @@
 	 */
 	public NamedElement getOwnedMember(String name, boolean ignoreCase,
 			EClass eClass) {
-		ownedMemberLoop : for (NamedElement ownedMember : getOwnedMembers()) {
+		ownedMemberLoop: for (NamedElement ownedMember : getOwnedMembers()) {
 			if (eClass != null && !eClass.isInstance(ownedMember))
 				continue ownedMemberLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedMember.getName())
-				: name.equals(ownedMember.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedMember.getName()) : name.equals(ownedMember.getName())))
 				continue ownedMemberLoop;
 			return ownedMember;
 		}
@@ -2243,9 +2005,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] MEMBER_ESUBSETS = new int[]{
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER,
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__IMPORTED_MEMBER};
+	protected static final int[] MEMBER_ESUBSETS = new int[] { UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_MEMBER, UMLPackage.STRUCTURED_ACTIVITY_NODE__IMPORTED_MEMBER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2263,12 +2023,10 @@
 	 */
 	public NamedElement getMember(String name, boolean ignoreCase,
 			EClass eClass) {
-		memberLoop : for (NamedElement member : getMembers()) {
+		memberLoop: for (NamedElement member : getMembers()) {
 			if (eClass != null && !eClass.isInstance(member))
 				continue memberLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(member.getName())
-				: name.equals(member.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(member.getName()) : name.equals(member.getName())))
 				continue memberLoop;
 			return member;
 		}
@@ -2282,7 +2040,7 @@
 	 */
 	public boolean isSetOwnedMembers() {
 		return eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__OWNED_RULE)
-			|| eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE);
+				|| eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE);
 	}
 
 	/**
@@ -2292,7 +2050,7 @@
 	 */
 	public boolean isSetMembers() {
 		return isSetOwnedMembers()
-			|| eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__IMPORTED_MEMBER);
+				|| eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__IMPORTED_MEMBER);
 	}
 
 	/**
@@ -2321,9 +2079,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -2333,9 +2089,7 @@
 	 */
 	public ActivityGroup getSuperGroup() {
 		ActivityGroup superGroup = basicGetSuperGroup();
-		return superGroup != null && superGroup.eIsProxy()
-			? (ActivityGroup) eResolveProxy((InternalEObject) superGroup)
-			: superGroup;
+		return superGroup != null && superGroup.eIsProxy() ? (ActivityGroup) eResolveProxy((InternalEObject) superGroup) : superGroup;
 	}
 
 	/**
@@ -2370,7 +2124,9 @@
 	 */
 	@Override
 	public boolean isSetOwner() {
-		return super.isSetOwner() || isSetInActivity() || isSetSuperGroup();
+		return super.isSetOwner()
+				|| isSetInActivity()
+				|| isSetSuperGroup();
 	}
 
 	/**
@@ -2384,19 +2140,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.STRUCTURED_ACTIVITY_NODE__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.STRUCTURED_ACTIVITY_NODE__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.STRUCTURED_ACTIVITY_NODE__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -2410,19 +2160,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this,
-						UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.STRUCTURED_ACTIVITY_NODE__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -2441,12 +2185,10 @@
 	 */
 	public ActivityNode getContainedNode(String name, boolean ignoreCase,
 			EClass eClass) {
-		containedNodeLoop : for (ActivityNode containedNode : getContainedNodes()) {
+		containedNodeLoop: for (ActivityNode containedNode : getContainedNodes()) {
 			if (eClass != null && !eClass.isInstance(containedNode))
 				continue containedNodeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(containedNode.getName())
-				: name.equals(containedNode.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(containedNode.getName()) : name.equals(containedNode.getName())))
 				continue containedNodeLoop;
 			return containedNode;
 		}
@@ -2461,8 +2203,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] CONTAINED_EDGE_ESUBSETS = new int[]{
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE};
+	protected static final int[] CONTAINED_EDGE_ESUBSETS = new int[] { UMLPackage.STRUCTURED_ACTIVITY_NODE__EDGE };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getContainedNodes() <em>Contained Node</em>}' reference list.
@@ -2472,8 +2213,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] CONTAINED_NODE_ESUBSETS = new int[]{
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE};
+	protected static final int[] CONTAINED_NODE_ESUBSETS = new int[] { UMLPackage.STRUCTURED_ACTIVITY_NODE__NODE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2491,12 +2231,10 @@
 	 */
 	public ActivityEdge getContainedEdge(String name, boolean ignoreCase,
 			EClass eClass) {
-		containedEdgeLoop : for (ActivityEdge containedEdge : getContainedEdges()) {
+		containedEdgeLoop: for (ActivityEdge containedEdge : getContainedEdges()) {
 			if (eClass != null && !eClass.isInstance(containedEdge))
 				continue containedEdgeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(containedEdge.getName())
-				: name.equals(containedEdge.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(containedEdge.getName()) : name.equals(containedEdge.getName())))
 				continue containedEdgeLoop;
 			return containedEdge;
 		}
@@ -2511,8 +2249,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOutputs() <em>Output</em>}' reference list.
@@ -2522,8 +2259,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -2550,8 +2286,8 @@
 	 */
 	@Override
 	public boolean isSetInputs() {
-		return super.isSetInputs() || eIsSet(
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT);
+		return super.isSetInputs()
+				|| eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_INPUT);
 	}
 
 	/**
@@ -2561,8 +2297,8 @@
 	 */
 	@Override
 	public boolean isSetOutputs() {
-		return super.isSetOutputs() || eIsSet(
-			UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT);
+		return super.isSetOutputs()
+				|| eIsSet(UMLPackage.STRUCTURED_ACTIVITY_NODE__STRUCTURED_NODE_OUTPUT);
 	}
 
 	/**
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuredClassifierImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuredClassifierImpl.java
index ee32b19..164bf82 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuredClassifierImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/StructuredClassifierImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -32,6 +32,7 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -123,21 +124,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<ConnectableElement> roles = (EList<ConnectableElement>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.STRUCTURED_CLASSIFIER__ROLE);
+			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<ConnectableElement>(
-						ConnectableElement.class, this,
-						UMLPackage.STRUCTURED_CLASSIFIER__ROLE, ROLE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.STRUCTURED_CLASSIFIER__ROLE, roles = new DerivedUnionEObjectEList<ConnectableElement>(ConnectableElement.class, this, UMLPackage.STRUCTURED_CLASSIFIER__ROLE, ROLE_ESUBSETS));
 			}
 			return roles;
 		}
-		return new DerivedUnionEObjectEList<ConnectableElement>(
-			ConnectableElement.class, this,
-			UMLPackage.STRUCTURED_CLASSIFIER__ROLE, ROLE_ESUBSETS);
+		return new DerivedUnionEObjectEList<ConnectableElement>(ConnectableElement.class, this, UMLPackage.STRUCTURED_CLASSIFIER__ROLE, ROLE_ESUBSETS);
 	}
 
 	/**
@@ -151,21 +144,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.STRUCTURED_CLASSIFIER__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.STRUCTURED_CLASSIFIER__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.STRUCTURED_CLASSIFIER__OWNED_MEMBER,
-			OWNED_MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.STRUCTURED_CLASSIFIER__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -179,20 +164,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Property> attributes = (EList<Property>) cache.get(eResource,
-				this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE);
+			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>(
-						Property.class, this,
-						UMLPackage.STRUCTURED_CLASSIFIER__ATTRIBUTE,
-						ATTRIBUTE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.CLASSIFIER__ATTRIBUTE, attributes = new DerivedUnionEObjectEList<Property>(Property.class, this, UMLPackage.STRUCTURED_CLASSIFIER__ATTRIBUTE, ATTRIBUTE_ESUBSETS));
 			}
 			return attributes;
 		}
-		return new DerivedUnionEObjectEList<Property>(Property.class, this,
-			UMLPackage.STRUCTURED_CLASSIFIER__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Property>(Property.class, this, UMLPackage.STRUCTURED_CLASSIFIER__ATTRIBUTE, ATTRIBUTE_ESUBSETS);
 	}
 
 	/**
@@ -206,20 +184,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> members = (EList<NamedElement>) cache
-				.get(eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER);
+			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>(
-						NamedElement.class, this,
-						UMLPackage.STRUCTURED_CLASSIFIER__MEMBER,
-						MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__MEMBER, members = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.STRUCTURED_CLASSIFIER__MEMBER, MEMBER_ESUBSETS));
 			}
 			return members;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class,
-			this, UMLPackage.STRUCTURED_CLASSIFIER__MEMBER, MEMBER_ESUBSETS);
+		return new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.STRUCTURED_CLASSIFIER__MEMBER, MEMBER_ESUBSETS);
 	}
 
 	/**
@@ -233,20 +204,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Feature> features = (EList<Feature>) cache.get(eResource,
-				this, UMLPackage.Literals.CLASSIFIER__FEATURE);
+			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>(
-						Feature.class, this,
-						UMLPackage.STRUCTURED_CLASSIFIER__FEATURE,
-						FEATURE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.CLASSIFIER__FEATURE, features = new DerivedUnionEObjectEList<Feature>(Feature.class, this, UMLPackage.STRUCTURED_CLASSIFIER__FEATURE, FEATURE_ESUBSETS));
 			}
 			return features;
 		}
-		return new DerivedUnionEObjectEList<Feature>(Feature.class, this,
-			UMLPackage.STRUCTURED_CLASSIFIER__FEATURE, FEATURE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Feature>(Feature.class, this, UMLPackage.STRUCTURED_CLASSIFIER__FEATURE, FEATURE_ESUBSETS);
 	}
 
 	/**
@@ -256,11 +220,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Property> getOwnedAttributes() {
-		return (EList<Property>) eDynamicGet(
-			UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE, true,
-			true);
+		return (EList<Property>) eDynamicGet(UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE, true, true);
 	}
 
 	/**
@@ -304,20 +264,16 @@
 	 */
 	public Property getOwnedAttribute(String name, Type type,
 			boolean ignoreCase, EClass eClass, boolean createOnDemand) {
-		ownedAttributeLoop : for (Property ownedAttribute : getOwnedAttributes()) {
+		ownedAttributeLoop: for (Property ownedAttribute : getOwnedAttributes()) {
 			if (eClass != null && !eClass.isInstance(ownedAttribute))
 				continue ownedAttributeLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedAttribute.getName())
-				: name.equals(ownedAttribute.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedAttribute.getName()) : name.equals(ownedAttribute.getName())))
 				continue ownedAttributeLoop;
 			if (type != null && !type.equals(ownedAttribute.getType()))
 				continue ownedAttributeLoop;
 			return ownedAttribute;
 		}
-		return createOnDemand && eClass != null
-			? createOwnedAttribute(name, type, eClass)
-			: null;
+		return createOnDemand && eClass != null ? createOwnedAttribute(name, type, eClass) : null;
 	}
 
 	protected static class PartEList
@@ -331,7 +287,7 @@
 		@Override
 		public List<Property> basicList() {
 			return new PartEList(dataClass, owner, featureID,
-				sourceFeatureIDs) {
+					sourceFeatureIDs) {
 
 				@Override
 				public ListIterator<Property> listIterator(int index) {
@@ -348,7 +304,7 @@
 		@Override
 		protected boolean isIncluded(Object object) {
 			return super.isIncluded(object)
-				&& ((Property) object).isComposite();
+					&& ((Property) object).isComposite();
 		}
 
 	}
@@ -357,8 +313,8 @@
 	 * The array of superset feature identifiers for the '{@link #getParts() <em>Part</em>}' reference list.
 	 * @see #getParts()
 	 */
-	protected static final int[] PART_ESUPERSETS = new int[]{
-		UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE};
+	protected static final int[] PART_ESUPERSETS = new int[] {
+			UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -371,18 +327,18 @@
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
 			EList<Property> parts = (EList<Property>) cache.get(eResource, this,
-				UMLPackage.Literals.STRUCTURED_CLASSIFIER__PART);
+					UMLPackage.Literals.STRUCTURED_CLASSIFIER__PART);
 			if (parts == null) {
 				cache.put(eResource, this,
-					UMLPackage.Literals.STRUCTURED_CLASSIFIER__PART,
-					parts = new PartEList(Property.class, this,
-						UMLPackage.STRUCTURED_CLASSIFIER__PART,
-						PART_ESUPERSETS));
+						UMLPackage.Literals.STRUCTURED_CLASSIFIER__PART,
+						parts = new PartEList(Property.class, this,
+								UMLPackage.STRUCTURED_CLASSIFIER__PART,
+								PART_ESUPERSETS));
 			}
 			return parts;
 		}
 		return new PartEList(Property.class, this,
-			UMLPackage.STRUCTURED_CLASSIFIER__PART, PART_ESUPERSETS);
+				UMLPackage.STRUCTURED_CLASSIFIER__PART, PART_ESUPERSETS);
 	}
 
 	/**
@@ -401,12 +357,10 @@
 	 */
 	public Property getPart(String name, Type type, boolean ignoreCase,
 			EClass eClass) {
-		partLoop : for (Property part : getParts()) {
+		partLoop: for (Property part : getParts()) {
 			if (eClass != null && !eClass.isInstance(part))
 				continue partLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(part.getName())
-				: name.equals(part.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(part.getName()) : name.equals(part.getName())))
 				continue partLoop;
 			if (type != null && !type.equals(part.getType()))
 				continue partLoop;
@@ -422,11 +376,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Connector> getOwnedConnectors() {
-		return (EList<Connector>) eDynamicGet(
-			UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR, true,
-			true);
+		return (EList<Connector>) eDynamicGet(UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR, true, true);
 	}
 
 	/**
@@ -435,8 +385,7 @@
 	 * @generated
 	 */
 	public Connector createOwnedConnector(String name) {
-		Connector newOwnedConnector = (Connector) create(
-			UMLPackage.Literals.CONNECTOR);
+		Connector newOwnedConnector = (Connector) create(UMLPackage.Literals.CONNECTOR);
 		getOwnedConnectors().add(newOwnedConnector);
 		if (name != null)
 			newOwnedConnector.setName(name);
@@ -459,16 +408,12 @@
 	 */
 	public Connector getOwnedConnector(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		ownedConnectorLoop : for (Connector ownedConnector : getOwnedConnectors()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(ownedConnector.getName())
-				: name.equals(ownedConnector.getName())))
+		ownedConnectorLoop: for (Connector ownedConnector : getOwnedConnectors()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(ownedConnector.getName()) : name.equals(ownedConnector.getName())))
 				continue ownedConnectorLoop;
 			return ownedConnector;
 		}
-		return createOnDemand
-			? createOwnedConnector(name)
-			: null;
+		return createOnDemand ? createOwnedConnector(name) : null;
 	}
 
 	/**
@@ -478,8 +423,7 @@
 	 */
 	public Property createOwnedAttribute(String name, Type type, int lower,
 			int upper) {
-		return StructuredClassifierOperations.createOwnedAttribute(this, name,
-			type, lower, upper);
+		return StructuredClassifierOperations.createOwnedAttribute(this, name, type, lower, upper);
 	}
 
 	/**
@@ -491,13 +435,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<ConnectableElement> result = (EList<ConnectableElement>) cache
-				.get(this,
-					UMLPackage.Literals.STRUCTURED_CLASSIFIER___ALL_ROLES);
+			EList<ConnectableElement> result = (EList<ConnectableElement>) cache.get(this, UMLPackage.Literals.STRUCTURED_CLASSIFIER___ALL_ROLES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.STRUCTURED_CLASSIFIER___ALL_ROLES,
-					result = StructuredClassifierOperations.allRoles(this));
+				cache.put(this, UMLPackage.Literals.STRUCTURED_CLASSIFIER___ALL_ROLES, result = StructuredClassifierOperations.allRoles(this));
 			}
 			return result;
 		}
@@ -513,56 +453,42 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURED_CLASSIFIER__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_CLASSIFIER__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_CLASSIFIER__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.STRUCTURED_CLASSIFIER__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_CLASSIFIER__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_CLASSIFIER__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_CLASSIFIER__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.STRUCTURED_CLASSIFIER__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE :
-				return ((InternalEList<?>) getOwnedAttributes())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR :
-				return ((InternalEList<?>) getOwnedConnectors())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_CLASSIFIER__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_CLASSIFIER__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_CLASSIFIER__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.STRUCTURED_CLASSIFIER__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_CLASSIFIER__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_CLASSIFIER__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_CLASSIFIER__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_CLASSIFIER__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE:
+			return ((InternalEList<?>) getOwnedAttributes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR:
+			return ((InternalEList<?>) getOwnedConnectors()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -575,106 +501,106 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURED_CLASSIFIER__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.STRUCTURED_CLASSIFIER__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.STRUCTURED_CLASSIFIER__NAME :
-				return getName();
-			case UMLPackage.STRUCTURED_CLASSIFIER__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.STRUCTURED_CLASSIFIER__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.STRUCTURED_CLASSIFIER__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STRUCTURED_CLASSIFIER__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.STRUCTURED_CLASSIFIER__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.STRUCTURED_CLASSIFIER__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.STRUCTURED_CLASSIFIER__MEMBER :
-				return getMembers();
-			case UMLPackage.STRUCTURED_CLASSIFIER__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.STRUCTURED_CLASSIFIER__FEATURE :
-				return getFeatures();
-			case UMLPackage.STRUCTURED_CLASSIFIER__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.STRUCTURED_CLASSIFIER__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.STRUCTURED_CLASSIFIER__GENERAL :
-				return getGenerals();
-			case UMLPackage.STRUCTURED_CLASSIFIER__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.STRUCTURED_CLASSIFIER__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.STRUCTURED_CLASSIFIER__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.STRUCTURED_CLASSIFIER__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.STRUCTURED_CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.STRUCTURED_CLASSIFIER__USE_CASE :
-				return getUseCases();
-			case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.STRUCTURED_CLASSIFIER__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.STRUCTURED_CLASSIFIER__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE :
-				return getOwnedAttributes();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR :
-				return getOwnedConnectors();
-			case UMLPackage.STRUCTURED_CLASSIFIER__PART :
-				return getParts();
-			case UMLPackage.STRUCTURED_CLASSIFIER__ROLE :
-				return getRoles();
+		case UMLPackage.STRUCTURED_CLASSIFIER__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.STRUCTURED_CLASSIFIER__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.STRUCTURED_CLASSIFIER__NAME:
+			return getName();
+		case UMLPackage.STRUCTURED_CLASSIFIER__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.STRUCTURED_CLASSIFIER__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.STRUCTURED_CLASSIFIER__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STRUCTURED_CLASSIFIER__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.STRUCTURED_CLASSIFIER__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.STRUCTURED_CLASSIFIER__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.STRUCTURED_CLASSIFIER__MEMBER:
+			return getMembers();
+		case UMLPackage.STRUCTURED_CLASSIFIER__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.STRUCTURED_CLASSIFIER__FEATURE:
+			return getFeatures();
+		case UMLPackage.STRUCTURED_CLASSIFIER__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.STRUCTURED_CLASSIFIER__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.STRUCTURED_CLASSIFIER__GENERAL:
+			return getGenerals();
+		case UMLPackage.STRUCTURED_CLASSIFIER__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.STRUCTURED_CLASSIFIER__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.STRUCTURED_CLASSIFIER__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.STRUCTURED_CLASSIFIER__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.STRUCTURED_CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.STRUCTURED_CLASSIFIER__USE_CASE:
+			return getUseCases();
+		case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.STRUCTURED_CLASSIFIER__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.STRUCTURED_CLASSIFIER__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE:
+			return getOwnedAttributes();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR:
+			return getOwnedConnectors();
+		case UMLPackage.STRUCTURED_CLASSIFIER__PART:
+			return getParts();
+		case UMLPackage.STRUCTURED_CLASSIFIER__ROLE:
+			return getRoles();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -688,118 +614,103 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURED_CLASSIFIER__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				getOwnedAttributes()
-					.addAll((Collection<? extends Property>) newValue);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				getOwnedConnectors()
-					.addAll((Collection<? extends Connector>) newValue);
-				return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			getOwnedAttributes().addAll((Collection<? extends Property>) newValue);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			getOwnedConnectors().addAll((Collection<? extends Connector>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -812,87 +723,87 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURED_CLASSIFIER__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__NAME :
-				unsetName();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE :
-				getOwnedAttributes().clear();
-				return;
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR :
-				getOwnedConnectors().clear();
-				return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__NAME:
+			unsetName();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE:
+			getOwnedAttributes().clear();
+			return;
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR:
+			getOwnedConnectors().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -905,92 +816,90 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.STRUCTURED_CLASSIFIER__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNER :
-				return isSetOwner();
-			case UMLPackage.STRUCTURED_CLASSIFIER__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__NAME :
-				return isSetName();
-			case UMLPackage.STRUCTURED_CLASSIFIER__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.STRUCTURED_CLASSIFIER__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.STRUCTURED_CLASSIFIER__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.STRUCTURED_CLASSIFIER__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.STRUCTURED_CLASSIFIER__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__MEMBER :
-				return isSetMembers();
-			case UMLPackage.STRUCTURED_CLASSIFIER__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.STRUCTURED_CLASSIFIER__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.STRUCTURED_CLASSIFIER__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.STRUCTURED_CLASSIFIER__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__GENERAL :
-				return !getGenerals().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.STRUCTURED_CLASSIFIER__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.STRUCTURED_CLASSIFIER__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE :
-				return !getOwnedAttributes().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR :
-				return !getOwnedConnectors().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__PART :
-				return !getParts().isEmpty();
-			case UMLPackage.STRUCTURED_CLASSIFIER__ROLE :
-				return isSetRoles();
+		case UMLPackage.STRUCTURED_CLASSIFIER__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNER:
+			return isSetOwner();
+		case UMLPackage.STRUCTURED_CLASSIFIER__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__NAME:
+			return isSetName();
+		case UMLPackage.STRUCTURED_CLASSIFIER__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.STRUCTURED_CLASSIFIER__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.STRUCTURED_CLASSIFIER__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.STRUCTURED_CLASSIFIER__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.STRUCTURED_CLASSIFIER__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__MEMBER:
+			return isSetMembers();
+		case UMLPackage.STRUCTURED_CLASSIFIER__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.STRUCTURED_CLASSIFIER__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.STRUCTURED_CLASSIFIER__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.STRUCTURED_CLASSIFIER__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.STRUCTURED_CLASSIFIER__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.STRUCTURED_CLASSIFIER__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__GENERAL:
+			return !getGenerals().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.STRUCTURED_CLASSIFIER__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.STRUCTURED_CLASSIFIER__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE:
+			return !getOwnedAttributes().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR:
+			return !getOwnedConnectors().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__PART:
+			return !getParts().isEmpty();
+		case UMLPackage.STRUCTURED_CLASSIFIER__ROLE:
+			return isSetRoles();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1005,280 +914,223 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_MODEL :
-				return getModel();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.STRUCTURED_CLASSIFIER___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.STRUCTURED_CLASSIFIER___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_LABEL :
-				return getLabel();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.STRUCTURED_CLASSIFIER___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.STRUCTURED_CLASSIFIER___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.STRUCTURED_CLASSIFIER___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.STRUCTURED_CLASSIFIER___SEPARATOR :
-				return separator();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.STRUCTURED_CLASSIFIER___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.STRUCTURED_CLASSIFIER___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.STRUCTURED_CLASSIFIER___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.STRUCTURED_CLASSIFIER___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.STRUCTURED_CLASSIFIER___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.STRUCTURED_CLASSIFIER___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.STRUCTURED_CLASSIFIER___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.STRUCTURED_CLASSIFIER___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___PARENTS :
-				return parents();
-			case UMLPackage.STRUCTURED_CLASSIFIER___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.STRUCTURED_CLASSIFIER___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.STRUCTURED_CLASSIFIER___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.STRUCTURED_CLASSIFIER___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.STRUCTURED_CLASSIFIER___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.STRUCTURED_CLASSIFIER___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.STRUCTURED_CLASSIFIER___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.STRUCTURED_CLASSIFIER___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT :
-				return createOwnedAttribute((String) arguments.get(0),
-					(Type) arguments.get(1), (Integer) arguments.get(2),
-					(Integer) arguments.get(3));
-			case UMLPackage.STRUCTURED_CLASSIFIER___GET_PARTS :
-				return getParts();
-			case UMLPackage.STRUCTURED_CLASSIFIER___ALL_ROLES :
-				return allRoles();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_MODEL:
+			return getModel();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.STRUCTURED_CLASSIFIER___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.STRUCTURED_CLASSIFIER___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_LABEL:
+			return getLabel();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.STRUCTURED_CLASSIFIER___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.STRUCTURED_CLASSIFIER___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.STRUCTURED_CLASSIFIER___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.STRUCTURED_CLASSIFIER___SEPARATOR:
+			return separator();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.STRUCTURED_CLASSIFIER___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.STRUCTURED_CLASSIFIER___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.STRUCTURED_CLASSIFIER___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.STRUCTURED_CLASSIFIER___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.STRUCTURED_CLASSIFIER___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.STRUCTURED_CLASSIFIER___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.STRUCTURED_CLASSIFIER___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.STRUCTURED_CLASSIFIER___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___PARENTS:
+			return parents();
+		case UMLPackage.STRUCTURED_CLASSIFIER___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.STRUCTURED_CLASSIFIER___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.STRUCTURED_CLASSIFIER___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.STRUCTURED_CLASSIFIER___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.STRUCTURED_CLASSIFIER___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.STRUCTURED_CLASSIFIER___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.STRUCTURED_CLASSIFIER___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.STRUCTURED_CLASSIFIER___CREATE_OWNED_ATTRIBUTE__STRING_TYPE_INT_INT:
+			return createOwnedAttribute((String) arguments.get(0), (Type) arguments.get(1), (Integer) arguments.get(2), (Integer) arguments.get(3));
+		case UMLPackage.STRUCTURED_CLASSIFIER___GET_PARTS:
+			return getParts();
+		case UMLPackage.STRUCTURED_CLASSIFIER___ALL_ROLES:
+			return allRoles();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1300,8 +1152,8 @@
 	@Override
 	public boolean isSetOwnedMembers() {
 		return super.isSetOwnedMembers()
-			|| eIsSet(UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE)
-			|| eIsSet(UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR);
+				|| eIsSet(UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE)
+				|| eIsSet(UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR);
 	}
 
 	/**
@@ -1312,8 +1164,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] ATTRIBUTE_ESUBSETS = new int[]{
-		UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE};
+	protected static final int[] ATTRIBUTE_ESUBSETS = new int[] { UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1331,12 +1182,10 @@
 	 */
 	public ConnectableElement getRole(String name, Type type,
 			boolean ignoreCase, EClass eClass) {
-		roleLoop : for (ConnectableElement role : getRoles()) {
+		roleLoop: for (ConnectableElement role : getRoles()) {
 			if (eClass != null && !eClass.isInstance(role))
 				continue roleLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(role.getName())
-				: name.equals(role.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(role.getName()) : name.equals(role.getName())))
 				continue roleLoop;
 			if (type != null && !type.equals(role.getType()))
 				continue roleLoop;
@@ -1353,11 +1202,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.STRUCTURED_CLASSIFIER__OWNED_RULE,
-		UMLPackage.STRUCTURED_CLASSIFIER__OWNED_USE_CASE,
-		UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE,
-		UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.STRUCTURED_CLASSIFIER__OWNED_RULE, UMLPackage.STRUCTURED_CLASSIFIER__OWNED_USE_CASE, UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE,
+			UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getRoles() <em>Role</em>}' reference list.
@@ -1367,8 +1213,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] ROLE_ESUBSETS = new int[]{
-		UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE};
+	protected static final int[] ROLE_ESUBSETS = new int[] { UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1378,7 +1223,7 @@
 	@Override
 	public boolean isSetAttributes() {
 		return super.isSetAttributes()
-			|| eIsSet(UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE);
+				|| eIsSet(UMLPackage.STRUCTURED_CLASSIFIER__OWNED_ATTRIBUTE);
 	}
 
 	/**
@@ -1388,7 +1233,8 @@
 	 */
 	@Override
 	public boolean isSetMembers() {
-		return super.isSetMembers() || isSetRoles();
+		return super.isSetMembers()
+				|| isSetRoles();
 	}
 
 	/**
@@ -1399,9 +1245,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] FEATURE_ESUBSETS = new int[]{
-		UMLPackage.STRUCTURED_CLASSIFIER__ATTRIBUTE,
-		UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR};
+	protected static final int[] FEATURE_ESUBSETS = new int[] { UMLPackage.STRUCTURED_CLASSIFIER__ATTRIBUTE, UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getMembers() <em>Member</em>}' reference list.
@@ -1411,12 +1255,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] MEMBER_ESUBSETS = new int[]{
-		UMLPackage.STRUCTURED_CLASSIFIER__OWNED_MEMBER,
-		UMLPackage.STRUCTURED_CLASSIFIER__IMPORTED_MEMBER,
-		UMLPackage.STRUCTURED_CLASSIFIER__FEATURE,
-		UMLPackage.STRUCTURED_CLASSIFIER__INHERITED_MEMBER,
-		UMLPackage.STRUCTURED_CLASSIFIER__ROLE};
+	protected static final int[] MEMBER_ESUBSETS = new int[] { UMLPackage.STRUCTURED_CLASSIFIER__OWNED_MEMBER, UMLPackage.STRUCTURED_CLASSIFIER__IMPORTED_MEMBER, UMLPackage.STRUCTURED_CLASSIFIER__FEATURE, UMLPackage.STRUCTURED_CLASSIFIER__INHERITED_MEMBER,
+			UMLPackage.STRUCTURED_CLASSIFIER__ROLE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1426,7 +1266,7 @@
 	@Override
 	public boolean isSetFeatures() {
 		return super.isSetFeatures()
-			|| eIsSet(UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR);
+				|| eIsSet(UMLPackage.STRUCTURED_CLASSIFIER__OWNED_CONNECTOR);
 	}
 
 } //StructuredClassifierImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SubstitutionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SubstitutionImpl.java
index 931edca..22504bc 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SubstitutionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/SubstitutionImpl.java
@@ -1,28 +1,40 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Eike Stepper - 540786
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.util.Collection;
 
+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.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
+
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectResolvingEList;
+
 import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
@@ -74,17 +86,9 @@
 		return UMLPackage.Literals.SUBSTITUTION;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.DEPENDENCY__CLIENT) {
 			return createClientsList();
 		}
@@ -104,9 +108,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -131,15 +133,13 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<NamedElement> getSuppliers() {
-		return (EList<NamedElement>) eDynamicGet(
-			UMLPackage.SUBSTITUTION__SUPPLIER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPENDENCY__SUPPLIER, true, true);
+		return (EList<NamedElement>) eDynamicGet(UMLPackage.SUBSTITUTION__SUPPLIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPENDENCY__SUPPLIER, true, true);
 	}
 
 	private EList<NamedElement> createSuppliersList() {
 		return new SubsetSupersetEObjectResolvingEList<NamedElement>(
-			NamedElement.class, this, UMLPackage.SUBSTITUTION__SUPPLIER, null,
-			SUPPLIER_ESUBSETS);
+				NamedElement.class, this, UMLPackage.SUBSTITUTION__SUPPLIER, null,
+				SUPPLIER_ESUBSETS);
 	}
 
 	/**
@@ -150,8 +150,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SUPPLIER_ESUBSETS = new int[]{
-		UMLPackage.SUBSTITUTION__CONTRACT};
+	protected static final int[] SUPPLIER_ESUBSETS = new int[] { UMLPackage.SUBSTITUTION__CONTRACT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -161,15 +160,13 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<NamedElement> getClients() {
-		return (EList<NamedElement>) eDynamicGet(
-			UMLPackage.SUBSTITUTION__CLIENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.DEPENDENCY__CLIENT, true, true);
+		return (EList<NamedElement>) eDynamicGet(UMLPackage.SUBSTITUTION__CLIENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.DEPENDENCY__CLIENT, true, true);
 	}
 
 	private EList<NamedElement> createClientsList() {
 		return new SubsetSupersetEObjectResolvingEList<NamedElement>(
-			NamedElement.class, this, UMLPackage.SUBSTITUTION__CLIENT, null,
-			CLIENT_ESUBSETS);
+				NamedElement.class, this, UMLPackage.SUBSTITUTION__CLIENT, null,
+				CLIENT_ESUBSETS);
 	}
 
 	/**
@@ -180,8 +177,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] CLIENT_ESUBSETS = new int[]{
-		UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER};
+	protected static final int[] CLIENT_ESUBSETS = new int[] { UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -189,9 +185,7 @@
 	 * @generated
 	 */
 	public Classifier getContract() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.SUBSTITUTION__CONTRACT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SUBSTITUTION__CONTRACT, true, true);
+		return (Classifier) eDynamicGet(UMLPackage.SUBSTITUTION__CONTRACT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SUBSTITUTION__CONTRACT, true, true);
 	}
 
 	/**
@@ -200,9 +194,7 @@
 	 * @generated
 	 */
 	public Classifier basicGetContract() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.SUBSTITUTION__CONTRACT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SUBSTITUTION__CONTRACT, false, true);
+		return (Classifier) eDynamicGet(UMLPackage.SUBSTITUTION__CONTRACT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SUBSTITUTION__CONTRACT, false, true);
 	}
 
 	/**
@@ -211,8 +203,7 @@
 	 * @generated
 	 */
 	public void setContract(Classifier newContract) {
-		eDynamicSet(UMLPackage.SUBSTITUTION__CONTRACT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SUBSTITUTION__CONTRACT, newContract);
+		eDynamicSet(UMLPackage.SUBSTITUTION__CONTRACT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SUBSTITUTION__CONTRACT, newContract);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newContract != null) {
@@ -230,11 +221,7 @@
 	 * @generated
 	 */
 	public Classifier getSubstitutingClassifier() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SUBSTITUTION__SUBSTITUTING_CLASSIFIER, true,
-			true);
+		return (Classifier) eDynamicGet(UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SUBSTITUTION__SUBSTITUTING_CLASSIFIER, true, true);
 	}
 
 	/**
@@ -243,11 +230,7 @@
 	 * @generated
 	 */
 	public Classifier basicGetSubstitutingClassifier() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SUBSTITUTION__SUBSTITUTING_CLASSIFIER, false,
-			true);
+		return (Classifier) eDynamicGet(UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SUBSTITUTION__SUBSTITUTING_CLASSIFIER, false, true);
 	}
 
 	/**
@@ -257,8 +240,7 @@
 	 */
 	public NotificationChain basicSetSubstitutingClassifier(
 			Classifier newSubstitutingClassifier, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newSubstitutingClassifier,
-			UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newSubstitutingClassifier, UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newSubstitutingClassifier != null) {
@@ -278,11 +260,7 @@
 	 */
 	public void setSubstitutingClassifier(
 			Classifier newSubstitutingClassifier) {
-		eDynamicSet(
-			UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.SUBSTITUTION__SUBSTITUTING_CLASSIFIER,
-			newSubstitutingClassifier);
+		eDynamicSet(UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.SUBSTITUTION__SUBSTITUTING_CLASSIFIER, newSubstitutingClassifier);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newSubstitutingClassifier != null) {
@@ -304,28 +282,21 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.SUBSTITUTION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.SUBSTITUTION__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetSubstitutingClassifier((Classifier) otherEnd,
-					msgs);
+		case UMLPackage.SUBSTITUTION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.SUBSTITUTION__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetSubstitutingClassifier((Classifier) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -339,22 +310,20 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.SUBSTITUTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SUBSTITUTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.SUBSTITUTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.SUBSTITUTION__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.SUBSTITUTION__MAPPING :
-				return basicSetMapping(null, msgs);
-			case UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER :
-				return basicSetSubstitutingClassifier(null, msgs);
+		case UMLPackage.SUBSTITUTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SUBSTITUTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.SUBSTITUTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.SUBSTITUTION__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.SUBSTITUTION__MAPPING:
+			return basicSetMapping(null, msgs);
+		case UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER:
+			return basicSetSubstitutingClassifier(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -368,14 +337,10 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
-			case UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.CLASSIFIER__SUBSTITUTION, Classifier.class,
-					msgs);
+		case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+		case UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.CLASSIFIER__SUBSTITUTION, Classifier.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -388,62 +353,62 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.SUBSTITUTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.SUBSTITUTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.SUBSTITUTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.SUBSTITUTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.SUBSTITUTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.SUBSTITUTION__NAME :
-				return getName();
-			case UMLPackage.SUBSTITUTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.SUBSTITUTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.SUBSTITUTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.SUBSTITUTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.SUBSTITUTION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.SUBSTITUTION__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.SUBSTITUTION__SOURCE :
-				return getSources();
-			case UMLPackage.SUBSTITUTION__TARGET :
-				return getTargets();
-			case UMLPackage.SUBSTITUTION__CLIENT :
-				return getClients();
-			case UMLPackage.SUBSTITUTION__SUPPLIER :
-				return getSuppliers();
-			case UMLPackage.SUBSTITUTION__MAPPING :
-				if (resolve)
-					return getMapping();
-				return basicGetMapping();
-			case UMLPackage.SUBSTITUTION__CONTRACT :
-				if (resolve)
-					return getContract();
-				return basicGetContract();
-			case UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER :
-				if (resolve)
-					return getSubstitutingClassifier();
-				return basicGetSubstitutingClassifier();
+		case UMLPackage.SUBSTITUTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.SUBSTITUTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.SUBSTITUTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.SUBSTITUTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.SUBSTITUTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.SUBSTITUTION__NAME:
+			return getName();
+		case UMLPackage.SUBSTITUTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.SUBSTITUTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.SUBSTITUTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.SUBSTITUTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.SUBSTITUTION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.SUBSTITUTION__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.SUBSTITUTION__SOURCE:
+			return getSources();
+		case UMLPackage.SUBSTITUTION__TARGET:
+			return getTargets();
+		case UMLPackage.SUBSTITUTION__CLIENT:
+			return getClients();
+		case UMLPackage.SUBSTITUTION__SUPPLIER:
+			return getSuppliers();
+		case UMLPackage.SUBSTITUTION__MAPPING:
+			if (resolve)
+				return getMapping();
+			return basicGetMapping();
+		case UMLPackage.SUBSTITUTION__CONTRACT:
+			if (resolve)
+				return getContract();
+			return basicGetContract();
+		case UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER:
+			if (resolve)
+				return getSubstitutingClassifier();
+			return basicGetSubstitutingClassifier();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -457,50 +422,46 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.SUBSTITUTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.SUBSTITUTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.SUBSTITUTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.SUBSTITUTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.SUBSTITUTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.SUBSTITUTION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.SUBSTITUTION__CLIENT :
-				getClients().clear();
-				getClients()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.SUBSTITUTION__SUPPLIER :
-				getSuppliers().clear();
-				getSuppliers()
-					.addAll((Collection<? extends NamedElement>) newValue);
-				return;
-			case UMLPackage.SUBSTITUTION__MAPPING :
-				setMapping((OpaqueExpression) newValue);
-				return;
-			case UMLPackage.SUBSTITUTION__CONTRACT :
-				setContract((Classifier) newValue);
-				return;
-			case UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER :
-				setSubstitutingClassifier((Classifier) newValue);
-				return;
+		case UMLPackage.SUBSTITUTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.SUBSTITUTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.SUBSTITUTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.SUBSTITUTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.SUBSTITUTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.SUBSTITUTION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.SUBSTITUTION__CLIENT:
+			getClients().clear();
+			getClients().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.SUBSTITUTION__SUPPLIER:
+			getSuppliers().clear();
+			getSuppliers().addAll((Collection<? extends NamedElement>) newValue);
+			return;
+		case UMLPackage.SUBSTITUTION__MAPPING:
+			setMapping((OpaqueExpression) newValue);
+			return;
+		case UMLPackage.SUBSTITUTION__CONTRACT:
+			setContract((Classifier) newValue);
+			return;
+		case UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER:
+			setSubstitutingClassifier((Classifier) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -513,42 +474,42 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.SUBSTITUTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.SUBSTITUTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.SUBSTITUTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.SUBSTITUTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.SUBSTITUTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.SUBSTITUTION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.SUBSTITUTION__CLIENT :
-				getClients().clear();
-				return;
-			case UMLPackage.SUBSTITUTION__SUPPLIER :
-				getSuppliers().clear();
-				return;
-			case UMLPackage.SUBSTITUTION__MAPPING :
-				setMapping((OpaqueExpression) null);
-				return;
-			case UMLPackage.SUBSTITUTION__CONTRACT :
-				setContract((Classifier) null);
-				return;
-			case UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER :
-				setSubstitutingClassifier((Classifier) null);
-				return;
+		case UMLPackage.SUBSTITUTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.SUBSTITUTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.SUBSTITUTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.SUBSTITUTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.SUBSTITUTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.SUBSTITUTION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.SUBSTITUTION__CLIENT:
+			getClients().clear();
+			return;
+		case UMLPackage.SUBSTITUTION__SUPPLIER:
+			getSuppliers().clear();
+			return;
+		case UMLPackage.SUBSTITUTION__MAPPING:
+			setMapping((OpaqueExpression) null);
+			return;
+		case UMLPackage.SUBSTITUTION__CONTRACT:
+			setContract((Classifier) null);
+			return;
+		case UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER:
+			setSubstitutingClassifier((Classifier) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -561,48 +522,46 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.SUBSTITUTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.SUBSTITUTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.SUBSTITUTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.SUBSTITUTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.SUBSTITUTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.SUBSTITUTION__NAME :
-				return isSetName();
-			case UMLPackage.SUBSTITUTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.SUBSTITUTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.SUBSTITUTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.SUBSTITUTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.SUBSTITUTION__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.SUBSTITUTION__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.SUBSTITUTION__SOURCE :
-				return isSetSources();
-			case UMLPackage.SUBSTITUTION__TARGET :
-				return isSetTargets();
-			case UMLPackage.SUBSTITUTION__CLIENT :
-				return !getClients().isEmpty();
-			case UMLPackage.SUBSTITUTION__SUPPLIER :
-				return !getSuppliers().isEmpty();
-			case UMLPackage.SUBSTITUTION__MAPPING :
-				return basicGetMapping() != null;
-			case UMLPackage.SUBSTITUTION__CONTRACT :
-				return basicGetContract() != null;
-			case UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER :
-				return basicGetSubstitutingClassifier() != null;
+		case UMLPackage.SUBSTITUTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.SUBSTITUTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.SUBSTITUTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.SUBSTITUTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.SUBSTITUTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.SUBSTITUTION__NAME:
+			return isSetName();
+		case UMLPackage.SUBSTITUTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.SUBSTITUTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.SUBSTITUTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.SUBSTITUTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.SUBSTITUTION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.SUBSTITUTION__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.SUBSTITUTION__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.SUBSTITUTION__SOURCE:
+			return isSetSources();
+		case UMLPackage.SUBSTITUTION__TARGET:
+			return isSetTargets();
+		case UMLPackage.SUBSTITUTION__CLIENT:
+			return !getClients().isEmpty();
+		case UMLPackage.SUBSTITUTION__SUPPLIER:
+			return !getSuppliers().isEmpty();
+		case UMLPackage.SUBSTITUTION__MAPPING:
+			return basicGetMapping() != null;
+		case UMLPackage.SUBSTITUTION__CONTRACT:
+			return basicGetContract() != null;
+		case UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER:
+			return basicGetSubstitutingClassifier() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -615,7 +574,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER);
+				|| eIsSet(UMLPackage.SUBSTITUTION__SUBSTITUTING_CLASSIFIER);
 	}
 
 } //SubstitutionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateBindingImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateBindingImpl.java
index 72eba86..d7a7ca4 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateBindingImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateBindingImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,8 +28,12 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -98,19 +103,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> targets = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET);
+			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>(
-						Element.class, this,
-						UMLPackage.TEMPLATE_BINDING__TARGET, TARGET_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__TARGET, targets = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TEMPLATE_BINDING__TARGET, TARGET_ESUBSETS));
 			}
 			return targets;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.TEMPLATE_BINDING__TARGET, TARGET_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TEMPLATE_BINDING__TARGET, TARGET_ESUBSETS);
 	}
 
 	/**
@@ -124,20 +123,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.TEMPLATE_BINDING__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TEMPLATE_BINDING__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.TEMPLATE_BINDING__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TEMPLATE_BINDING__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -151,19 +143,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> sources = (EList<Element>) cache.get(eResource, this,
-				UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE);
+			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>(
-						Element.class, this,
-						UMLPackage.TEMPLATE_BINDING__SOURCE, SOURCE_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.DIRECTED_RELATIONSHIP__SOURCE, sources = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TEMPLATE_BINDING__SOURCE, SOURCE_ESUBSETS));
 			}
 			return sources;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.TEMPLATE_BINDING__SOURCE, SOURCE_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TEMPLATE_BINDING__SOURCE, SOURCE_ESUBSETS);
 	}
 
 	/**
@@ -172,9 +158,7 @@
 	 * @generated
 	 */
 	public TemplateSignature getSignature() {
-		return (TemplateSignature) eDynamicGet(
-			UMLPackage.TEMPLATE_BINDING__SIGNATURE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_BINDING__SIGNATURE, true, true);
+		return (TemplateSignature) eDynamicGet(UMLPackage.TEMPLATE_BINDING__SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_BINDING__SIGNATURE, true, true);
 	}
 
 	/**
@@ -183,9 +167,7 @@
 	 * @generated
 	 */
 	public TemplateSignature basicGetSignature() {
-		return (TemplateSignature) eDynamicGet(
-			UMLPackage.TEMPLATE_BINDING__SIGNATURE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_BINDING__SIGNATURE, false, true);
+		return (TemplateSignature) eDynamicGet(UMLPackage.TEMPLATE_BINDING__SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_BINDING__SIGNATURE, false, true);
 	}
 
 	/**
@@ -194,9 +176,7 @@
 	 * @generated
 	 */
 	public void setSignature(TemplateSignature newSignature) {
-		eDynamicSet(
-			UMLPackage.TEMPLATE_BINDING__SIGNATURE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_BINDING__SIGNATURE, newSignature);
+		eDynamicSet(UMLPackage.TEMPLATE_BINDING__SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_BINDING__SIGNATURE, newSignature);
 	}
 
 	/**
@@ -206,11 +186,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<TemplateParameterSubstitution> getParameterSubstitutions() {
-		return (EList<TemplateParameterSubstitution>) eDynamicGet(
-			UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION, true,
-			true);
+		return (EList<TemplateParameterSubstitution>) eDynamicGet(UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION, true, true);
 	}
 
 	/**
@@ -219,8 +195,7 @@
 	 * @generated
 	 */
 	public TemplateParameterSubstitution createParameterSubstitution() {
-		TemplateParameterSubstitution newParameterSubstitution = (TemplateParameterSubstitution) create(
-			UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION);
+		TemplateParameterSubstitution newParameterSubstitution = (TemplateParameterSubstitution) create(UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION);
 		getParameterSubstitutions().add(newParameterSubstitution);
 		return newParameterSubstitution;
 	}
@@ -231,9 +206,7 @@
 	 * @generated
 	 */
 	public TemplateableElement getBoundElement() {
-		return (TemplateableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_BINDING__BOUND_ELEMENT, true, true);
+		return (TemplateableElement) eDynamicGet(UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_BINDING__BOUND_ELEMENT, true, true);
 	}
 
 	/**
@@ -242,9 +215,7 @@
 	 * @generated
 	 */
 	public TemplateableElement basicGetBoundElement() {
-		return (TemplateableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_BINDING__BOUND_ELEMENT, false, true);
+		return (TemplateableElement) eDynamicGet(UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_BINDING__BOUND_ELEMENT, false, true);
 	}
 
 	/**
@@ -254,8 +225,7 @@
 	 */
 	public NotificationChain basicSetBoundElement(
 			TemplateableElement newBoundElement, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newBoundElement,
-			UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newBoundElement, UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT, msgs);
 		return msgs;
 	}
 
@@ -265,10 +235,7 @@
 	 * @generated
 	 */
 	public void setBoundElement(TemplateableElement newBoundElement) {
-		eDynamicSet(
-			UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_BINDING__BOUND_ELEMENT,
-			newBoundElement);
+		eDynamicSet(UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_BINDING__BOUND_ELEMENT, newBoundElement);
 	}
 
 	/**
@@ -278,8 +245,7 @@
 	 */
 	public boolean validateParameterSubstitutionFormal(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return TemplateBindingOperations
-			.validateParameterSubstitutionFormal(this, diagnostics, context);
+		return TemplateBindingOperations.validateParameterSubstitutionFormal(this, diagnostics, context);
 	}
 
 	/**
@@ -289,8 +255,7 @@
 	 */
 	public boolean validateOneParameterSubstitution(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TemplateBindingOperations.validateOneParameterSubstitution(this,
-			diagnostics, context);
+		return TemplateBindingOperations.validateOneParameterSubstitution(this, diagnostics, context);
 	}
 
 	/**
@@ -303,17 +268,14 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getParameterSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetBoundElement((TemplateableElement) otherEnd,
-					msgs);
+		case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getParameterSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetBoundElement((TemplateableElement) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -327,17 +289,14 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEMPLATE_BINDING__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION :
-				return ((InternalEList<?>) getParameterSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT :
-				return basicSetBoundElement(null, msgs);
+		case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_BINDING__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION:
+			return ((InternalEList<?>) getParameterSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT:
+			return basicSetBoundElement(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -351,10 +310,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING,
-					TemplateableElement.class, msgs);
+		case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING, TemplateableElement.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -367,32 +324,32 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.TEMPLATE_BINDING__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.TEMPLATE_BINDING__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.TEMPLATE_BINDING__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.TEMPLATE_BINDING__RELATED_ELEMENT :
-				return getRelatedElements();
-			case UMLPackage.TEMPLATE_BINDING__SOURCE :
-				return getSources();
-			case UMLPackage.TEMPLATE_BINDING__TARGET :
-				return getTargets();
-			case UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION :
-				return getParameterSubstitutions();
-			case UMLPackage.TEMPLATE_BINDING__SIGNATURE :
-				if (resolve)
-					return getSignature();
-				return basicGetSignature();
-			case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT :
-				if (resolve)
-					return getBoundElement();
-				return basicGetBoundElement();
+		case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.TEMPLATE_BINDING__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.TEMPLATE_BINDING__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.TEMPLATE_BINDING__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.TEMPLATE_BINDING__RELATED_ELEMENT:
+			return getRelatedElements();
+		case UMLPackage.TEMPLATE_BINDING__SOURCE:
+			return getSources();
+		case UMLPackage.TEMPLATE_BINDING__TARGET:
+			return getTargets();
+		case UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION:
+			return getParameterSubstitutions();
+		case UMLPackage.TEMPLATE_BINDING__SIGNATURE:
+			if (resolve)
+				return getSignature();
+			return basicGetSignature();
+		case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT:
+			if (resolve)
+				return getBoundElement();
+			return basicGetBoundElement();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -406,27 +363,24 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.TEMPLATE_BINDING__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION :
-				getParameterSubstitutions().clear();
-				getParameterSubstitutions().addAll(
-					(Collection<? extends TemplateParameterSubstitution>) newValue);
-				return;
-			case UMLPackage.TEMPLATE_BINDING__SIGNATURE :
-				setSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT :
-				setBoundElement((TemplateableElement) newValue);
-				return;
+		case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.TEMPLATE_BINDING__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION:
+			getParameterSubstitutions().clear();
+			getParameterSubstitutions().addAll((Collection<? extends TemplateParameterSubstitution>) newValue);
+			return;
+		case UMLPackage.TEMPLATE_BINDING__SIGNATURE:
+			setSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT:
+			setBoundElement((TemplateableElement) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -439,21 +393,21 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.TEMPLATE_BINDING__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION :
-				getParameterSubstitutions().clear();
-				return;
-			case UMLPackage.TEMPLATE_BINDING__SIGNATURE :
-				setSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT :
-				setBoundElement((TemplateableElement) null);
-				return;
+		case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.TEMPLATE_BINDING__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION:
+			getParameterSubstitutions().clear();
+			return;
+		case UMLPackage.TEMPLATE_BINDING__SIGNATURE:
+			setSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT:
+			setBoundElement((TemplateableElement) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -466,26 +420,26 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.TEMPLATE_BINDING__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.TEMPLATE_BINDING__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.TEMPLATE_BINDING__OWNER :
-				return isSetOwner();
-			case UMLPackage.TEMPLATE_BINDING__RELATED_ELEMENT :
-				return isSetRelatedElements();
-			case UMLPackage.TEMPLATE_BINDING__SOURCE :
-				return isSetSources();
-			case UMLPackage.TEMPLATE_BINDING__TARGET :
-				return isSetTargets();
-			case UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION :
-				return !getParameterSubstitutions().isEmpty();
-			case UMLPackage.TEMPLATE_BINDING__SIGNATURE :
-				return basicGetSignature() != null;
-			case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT :
-				return basicGetBoundElement() != null;
+		case UMLPackage.TEMPLATE_BINDING__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.TEMPLATE_BINDING__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.TEMPLATE_BINDING__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.TEMPLATE_BINDING__OWNER:
+			return isSetOwner();
+		case UMLPackage.TEMPLATE_BINDING__RELATED_ELEMENT:
+			return isSetRelatedElements();
+		case UMLPackage.TEMPLATE_BINDING__SOURCE:
+			return isSetSources();
+		case UMLPackage.TEMPLATE_BINDING__TARGET:
+			return isSetTargets();
+		case UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION:
+			return !getParameterSubstitutions().isEmpty();
+		case UMLPackage.TEMPLATE_BINDING__SIGNATURE:
+			return basicGetSignature() != null;
+		case UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT:
+			return basicGetBoundElement() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -500,98 +454,86 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.TEMPLATE_BINDING___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEMPLATE_BINDING___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEMPLATE_BINDING___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.TEMPLATE_BINDING___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.TEMPLATE_BINDING___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.TEMPLATE_BINDING___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.TEMPLATE_BINDING___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEMPLATE_BINDING___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___GET_MODEL :
-				return getModel();
-			case UMLPackage.TEMPLATE_BINDING___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.TEMPLATE_BINDING___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.TEMPLATE_BINDING___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.TEMPLATE_BINDING___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.TEMPLATE_BINDING___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.TEMPLATE_BINDING___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.TEMPLATE_BINDING___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEMPLATE_BINDING___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEMPLATE_BINDING___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.TEMPLATE_BINDING___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_BINDING___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.TEMPLATE_BINDING___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.TEMPLATE_BINDING___VALIDATE_PARAMETER_SUBSTITUTION_FORMAL__DIAGNOSTICCHAIN_MAP :
-				return validateParameterSubstitutionFormal(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEMPLATE_BINDING___VALIDATE_ONE_PARAMETER_SUBSTITUTION__DIAGNOSTICCHAIN_MAP :
-				return validateOneParameterSubstitution(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATE_BINDING___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATE_BINDING___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATE_BINDING___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.TEMPLATE_BINDING___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.TEMPLATE_BINDING___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.TEMPLATE_BINDING___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.TEMPLATE_BINDING___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEMPLATE_BINDING___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___GET_MODEL:
+			return getModel();
+		case UMLPackage.TEMPLATE_BINDING___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.TEMPLATE_BINDING___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.TEMPLATE_BINDING___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.TEMPLATE_BINDING___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.TEMPLATE_BINDING___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.TEMPLATE_BINDING___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.TEMPLATE_BINDING___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEMPLATE_BINDING___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEMPLATE_BINDING___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.TEMPLATE_BINDING___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_BINDING___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.TEMPLATE_BINDING___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.TEMPLATE_BINDING___VALIDATE_PARAMETER_SUBSTITUTION_FORMAL__DIAGNOSTICCHAIN_MAP:
+			return validateParameterSubstitutionFormal((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATE_BINDING___VALIDATE_ONE_PARAMETER_SUBSTITUTION__DIAGNOSTICCHAIN_MAP:
+			return validateOneParameterSubstitution((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -604,7 +546,7 @@
 	@Override
 	public boolean isSetTargets() {
 		return super.isSetTargets()
-			|| eIsSet(UMLPackage.TEMPLATE_BINDING__SIGNATURE);
+				|| eIsSet(UMLPackage.TEMPLATE_BINDING__SIGNATURE);
 	}
 
 	/**
@@ -615,9 +557,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.TEMPLATE_BINDING__OWNED_COMMENT,
-		UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.TEMPLATE_BINDING__OWNED_COMMENT, UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getTargets() <em>Target</em>}' reference list.
@@ -627,8 +567,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] TARGET_ESUBSETS = new int[]{
-		UMLPackage.TEMPLATE_BINDING__SIGNATURE};
+	protected static final int[] TARGET_ESUBSETS = new int[] { UMLPackage.TEMPLATE_BINDING__SIGNATURE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -638,9 +577,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -651,7 +588,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION);
+				|| eIsSet(UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION);
 	}
 
 	/**
@@ -676,7 +613,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT);
+				|| eIsSet(UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT);
 	}
 
 	/**
@@ -687,8 +624,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] SOURCE_ESUBSETS = new int[]{
-		UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT};
+	protected static final int[] SOURCE_ESUBSETS = new int[] { UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -698,7 +634,7 @@
 	@Override
 	public boolean isSetSources() {
 		return super.isSetSources()
-			|| eIsSet(UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT);
+				|| eIsSet(UMLPackage.TEMPLATE_BINDING__BOUND_ELEMENT);
 	}
 
 } //TemplateBindingImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateParameterImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateParameterImpl.java
index b70679a..b65d3d1 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateParameterImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateParameterImpl.java
@@ -1,13 +1,13 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,8 +28,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -94,9 +98,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -110,21 +112,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.TEMPLATE_PARAMETER__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TEMPLATE_PARAMETER__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.TEMPLATE_PARAMETER__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TEMPLATE_PARAMETER__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -133,11 +127,7 @@
 	 * @generated
 	 */
 	public ParameterableElement getParameteredElement() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, true,
-			true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, true, true);
 	}
 
 	/**
@@ -146,11 +136,7 @@
 	 * @generated
 	 */
 	public ParameterableElement basicGetParameteredElement() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, false,
-			true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, false, true);
 	}
 
 	/**
@@ -161,13 +147,11 @@
 	public NotificationChain basicSetParameteredElement(
 			ParameterableElement newParameteredElement,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newParameteredElement,
-			UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newParameteredElement, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			ParameterableElement ownedParameteredElement = getOwnedParameteredElement();
-			if (ownedParameteredElement != null
-				&& ownedParameteredElement != newParameteredElement) {
+			if (ownedParameteredElement != null && ownedParameteredElement != newParameteredElement) {
 				setOwnedParameteredElement(null);
 			}
 		}
@@ -181,16 +165,11 @@
 	 */
 	public void setParameteredElement(
 			ParameterableElement newParameteredElement) {
-		eDynamicSet(
-			UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-			newParameteredElement);
+		eDynamicSet(UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, newParameteredElement);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			ParameterableElement ownedParameteredElement = getOwnedParameteredElement();
-			if (ownedParameteredElement != null
-				&& ownedParameteredElement != newParameteredElement) {
+			if (ownedParameteredElement != null && ownedParameteredElement != newParameteredElement) {
 				setOwnedParameteredElement(null);
 			}
 		}
@@ -202,9 +181,7 @@
 	 * @generated
 	 */
 	public ParameterableElement getDefault() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER__DEFAULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__DEFAULT, true, true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER__DEFAULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__DEFAULT, true, true);
 	}
 
 	/**
@@ -213,9 +190,7 @@
 	 * @generated
 	 */
 	public ParameterableElement basicGetDefault() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER__DEFAULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__DEFAULT, false, true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER__DEFAULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__DEFAULT, false, true);
 	}
 
 	/**
@@ -224,9 +199,7 @@
 	 * @generated
 	 */
 	public void setDefault(ParameterableElement newDefault) {
-		eDynamicSet(
-			UMLPackage.TEMPLATE_PARAMETER__DEFAULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__DEFAULT, newDefault);
+		eDynamicSet(UMLPackage.TEMPLATE_PARAMETER__DEFAULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__DEFAULT, newDefault);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			ParameterableElement ownedDefault = getOwnedDefault();
@@ -242,9 +215,7 @@
 	 * @generated
 	 */
 	public TemplateSignature getSignature() {
-		return (TemplateSignature) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER__SIGNATURE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__SIGNATURE, true, true);
+		return (TemplateSignature) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER__SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__SIGNATURE, true, true);
 	}
 
 	/**
@@ -253,9 +224,7 @@
 	 * @generated
 	 */
 	public TemplateSignature basicGetSignature() {
-		return (TemplateSignature) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER__SIGNATURE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__SIGNATURE, false, true);
+		return (TemplateSignature) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER__SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__SIGNATURE, false, true);
 	}
 
 	/**
@@ -265,8 +234,7 @@
 	 */
 	public NotificationChain basicSetSignature(TemplateSignature newSignature,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newSignature,
-			UMLPackage.TEMPLATE_PARAMETER__SIGNATURE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newSignature, UMLPackage.TEMPLATE_PARAMETER__SIGNATURE, msgs);
 		return msgs;
 	}
 
@@ -276,9 +244,7 @@
 	 * @generated
 	 */
 	public void setSignature(TemplateSignature newSignature) {
-		eDynamicSet(
-			UMLPackage.TEMPLATE_PARAMETER__SIGNATURE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__SIGNATURE, newSignature);
+		eDynamicSet(UMLPackage.TEMPLATE_PARAMETER__SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__SIGNATURE, newSignature);
 	}
 
 	/**
@@ -287,11 +253,7 @@
 	 * @generated
 	 */
 	public ParameterableElement getOwnedParameteredElement() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-			true, true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, true, true);
 	}
 
 	/**
@@ -300,11 +262,7 @@
 	 * @generated
 	 */
 	public ParameterableElement basicGetOwnedParameteredElement() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-			false, true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, false, true);
 	}
 
 	/**
@@ -315,8 +273,7 @@
 	public NotificationChain basicSetOwnedParameteredElement(
 			ParameterableElement newOwnedParameteredElement,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newOwnedParameteredElement,
-			UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newOwnedParameteredElement, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwnedParameteredElement != null) {
@@ -335,11 +292,7 @@
 	 */
 	public void setOwnedParameteredElement(
 			ParameterableElement newOwnedParameteredElement) {
-		eDynamicSet(
-			UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-			newOwnedParameteredElement);
+		eDynamicSet(UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, newOwnedParameteredElement);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwnedParameteredElement != null) {
@@ -356,8 +309,7 @@
 	 * @generated
 	 */
 	public ParameterableElement createOwnedParameteredElement(EClass eClass) {
-		ParameterableElement newOwnedParameteredElement = (ParameterableElement) create(
-			eClass);
+		ParameterableElement newOwnedParameteredElement = (ParameterableElement) create(eClass);
 		setOwnedParameteredElement(newOwnedParameteredElement);
 		return newOwnedParameteredElement;
 	}
@@ -368,10 +320,7 @@
 	 * @generated
 	 */
 	public ParameterableElement getOwnedDefault() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__OWNED_DEFAULT, true, true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__OWNED_DEFAULT, true, true);
 	}
 
 	/**
@@ -380,10 +329,7 @@
 	 * @generated
 	 */
 	public ParameterableElement basicGetOwnedDefault() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__OWNED_DEFAULT, false, true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__OWNED_DEFAULT, false, true);
 	}
 
 	/**
@@ -393,8 +339,7 @@
 	 */
 	public NotificationChain basicSetOwnedDefault(
 			ParameterableElement newOwnedDefault, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newOwnedDefault,
-			UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newOwnedDefault, UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwnedDefault != null) {
@@ -412,11 +357,7 @@
 	 * @generated
 	 */
 	public void setOwnedDefault(ParameterableElement newOwnedDefault) {
-		eDynamicSet(
-			UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER__OWNED_DEFAULT,
-			newOwnedDefault);
+		eDynamicSet(UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER__OWNED_DEFAULT, newOwnedDefault);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwnedDefault != null) {
@@ -433,8 +374,7 @@
 	 * @generated
 	 */
 	public ParameterableElement createOwnedDefault(EClass eClass) {
-		ParameterableElement newOwnedDefault = (ParameterableElement) create(
-			eClass);
+		ParameterableElement newOwnedDefault = (ParameterableElement) create(eClass);
 		setOwnedDefault(newOwnedDefault);
 		return newOwnedDefault;
 	}
@@ -446,8 +386,7 @@
 	 */
 	public boolean validateMustBeCompatible(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TemplateParameterOperations.validateMustBeCompatible(this,
-			diagnostics, context);
+		return TemplateParameterOperations.validateMustBeCompatible(this, diagnostics, context);
 	}
 
 	/**
@@ -460,31 +399,22 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				ParameterableElement parameteredElement = basicGetParameteredElement();
-				if (parameteredElement != null)
-					msgs = ((InternalEObject) parameteredElement)
-						.eInverseRemove(this,
-							UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER,
-							ParameterableElement.class, msgs);
-				return basicSetParameteredElement(
-					(ParameterableElement) otherEnd, msgs);
-			case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetSignature((TemplateSignature) otherEnd, msgs);
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				ParameterableElement ownedParameteredElement = basicGetOwnedParameteredElement();
-				if (ownedParameteredElement != null)
-					msgs = ((InternalEObject) ownedParameteredElement)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-							null, msgs);
-				return basicSetOwnedParameteredElement(
-					(ParameterableElement) otherEnd, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			ParameterableElement parameteredElement = basicGetParameteredElement();
+			if (parameteredElement != null)
+				msgs = ((InternalEObject) parameteredElement).eInverseRemove(this, UMLPackage.PARAMETERABLE_ELEMENT__TEMPLATE_PARAMETER, ParameterableElement.class, msgs);
+			return basicSetParameteredElement((ParameterableElement) otherEnd, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			ParameterableElement ownedParameteredElement = basicGetOwnedParameteredElement();
+			if (ownedParameteredElement != null)
+				msgs = ((InternalEObject) ownedParameteredElement).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, null, msgs);
+			return basicSetOwnedParameteredElement((ParameterableElement) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -498,20 +428,18 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				return basicSetOwnedDefault(null, msgs);
-			case UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				return basicSetParameteredElement(null, msgs);
-			case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE :
-				return basicSetSignature(null, msgs);
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				return basicSetOwnedParameteredElement(null, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			return basicSetOwnedDefault(null, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			return basicSetParameteredElement(null, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE:
+			return basicSetSignature(null, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			return basicSetOwnedParameteredElement(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -525,10 +453,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER,
-					TemplateSignature.class, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER, TemplateSignature.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -541,36 +467,36 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.TEMPLATE_PARAMETER__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.TEMPLATE_PARAMETER__DEFAULT :
-				if (resolve)
-					return getDefault();
-				return basicGetDefault();
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				if (resolve)
-					return getOwnedDefault();
-				return basicGetOwnedDefault();
-			case UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				if (resolve)
-					return getParameteredElement();
-				return basicGetParameteredElement();
-			case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE :
-				if (resolve)
-					return getSignature();
-				return basicGetSignature();
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				if (resolve)
-					return getOwnedParameteredElement();
-				return basicGetOwnedParameteredElement();
+		case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.TEMPLATE_PARAMETER__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.TEMPLATE_PARAMETER__DEFAULT:
+			if (resolve)
+				return getDefault();
+			return basicGetDefault();
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			if (resolve)
+				return getOwnedDefault();
+			return basicGetOwnedDefault();
+		case UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			if (resolve)
+				return getParameteredElement();
+			return basicGetParameteredElement();
+		case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE:
+			if (resolve)
+				return getSignature();
+			return basicGetSignature();
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			if (resolve)
+				return getOwnedParameteredElement();
+			return basicGetOwnedParameteredElement();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -584,31 +510,29 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER__DEFAULT :
-				setDefault((ParameterableElement) newValue);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				setOwnedDefault((ParameterableElement) newValue);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				setParameteredElement((ParameterableElement) newValue);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE :
-				setSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				setOwnedParameteredElement((ParameterableElement) newValue);
-				return;
+		case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER__DEFAULT:
+			setDefault((ParameterableElement) newValue);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			setOwnedDefault((ParameterableElement) newValue);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			setParameteredElement((ParameterableElement) newValue);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE:
+			setSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			setOwnedParameteredElement((ParameterableElement) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -621,27 +545,27 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER__DEFAULT :
-				setDefault((ParameterableElement) null);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				setOwnedDefault((ParameterableElement) null);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				setParameteredElement((ParameterableElement) null);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE :
-				setSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				setOwnedParameteredElement((ParameterableElement) null);
-				return;
+		case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER__DEFAULT:
+			setDefault((ParameterableElement) null);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			setOwnedDefault((ParameterableElement) null);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			setParameteredElement((ParameterableElement) null);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE:
+			setSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			setOwnedParameteredElement((ParameterableElement) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -654,24 +578,24 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.TEMPLATE_PARAMETER__OWNER :
-				return isSetOwner();
-			case UMLPackage.TEMPLATE_PARAMETER__DEFAULT :
-				return basicGetDefault() != null;
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT :
-				return basicGetOwnedDefault() != null;
-			case UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT :
-				return basicGetParameteredElement() != null;
-			case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE :
-				return basicGetSignature() != null;
-			case UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT :
-				return basicGetOwnedParameteredElement() != null;
+		case UMLPackage.TEMPLATE_PARAMETER__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.TEMPLATE_PARAMETER__OWNER:
+			return isSetOwner();
+		case UMLPackage.TEMPLATE_PARAMETER__DEFAULT:
+			return basicGetDefault() != null;
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT:
+			return basicGetOwnedDefault() != null;
+		case UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT:
+			return basicGetParameteredElement() != null;
+		case UMLPackage.TEMPLATE_PARAMETER__SIGNATURE:
+			return basicGetSignature() != null;
+		case UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT:
+			return basicGetOwnedParameteredElement() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -686,94 +610,84 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.TEMPLATE_PARAMETER___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEMPLATE_PARAMETER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEMPLATE_PARAMETER___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.TEMPLATE_PARAMETER___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.TEMPLATE_PARAMETER___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.TEMPLATE_PARAMETER___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.TEMPLATE_PARAMETER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEMPLATE_PARAMETER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___GET_MODEL :
-				return getModel();
-			case UMLPackage.TEMPLATE_PARAMETER___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.TEMPLATE_PARAMETER___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.TEMPLATE_PARAMETER___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.TEMPLATE_PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.TEMPLATE_PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.TEMPLATE_PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.TEMPLATE_PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEMPLATE_PARAMETER___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEMPLATE_PARAMETER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.TEMPLATE_PARAMETER___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.TEMPLATE_PARAMETER___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.TEMPLATE_PARAMETER___VALIDATE_MUST_BE_COMPATIBLE__DIAGNOSTICCHAIN_MAP :
-				return validateMustBeCompatible(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATE_PARAMETER___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATE_PARAMETER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATE_PARAMETER___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.TEMPLATE_PARAMETER___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.TEMPLATE_PARAMETER___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.TEMPLATE_PARAMETER___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.TEMPLATE_PARAMETER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEMPLATE_PARAMETER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___GET_MODEL:
+			return getModel();
+		case UMLPackage.TEMPLATE_PARAMETER___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.TEMPLATE_PARAMETER___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.TEMPLATE_PARAMETER___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.TEMPLATE_PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.TEMPLATE_PARAMETER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.TEMPLATE_PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.TEMPLATE_PARAMETER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEMPLATE_PARAMETER___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEMPLATE_PARAMETER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.TEMPLATE_PARAMETER___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.TEMPLATE_PARAMETER___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.TEMPLATE_PARAMETER___VALIDATE_MUST_BE_COMPATIBLE__DIAGNOSTICCHAIN_MAP:
+			return validateMustBeCompatible((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -800,7 +714,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.TEMPLATE_PARAMETER__SIGNATURE);
+				|| eIsSet(UMLPackage.TEMPLATE_PARAMETER__SIGNATURE);
 	}
 
 	/**
@@ -811,10 +725,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.TEMPLATE_PARAMETER__OWNED_COMMENT,
-		UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT,
-		UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.TEMPLATE_PARAMETER__OWNED_COMMENT, UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -824,8 +735,8 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT)
-			|| eIsSet(UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT);
+				|| eIsSet(UMLPackage.TEMPLATE_PARAMETER__OWNED_DEFAULT)
+				|| eIsSet(UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT);
 	}
 
 } //TemplateParameterImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateParameterSubstitutionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateParameterSubstitutionImpl.java
index 6c7612b..f3d1197 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateParameterSubstitutionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateParameterSubstitutionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,8 +28,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -97,21 +101,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -120,11 +116,7 @@
 	 * @generated
 	 */
 	public TemplateParameter getFormal() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL, true,
-			true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL, true, true);
 	}
 
 	/**
@@ -133,11 +125,7 @@
 	 * @generated
 	 */
 	public TemplateParameter basicGetFormal() {
-		return (TemplateParameter) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL, false,
-			true);
+		return (TemplateParameter) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL, false, true);
 	}
 
 	/**
@@ -146,11 +134,7 @@
 	 * @generated
 	 */
 	public void setFormal(TemplateParameter newFormal) {
-		eDynamicSet(
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL,
-			newFormal);
+		eDynamicSet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL, newFormal);
 	}
 
 	/**
@@ -159,11 +143,7 @@
 	 * @generated
 	 */
 	public ParameterableElement getOwnedActual() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL,
-			true, true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL, true, true);
 	}
 
 	/**
@@ -172,11 +152,7 @@
 	 * @generated
 	 */
 	public ParameterableElement basicGetOwnedActual() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL,
-			false, true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL, false, true);
 	}
 
 	/**
@@ -186,8 +162,7 @@
 	 */
 	public NotificationChain basicSetOwnedActual(
 			ParameterableElement newOwnedActual, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newOwnedActual,
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newOwnedActual, UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL, msgs);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwnedActual != null) {
@@ -205,11 +180,7 @@
 	 * @generated
 	 */
 	public void setOwnedActual(ParameterableElement newOwnedActual) {
-		eDynamicSet(
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL,
-			newOwnedActual);
+		eDynamicSet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL, newOwnedActual);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newOwnedActual != null) {
@@ -226,8 +197,7 @@
 	 * @generated
 	 */
 	public ParameterableElement createOwnedActual(EClass eClass) {
-		ParameterableElement newOwnedActual = (ParameterableElement) create(
-			eClass);
+		ParameterableElement newOwnedActual = (ParameterableElement) create(eClass);
 		setOwnedActual(newOwnedActual);
 		return newOwnedActual;
 	}
@@ -238,11 +208,7 @@
 	 * @generated
 	 */
 	public TemplateBinding getTemplateBinding() {
-		return (TemplateBinding) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING,
-			true, true);
+		return (TemplateBinding) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING, true, true);
 	}
 
 	/**
@@ -251,11 +217,7 @@
 	 * @generated
 	 */
 	public TemplateBinding basicGetTemplateBinding() {
-		return (TemplateBinding) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING,
-			false, true);
+		return (TemplateBinding) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING, false, true);
 	}
 
 	/**
@@ -265,8 +227,7 @@
 	 */
 	public NotificationChain basicSetTemplateBinding(
 			TemplateBinding newTemplateBinding, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newTemplateBinding,
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newTemplateBinding, UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING, msgs);
 		return msgs;
 	}
 
@@ -276,11 +237,7 @@
 	 * @generated
 	 */
 	public void setTemplateBinding(TemplateBinding newTemplateBinding) {
-		eDynamicSet(
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING,
-			newTemplateBinding);
+		eDynamicSet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING, newTemplateBinding);
 	}
 
 	/**
@@ -290,8 +247,7 @@
 	 */
 	public boolean validateMustBeCompatible(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TemplateParameterSubstitutionOperations
-			.validateMustBeCompatible(this, diagnostics, context);
+		return TemplateParameterSubstitutionOperations.validateMustBeCompatible(this, diagnostics, context);
 	}
 
 	/**
@@ -304,14 +260,12 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetTemplateBinding((TemplateBinding) otherEnd,
-					msgs);
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetTemplateBinding((TemplateBinding) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -325,16 +279,14 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL :
-				return basicSetOwnedActual(null, msgs);
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING :
-				return basicSetTemplateBinding(null, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL:
+			return basicSetOwnedActual(null, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING:
+			return basicSetTemplateBinding(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -348,10 +300,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION,
-					TemplateBinding.class, msgs);
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_BINDING__PARAMETER_SUBSTITUTION, TemplateBinding.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -364,32 +314,32 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL :
-				if (resolve)
-					return getActual();
-				return basicGetActual();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL :
-				if (resolve)
-					return getFormal();
-				return basicGetFormal();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL :
-				if (resolve)
-					return getOwnedActual();
-				return basicGetOwnedActual();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING :
-				if (resolve)
-					return getTemplateBinding();
-				return basicGetTemplateBinding();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL:
+			if (resolve)
+				return getActual();
+			return basicGetActual();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL:
+			if (resolve)
+				return getFormal();
+			return basicGetFormal();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL:
+			if (resolve)
+				return getOwnedActual();
+			return basicGetOwnedActual();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING:
+			if (resolve)
+				return getTemplateBinding();
+			return basicGetTemplateBinding();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -403,28 +353,26 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL :
-				setActual((ParameterableElement) newValue);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL :
-				setFormal((TemplateParameter) newValue);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL :
-				setOwnedActual((ParameterableElement) newValue);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING :
-				setTemplateBinding((TemplateBinding) newValue);
-				return;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL:
+			setActual((ParameterableElement) newValue);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL:
+			setFormal((TemplateParameter) newValue);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL:
+			setOwnedActual((ParameterableElement) newValue);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING:
+			setTemplateBinding((TemplateBinding) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -437,24 +385,24 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL :
-				setActual((ParameterableElement) null);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL :
-				setFormal((TemplateParameter) null);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL :
-				setOwnedActual((ParameterableElement) null);
-				return;
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING :
-				setTemplateBinding((TemplateBinding) null);
-				return;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL:
+			setActual((ParameterableElement) null);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL:
+			setFormal((TemplateParameter) null);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL:
+			setOwnedActual((ParameterableElement) null);
+			return;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING:
+			setTemplateBinding((TemplateBinding) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -467,22 +415,22 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL :
-				return basicGetActual() != null;
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL :
-				return basicGetFormal() != null;
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL :
-				return basicGetOwnedActual() != null;
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING :
-				return basicGetTemplateBinding() != null;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL:
+			return basicGetActual() != null;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__FORMAL:
+			return basicGetFormal() != null;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL:
+			return basicGetOwnedActual() != null;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING:
+			return basicGetTemplateBinding() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -497,94 +445,84 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___VALIDATE_MUST_BE_COMPATIBLE__DIAGNOSTICCHAIN_MAP :
-				return validateMustBeCompatible(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION___VALIDATE_MUST_BE_COMPATIBLE__DIAGNOSTICCHAIN_MAP:
+			return validateMustBeCompatible((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -597,9 +535,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_COMMENT,
-		UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_COMMENT, UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -609,9 +545,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -622,7 +556,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL);
+				|| eIsSet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__OWNED_ACTUAL);
 	}
 
 	/**
@@ -645,11 +579,7 @@
 	 * @generated
 	 */
 	public ParameterableElement getActual() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL, true,
-			true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL, true, true);
 	}
 
 	/**
@@ -658,11 +588,7 @@
 	 * @generated
 	 */
 	public ParameterableElement basicGetActual() {
-		return (ParameterableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL, false,
-			true);
+		return (ParameterableElement) eDynamicGet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL, false, true);
 	}
 
 	/**
@@ -671,11 +597,7 @@
 	 * @generated
 	 */
 	public void setActual(ParameterableElement newActual) {
-		eDynamicSet(
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL,
-			newActual);
+		eDynamicSet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_PARAMETER_SUBSTITUTION__ACTUAL, newActual);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			ParameterableElement ownedActual = getOwnedActual();
@@ -692,8 +614,8 @@
 	 */
 	@Override
 	public boolean isSetOwner() {
-		return super.isSetOwner() || eIsSet(
-			UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING);
+		return super.isSetOwner()
+				|| eIsSet(UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION__TEMPLATE_BINDING);
 	}
 
 } //TemplateParameterSubstitutionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateSignatureImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateSignatureImpl.java
index 0b90fd9..655782e 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateSignatureImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateSignatureImpl.java
@@ -1,26 +1,28 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
-
 import org.eclipse.emf.common.util.EList;
 
 import org.eclipse.emf.ecore.EAnnotation;
@@ -28,8 +30,11 @@
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -87,17 +92,9 @@
 		return UMLPackage.Literals.TEMPLATE_SIGNATURE;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.TEMPLATE_SIGNATURE__PARAMETER) {
 			return createParametersList();
 		}
@@ -120,21 +117,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.TEMPLATE_SIGNATURE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TEMPLATE_SIGNATURE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.TEMPLATE_SIGNATURE__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TEMPLATE_SIGNATURE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -144,15 +133,13 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<TemplateParameter> getParameters() {
-		return (EList<TemplateParameter>) eDynamicGet(
-			UMLPackage.TEMPLATE_SIGNATURE__PARAMETER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_SIGNATURE__PARAMETER, true, true);
+		return (EList<TemplateParameter>) eDynamicGet(UMLPackage.TEMPLATE_SIGNATURE__PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_SIGNATURE__PARAMETER, true, true);
 	}
 
 	private EList<TemplateParameter> createParametersList() {
 		return new SubsetSupersetEObjectResolvingEList<TemplateParameter>(
-			TemplateParameter.class, this,
-			UMLPackage.TEMPLATE_SIGNATURE__PARAMETER, null, PARAMETER_ESUBSETS);
+				TemplateParameter.class, this,
+				UMLPackage.TEMPLATE_SIGNATURE__PARAMETER, null, PARAMETER_ESUBSETS);
 	}
 
 	/**
@@ -161,9 +148,7 @@
 	 * @generated
 	 */
 	public TemplateableElement getTemplate() {
-		return (TemplateableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_SIGNATURE__TEMPLATE, true, true);
+		return (TemplateableElement) eDynamicGet(UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_SIGNATURE__TEMPLATE, true, true);
 	}
 
 	/**
@@ -172,9 +157,7 @@
 	 * @generated
 	 */
 	public TemplateableElement basicGetTemplate() {
-		return (TemplateableElement) eDynamicGet(
-			UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_SIGNATURE__TEMPLATE, false, true);
+		return (TemplateableElement) eDynamicGet(UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_SIGNATURE__TEMPLATE, false, true);
 	}
 
 	/**
@@ -184,8 +167,7 @@
 	 */
 	public NotificationChain basicSetTemplate(TemplateableElement newTemplate,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newTemplate,
-			UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newTemplate, UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE, msgs);
 		return msgs;
 	}
 
@@ -195,9 +177,7 @@
 	 * @generated
 	 */
 	public void setTemplate(TemplateableElement newTemplate) {
-		eDynamicSet(
-			UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_SIGNATURE__TEMPLATE, newTemplate);
+		eDynamicSet(UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_SIGNATURE__TEMPLATE, newTemplate);
 	}
 
 	/**
@@ -207,19 +187,15 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<TemplateParameter> getOwnedParameters() {
-		return (EList<TemplateParameter>) eDynamicGet(
-			UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATE_SIGNATURE__OWNED_PARAMETER, true,
-			true);
+		return (EList<TemplateParameter>) eDynamicGet(UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATE_SIGNATURE__OWNED_PARAMETER, true, true);
 	}
 
 	private EList<TemplateParameter> createOwnedParametersList() {
 		return new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<TemplateParameter>(
-			TemplateParameter.class, this,
-			UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER,
-			OWNED_PARAMETER_ESUPERSETS, null,
-			UMLPackage.TEMPLATE_PARAMETER__SIGNATURE);
+				TemplateParameter.class, this,
+				UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER,
+				OWNED_PARAMETER_ESUPERSETS, null,
+				UMLPackage.TEMPLATE_PARAMETER__SIGNATURE);
 	}
 
 	/**
@@ -228,8 +204,7 @@
 	 * @generated
 	 */
 	public TemplateParameter createOwnedParameter(EClass eClass) {
-		TemplateParameter newOwnedParameter = (TemplateParameter) create(
-			eClass);
+		TemplateParameter newOwnedParameter = (TemplateParameter) create(eClass);
 		getOwnedParameters().add(newOwnedParameter);
 		return newOwnedParameter;
 	}
@@ -250,8 +225,7 @@
 	 */
 	public boolean validateOwnElements(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TemplateSignatureOperations.validateOwnElements(this,
-			diagnostics, context);
+		return TemplateSignatureOperations.validateOwnElements(this, diagnostics, context);
 	}
 
 	/**
@@ -261,8 +235,7 @@
 	 */
 	public boolean validateUniqueParameters(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TemplateSignatureOperations.validateUniqueParameters(this,
-			diagnostics, context);
+		return TemplateSignatureOperations.validateUniqueParameters(this, diagnostics, context);
 	}
 
 	/**
@@ -275,16 +248,14 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetTemplate((TemplateableElement) otherEnd, msgs);
-			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedParameters())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetTemplate((TemplateableElement) otherEnd, msgs);
+		case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedParameters()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -298,17 +269,14 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE :
-				return basicSetTemplate(null, msgs);
-			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				return ((InternalEList<?>) getOwnedParameters())
-					.basicRemove(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_SIGNATURE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE:
+			return basicSetTemplate(null, msgs);
+		case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER:
+			return ((InternalEList<?>) getOwnedParameters()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -322,10 +290,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-					TemplateableElement.class, msgs);
+		case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, TemplateableElement.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -338,24 +304,24 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.TEMPLATE_SIGNATURE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.TEMPLATE_SIGNATURE__PARAMETER :
-				return getParameters();
-			case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE :
-				if (resolve)
-					return getTemplate();
-				return basicGetTemplate();
-			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				return getOwnedParameters();
+		case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.TEMPLATE_SIGNATURE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.TEMPLATE_SIGNATURE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.TEMPLATE_SIGNATURE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.TEMPLATE_SIGNATURE__PARAMETER:
+			return getParameters();
+		case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE:
+			if (resolve)
+				return getTemplate();
+			return basicGetTemplate();
+		case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER:
+			return getOwnedParameters();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -369,29 +335,25 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.TEMPLATE_SIGNATURE__PARAMETER :
-				getParameters().clear();
-				getParameters()
-					.addAll((Collection<? extends TemplateParameter>) newValue);
-				return;
-			case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE :
-				setTemplate((TemplateableElement) newValue);
-				return;
-			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				getOwnedParameters()
-					.addAll((Collection<? extends TemplateParameter>) newValue);
-				return;
+		case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.TEMPLATE_SIGNATURE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.TEMPLATE_SIGNATURE__PARAMETER:
+			getParameters().clear();
+			getParameters().addAll((Collection<? extends TemplateParameter>) newValue);
+			return;
+		case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE:
+			setTemplate((TemplateableElement) newValue);
+			return;
+		case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			getOwnedParameters().addAll((Collection<? extends TemplateParameter>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -404,21 +366,21 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.TEMPLATE_SIGNATURE__PARAMETER :
-				getParameters().clear();
-				return;
-			case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE :
-				setTemplate((TemplateableElement) null);
-				return;
-			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				getOwnedParameters().clear();
-				return;
+		case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.TEMPLATE_SIGNATURE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.TEMPLATE_SIGNATURE__PARAMETER:
+			getParameters().clear();
+			return;
+		case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE:
+			setTemplate((TemplateableElement) null);
+			return;
+		case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER:
+			getOwnedParameters().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -431,20 +393,20 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.TEMPLATE_SIGNATURE__OWNER :
-				return isSetOwner();
-			case UMLPackage.TEMPLATE_SIGNATURE__PARAMETER :
-				return !getParameters().isEmpty();
-			case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE :
-				return basicGetTemplate() != null;
-			case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER :
-				return !getOwnedParameters().isEmpty();
+		case UMLPackage.TEMPLATE_SIGNATURE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.TEMPLATE_SIGNATURE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.TEMPLATE_SIGNATURE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.TEMPLATE_SIGNATURE__OWNER:
+			return isSetOwner();
+		case UMLPackage.TEMPLATE_SIGNATURE__PARAMETER:
+			return !getParameters().isEmpty();
+		case UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE:
+			return basicGetTemplate() != null;
+		case UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER:
+			return !getOwnedParameters().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -459,97 +421,86 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEMPLATE_SIGNATURE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEMPLATE_SIGNATURE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_MODEL :
-				return getModel();
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEMPLATE_SIGNATURE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEMPLATE_SIGNATURE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.TEMPLATE_SIGNATURE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATE_SIGNATURE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.TEMPLATE_SIGNATURE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.TEMPLATE_SIGNATURE___VALIDATE_OWN_ELEMENTS__DIAGNOSTICCHAIN_MAP :
-				return validateOwnElements((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEMPLATE_SIGNATURE___VALIDATE_UNIQUE_PARAMETERS__DIAGNOSTICCHAIN_MAP :
-				return validateUniqueParameters(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATE_SIGNATURE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATE_SIGNATURE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_MODEL:
+			return getModel();
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEMPLATE_SIGNATURE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEMPLATE_SIGNATURE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.TEMPLATE_SIGNATURE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATE_SIGNATURE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.TEMPLATE_SIGNATURE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.TEMPLATE_SIGNATURE___VALIDATE_OWN_ELEMENTS__DIAGNOSTICCHAIN_MAP:
+			return validateOwnElements((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATE_SIGNATURE___VALIDATE_UNIQUE_PARAMETERS__DIAGNOSTICCHAIN_MAP:
+			return validateUniqueParameters((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -562,9 +513,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.TEMPLATE_SIGNATURE__OWNED_COMMENT,
-		UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.TEMPLATE_SIGNATURE__OWNED_COMMENT, UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getParameters() <em>Parameter</em>}' reference list.
@@ -574,8 +523,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] PARAMETER_ESUBSETS = new int[]{
-		UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER};
+	protected static final int[] PARAMETER_ESUBSETS = new int[] { UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER };
 
 	/**
 	 * The array of superset feature identifiers for the '{@link #getOwnedParameters() <em>Owned Parameter</em>}' containment reference list.
@@ -585,8 +533,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_PARAMETER_ESUPERSETS = new int[]{
-		UMLPackage.TEMPLATE_SIGNATURE__PARAMETER};
+	protected static final int[] OWNED_PARAMETER_ESUPERSETS = new int[] { UMLPackage.TEMPLATE_SIGNATURE__PARAMETER };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -596,9 +543,7 @@
 	@Override
 	public Element getOwner() {
 		Element owner = basicGetOwner();
-		return owner != null && owner.eIsProxy()
-			? (Element) eResolveProxy((InternalEObject) owner)
-			: owner;
+		return owner != null && owner.eIsProxy() ? (Element) eResolveProxy((InternalEObject) owner) : owner;
 	}
 
 	/**
@@ -623,7 +568,7 @@
 	@Override
 	public boolean isSetOwner() {
 		return super.isSetOwner()
-			|| eIsSet(UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE);
+				|| eIsSet(UMLPackage.TEMPLATE_SIGNATURE__TEMPLATE);
 	}
 
 	/**
@@ -634,7 +579,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER);
+				|| eIsSet(UMLPackage.TEMPLATE_SIGNATURE__OWNED_PARAMETER);
 	}
 
 } //TemplateSignatureImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateableElementImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateableElementImpl.java
index 938946d..046a3cc 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateableElementImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TemplateableElementImpl.java
@@ -1,13 +1,13 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
  *
  */
@@ -16,6 +16,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -25,8 +26,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -92,21 +96,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -116,11 +112,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<TemplateBinding> getTemplateBindings() {
-		return (EList<TemplateBinding>) eDynamicGet(
-			UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING, true,
-			true);
+		return (EList<TemplateBinding>) eDynamicGet(UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING, true, true);
 	}
 
 	/**
@@ -129,8 +121,7 @@
 	 * @generated
 	 */
 	public TemplateBinding createTemplateBinding(TemplateSignature signature) {
-		TemplateBinding newTemplateBinding = (TemplateBinding) create(
-			UMLPackage.Literals.TEMPLATE_BINDING);
+		TemplateBinding newTemplateBinding = (TemplateBinding) create(UMLPackage.Literals.TEMPLATE_BINDING);
 		getTemplateBindings().add(newTemplateBinding);
 		if (signature != null)
 			newTemplateBinding.setSignature(signature);
@@ -153,15 +144,12 @@
 	 */
 	public TemplateBinding getTemplateBinding(TemplateSignature signature,
 			boolean createOnDemand) {
-		templateBindingLoop : for (TemplateBinding templateBinding : getTemplateBindings()) {
-			if (signature != null
-				&& !signature.equals(templateBinding.getSignature()))
+		templateBindingLoop: for (TemplateBinding templateBinding : getTemplateBindings()) {
+			if (signature != null && !signature.equals(templateBinding.getSignature()))
 				continue templateBindingLoop;
 			return templateBinding;
 		}
-		return createOnDemand
-			? createTemplateBinding(signature)
-			: null;
+		return createOnDemand ? createTemplateBinding(signature) : null;
 	}
 
 	/**
@@ -170,11 +158,7 @@
 	 * @generated
 	 */
 	public TemplateSignature getOwnedTemplateSignature() {
-		return (TemplateSignature) eDynamicGet(
-			UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-			true, true);
+		return (TemplateSignature) eDynamicGet(UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, true, true);
 	}
 
 	/**
@@ -183,11 +167,7 @@
 	 * @generated
 	 */
 	public TemplateSignature basicGetOwnedTemplateSignature() {
-		return (TemplateSignature) eDynamicGet(
-			UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-			false, true);
+		return (TemplateSignature) eDynamicGet(UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, false, true);
 	}
 
 	/**
@@ -198,8 +178,7 @@
 	public NotificationChain basicSetOwnedTemplateSignature(
 			TemplateSignature newOwnedTemplateSignature,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newOwnedTemplateSignature,
-			UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newOwnedTemplateSignature, UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, msgs);
 		return msgs;
 	}
 
@@ -210,11 +189,7 @@
 	 */
 	public void setOwnedTemplateSignature(
 			TemplateSignature newOwnedTemplateSignature) {
-		eDynamicSet(
-			UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-			newOwnedTemplateSignature);
+		eDynamicSet(UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, newOwnedTemplateSignature);
 	}
 
 	/**
@@ -223,8 +198,7 @@
 	 * @generated
 	 */
 	public TemplateSignature createOwnedTemplateSignature(EClass eClass) {
-		TemplateSignature newOwnedTemplateSignature = (TemplateSignature) create(
-			eClass);
+		TemplateSignature newOwnedTemplateSignature = (TemplateSignature) create(eClass);
 		setOwnedTemplateSignature(newOwnedTemplateSignature);
 		return newOwnedTemplateSignature;
 	}
@@ -235,8 +209,7 @@
 	 * @generated
 	 */
 	public TemplateSignature createOwnedTemplateSignature() {
-		return createOwnedTemplateSignature(
-			UMLPackage.Literals.TEMPLATE_SIGNATURE);
+		return createOwnedTemplateSignature(UMLPackage.Literals.TEMPLATE_SIGNATURE);
 	}
 
 	/**
@@ -248,14 +221,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<ParameterableElement> result = (EList<ParameterableElement>) cache
-				.get(this,
-					UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS);
+			EList<ParameterableElement> result = (EList<ParameterableElement>) cache.get(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS,
-					result = TemplateableElementOperations
-						.parameterableElements(this));
+				cache.put(this, UMLPackage.Literals.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS, result = TemplateableElementOperations.parameterableElements(this));
 			}
 			return result;
 		}
@@ -281,21 +249,15 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-							- UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
+		case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -309,17 +271,14 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING :
-				return ((InternalEList<?>) getTemplateBindings())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING:
+			return ((InternalEList<?>) getTemplateBindings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -332,22 +291,22 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
+		case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.TEMPLATEABLE_ELEMENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -361,24 +320,21 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
+		case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -391,18 +347,18 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
+		case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -415,18 +371,18 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE :
-				return basicGetOwnedTemplateSignature() != null;
+		case UMLPackage.TEMPLATEABLE_ELEMENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.TEMPLATEABLE_ELEMENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE:
+			return basicGetOwnedTemplateSignature() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -441,94 +397,86 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_MODEL :
-				return getModel();
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.TEMPLATEABLE_ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TEMPLATEABLE_ELEMENT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.TEMPLATEABLE_ELEMENT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.TEMPLATEABLE_ELEMENT___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_MODEL:
+			return getModel();
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.TEMPLATEABLE_ELEMENT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TEMPLATEABLE_ELEMENT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.TEMPLATEABLE_ELEMENT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.TEMPLATEABLE_ELEMENT___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.TEMPLATEABLE_ELEMENT___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -541,10 +489,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_COMMENT,
-		UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING,
-		UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_COMMENT, UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING, UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -554,9 +499,8 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING)
-			|| eIsSet(
-				UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE);
+				|| eIsSet(UMLPackage.TEMPLATEABLE_ELEMENT__TEMPLATE_BINDING)
+				|| eIsSet(UMLPackage.TEMPLATEABLE_ELEMENT__OWNED_TEMPLATE_SIGNATURE);
 	}
 
 } //TemplateableElementImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TestIdentityActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TestIdentityActionImpl.java
index d9b5c95..d74e9af 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TestIdentityActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TestIdentityActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -108,19 +111,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.TEST_IDENTITY_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.TEST_IDENTITY_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.TEST_IDENTITY_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.TEST_IDENTITY_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -134,19 +131,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this,
-						UMLPackage.TEST_IDENTITY_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.TEST_IDENTITY_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.TEST_IDENTITY_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.TEST_IDENTITY_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -155,9 +146,7 @@
 	 * @generated
 	 */
 	public InputPin getFirst() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.TEST_IDENTITY_ACTION__FIRST - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEST_IDENTITY_ACTION__FIRST, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.TEST_IDENTITY_ACTION__FIRST - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEST_IDENTITY_ACTION__FIRST, true, true);
 	}
 
 	/**
@@ -166,9 +155,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetFirst() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.TEST_IDENTITY_ACTION__FIRST - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEST_IDENTITY_ACTION__FIRST, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.TEST_IDENTITY_ACTION__FIRST - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEST_IDENTITY_ACTION__FIRST, false, true);
 	}
 
 	/**
@@ -178,8 +165,7 @@
 	 */
 	public NotificationChain basicSetFirst(InputPin newFirst,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newFirst,
-			UMLPackage.TEST_IDENTITY_ACTION__FIRST, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newFirst, UMLPackage.TEST_IDENTITY_ACTION__FIRST, msgs);
 		return msgs;
 	}
 
@@ -189,9 +175,7 @@
 	 * @generated
 	 */
 	public void setFirst(InputPin newFirst) {
-		eDynamicSet(
-			UMLPackage.TEST_IDENTITY_ACTION__FIRST - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEST_IDENTITY_ACTION__FIRST, newFirst);
+		eDynamicSet(UMLPackage.TEST_IDENTITY_ACTION__FIRST - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEST_IDENTITY_ACTION__FIRST, newFirst);
 	}
 
 	/**
@@ -224,9 +208,7 @@
 	 * @generated
 	 */
 	public InputPin getSecond() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.TEST_IDENTITY_ACTION__SECOND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEST_IDENTITY_ACTION__SECOND, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.TEST_IDENTITY_ACTION__SECOND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEST_IDENTITY_ACTION__SECOND, true, true);
 	}
 
 	/**
@@ -235,9 +217,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetSecond() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.TEST_IDENTITY_ACTION__SECOND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEST_IDENTITY_ACTION__SECOND, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.TEST_IDENTITY_ACTION__SECOND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEST_IDENTITY_ACTION__SECOND, false, true);
 	}
 
 	/**
@@ -247,8 +227,7 @@
 	 */
 	public NotificationChain basicSetSecond(InputPin newSecond,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newSecond,
-			UMLPackage.TEST_IDENTITY_ACTION__SECOND, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newSecond, UMLPackage.TEST_IDENTITY_ACTION__SECOND, msgs);
 		return msgs;
 	}
 
@@ -258,9 +237,7 @@
 	 * @generated
 	 */
 	public void setSecond(InputPin newSecond) {
-		eDynamicSet(
-			UMLPackage.TEST_IDENTITY_ACTION__SECOND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEST_IDENTITY_ACTION__SECOND, newSecond);
+		eDynamicSet(UMLPackage.TEST_IDENTITY_ACTION__SECOND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEST_IDENTITY_ACTION__SECOND, newSecond);
 	}
 
 	/**
@@ -293,9 +270,7 @@
 	 * @generated
 	 */
 	public OutputPin getResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.TEST_IDENTITY_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEST_IDENTITY_ACTION__RESULT, true, true);
+		return (OutputPin) eDynamicGet(UMLPackage.TEST_IDENTITY_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEST_IDENTITY_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -304,9 +279,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.TEST_IDENTITY_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEST_IDENTITY_ACTION__RESULT, false, true);
+		return (OutputPin) eDynamicGet(UMLPackage.TEST_IDENTITY_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEST_IDENTITY_ACTION__RESULT, false, true);
 	}
 
 	/**
@@ -316,8 +289,7 @@
 	 */
 	public NotificationChain basicSetResult(OutputPin newResult,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newResult,
-			UMLPackage.TEST_IDENTITY_ACTION__RESULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newResult, UMLPackage.TEST_IDENTITY_ACTION__RESULT, msgs);
 		return msgs;
 	}
 
@@ -327,9 +299,7 @@
 	 * @generated
 	 */
 	public void setResult(OutputPin newResult) {
-		eDynamicSet(
-			UMLPackage.TEST_IDENTITY_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TEST_IDENTITY_ACTION__RESULT, newResult);
+		eDynamicSet(UMLPackage.TEST_IDENTITY_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TEST_IDENTITY_ACTION__RESULT, newResult);
 	}
 
 	/**
@@ -338,8 +308,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setResult(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -355,8 +324,7 @@
 	 */
 	public boolean validateNoType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TestIdentityActionOperations.validateNoType(this, diagnostics,
-			context);
+		return TestIdentityActionOperations.validateNoType(this, diagnostics, context);
 	}
 
 	/**
@@ -366,8 +334,7 @@
 	 */
 	public boolean validateMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TestIdentityActionOperations.validateMultiplicity(this,
-			diagnostics, context);
+		return TestIdentityActionOperations.validateMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -377,8 +344,7 @@
 	 */
 	public boolean validateResultIsBoolean(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TestIdentityActionOperations.validateResultIsBoolean(this,
-			diagnostics, context);
+		return TestIdentityActionOperations.validateResultIsBoolean(this, diagnostics, context);
 	}
 
 	/**
@@ -390,43 +356,34 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TEST_IDENTITY_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEST_IDENTITY_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEST_IDENTITY_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.TEST_IDENTITY_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.TEST_IDENTITY_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEST_IDENTITY_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TEST_IDENTITY_ACTION__FIRST :
-				return basicSetFirst(null, msgs);
-			case UMLPackage.TEST_IDENTITY_ACTION__RESULT :
-				return basicSetResult(null, msgs);
-			case UMLPackage.TEST_IDENTITY_ACTION__SECOND :
-				return basicSetSecond(null, msgs);
+		case UMLPackage.TEST_IDENTITY_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEST_IDENTITY_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEST_IDENTITY_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.TEST_IDENTITY_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEST_IDENTITY_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEST_IDENTITY_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TEST_IDENTITY_ACTION__FIRST:
+			return basicSetFirst(null, msgs);
+		case UMLPackage.TEST_IDENTITY_ACTION__RESULT:
+			return basicSetResult(null, msgs);
+		case UMLPackage.TEST_IDENTITY_ACTION__SECOND:
+			return basicSetSecond(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -439,86 +396,86 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.TEST_IDENTITY_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.TEST_IDENTITY_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.TEST_IDENTITY_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.TEST_IDENTITY_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.TEST_IDENTITY_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.TEST_IDENTITY_ACTION__NAME :
-				return getName();
-			case UMLPackage.TEST_IDENTITY_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.TEST_IDENTITY_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.TEST_IDENTITY_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TEST_IDENTITY_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.TEST_IDENTITY_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.TEST_IDENTITY_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.TEST_IDENTITY_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.TEST_IDENTITY_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.TEST_IDENTITY_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.TEST_IDENTITY_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.TEST_IDENTITY_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.TEST_IDENTITY_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.TEST_IDENTITY_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.TEST_IDENTITY_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.TEST_IDENTITY_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.TEST_IDENTITY_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.TEST_IDENTITY_ACTION__FIRST :
-				if (resolve)
-					return getFirst();
-				return basicGetFirst();
-			case UMLPackage.TEST_IDENTITY_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
-			case UMLPackage.TEST_IDENTITY_ACTION__SECOND :
-				if (resolve)
-					return getSecond();
-				return basicGetSecond();
+		case UMLPackage.TEST_IDENTITY_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.TEST_IDENTITY_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.TEST_IDENTITY_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.TEST_IDENTITY_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.TEST_IDENTITY_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.TEST_IDENTITY_ACTION__NAME:
+			return getName();
+		case UMLPackage.TEST_IDENTITY_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.TEST_IDENTITY_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.TEST_IDENTITY_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TEST_IDENTITY_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.TEST_IDENTITY_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.TEST_IDENTITY_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.TEST_IDENTITY_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.TEST_IDENTITY_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.TEST_IDENTITY_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.TEST_IDENTITY_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.TEST_IDENTITY_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.TEST_IDENTITY_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.TEST_IDENTITY_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.TEST_IDENTITY_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.TEST_IDENTITY_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.TEST_IDENTITY_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.TEST_IDENTITY_ACTION__FIRST:
+			if (resolve)
+				return getFirst();
+			return basicGetFirst();
+		case UMLPackage.TEST_IDENTITY_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
+		case UMLPackage.TEST_IDENTITY_ACTION__SECOND:
+			if (resolve)
+				return getSecond();
+			return basicGetSecond();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -532,86 +489,76 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.TEST_IDENTITY_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__FIRST :
-				setFirst((InputPin) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__SECOND :
-				setSecond((InputPin) newValue);
-				return;
+		case UMLPackage.TEST_IDENTITY_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__FIRST:
+			setFirst((InputPin) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__SECOND:
+			setSecond((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -624,66 +571,66 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TEST_IDENTITY_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__FIRST :
-				setFirst((InputPin) null);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
-			case UMLPackage.TEST_IDENTITY_ACTION__SECOND :
-				setSecond((InputPin) null);
-				return;
+		case UMLPackage.TEST_IDENTITY_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__FIRST:
+			setFirst((InputPin) null);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
+		case UMLPackage.TEST_IDENTITY_ACTION__SECOND:
+			setSecond((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -696,70 +643,68 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TEST_IDENTITY_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.TEST_IDENTITY_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.TEST_IDENTITY_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.TEST_IDENTITY_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.TEST_IDENTITY_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.TEST_IDENTITY_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.TEST_IDENTITY_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.TEST_IDENTITY_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.TEST_IDENTITY_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.TEST_IDENTITY_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.TEST_IDENTITY_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.TEST_IDENTITY_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.TEST_IDENTITY_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.TEST_IDENTITY_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.TEST_IDENTITY_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.TEST_IDENTITY_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.TEST_IDENTITY_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.TEST_IDENTITY_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.TEST_IDENTITY_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.TEST_IDENTITY_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.TEST_IDENTITY_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.TEST_IDENTITY_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.TEST_IDENTITY_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.TEST_IDENTITY_ACTION__FIRST :
-				return basicGetFirst() != null;
-			case UMLPackage.TEST_IDENTITY_ACTION__RESULT :
-				return basicGetResult() != null;
-			case UMLPackage.TEST_IDENTITY_ACTION__SECOND :
-				return basicGetSecond() != null;
+		case UMLPackage.TEST_IDENTITY_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.TEST_IDENTITY_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.TEST_IDENTITY_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.TEST_IDENTITY_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.TEST_IDENTITY_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.TEST_IDENTITY_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.TEST_IDENTITY_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.TEST_IDENTITY_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.TEST_IDENTITY_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.TEST_IDENTITY_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.TEST_IDENTITY_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.TEST_IDENTITY_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.TEST_IDENTITY_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.TEST_IDENTITY_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.TEST_IDENTITY_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.TEST_IDENTITY_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.TEST_IDENTITY_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.TEST_IDENTITY_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.TEST_IDENTITY_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.TEST_IDENTITY_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.TEST_IDENTITY_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.TEST_IDENTITY_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.TEST_IDENTITY_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.TEST_IDENTITY_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.TEST_IDENTITY_ACTION__FIRST:
+			return basicGetFirst() != null;
+		case UMLPackage.TEST_IDENTITY_ACTION__RESULT:
+			return basicGetResult() != null;
+		case UMLPackage.TEST_IDENTITY_ACTION__SECOND:
+			return basicGetSecond() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -774,162 +719,136 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEST_IDENTITY_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEST_IDENTITY_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TEST_IDENTITY_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.TEST_IDENTITY_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.TEST_IDENTITY_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEST_IDENTITY_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.TEST_IDENTITY_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.TEST_IDENTITY_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.TEST_IDENTITY_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TEST_IDENTITY_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEST_IDENTITY_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.TEST_IDENTITY_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.TEST_IDENTITY_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.TEST_IDENTITY_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.TEST_IDENTITY_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.TEST_IDENTITY_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_NO_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateNoType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_RESULT_IS_BOOLEAN__DIAGNOSTICCHAIN_MAP :
-				return validateResultIsBoolean(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEST_IDENTITY_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEST_IDENTITY_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TEST_IDENTITY_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.TEST_IDENTITY_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.TEST_IDENTITY_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEST_IDENTITY_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.TEST_IDENTITY_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.TEST_IDENTITY_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.TEST_IDENTITY_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TEST_IDENTITY_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEST_IDENTITY_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.TEST_IDENTITY_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.TEST_IDENTITY_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.TEST_IDENTITY_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.TEST_IDENTITY_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.TEST_IDENTITY_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_NO_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateNoType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TEST_IDENTITY_ACTION___VALIDATE_RESULT_IS_BOOLEAN__DIAGNOSTICCHAIN_MAP:
+			return validateResultIsBoolean((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -942,9 +861,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.TEST_IDENTITY_ACTION__FIRST,
-		UMLPackage.TEST_IDENTITY_ACTION__SECOND};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.TEST_IDENTITY_ACTION__FIRST, UMLPackage.TEST_IDENTITY_ACTION__SECOND };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -954,8 +871,8 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.TEST_IDENTITY_ACTION__FIRST)
-			|| eIsSet(UMLPackage.TEST_IDENTITY_ACTION__SECOND);
+				|| eIsSet(UMLPackage.TEST_IDENTITY_ACTION__FIRST)
+				|| eIsSet(UMLPackage.TEST_IDENTITY_ACTION__SECOND);
 	}
 
 	/**
@@ -966,8 +883,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.TEST_IDENTITY_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.TEST_IDENTITY_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -977,7 +893,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.TEST_IDENTITY_ACTION__RESULT);
+				|| eIsSet(UMLPackage.TEST_IDENTITY_ACTION__RESULT);
 	}
 
 } //TestIdentityActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeConstraintImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeConstraintImpl.java
index b8bc3ca..069f36d 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeConstraintImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeConstraintImpl.java
@@ -1,15 +1,15 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
  *   Kenn Hussey (CEA) - 327039, 212765, 418466, 451350, 485756
- *   Kenn Hussey - 519572
+ *   Kenn Hussey - 519572, 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -18,6 +18,7 @@
 import java.util.Collection;
 
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -26,6 +27,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
@@ -97,9 +100,7 @@
 	 * @generated
 	 */
 	public boolean isFirstEvent() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.TIME_CONSTRAINT__FIRST_EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_CONSTRAINT__FIRST_EVENT, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.TIME_CONSTRAINT__FIRST_EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_CONSTRAINT__FIRST_EVENT, true, true);
 	}
 
 	/**
@@ -108,9 +109,7 @@
 	 * @generated
 	 */
 	public void setFirstEvent(boolean newFirstEvent) {
-		eDynamicSet(
-			UMLPackage.TIME_CONSTRAINT__FIRST_EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_CONSTRAINT__FIRST_EVENT, newFirstEvent);
+		eDynamicSet(UMLPackage.TIME_CONSTRAINT__FIRST_EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_CONSTRAINT__FIRST_EVENT, newFirstEvent);
 	}
 
 	/**
@@ -120,9 +119,7 @@
 	 */
 	@Override
 	public ValueSpecification getSpecification() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.TIME_CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__SPECIFICATION, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.TIME_CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__SPECIFICATION, true, true);
 	}
 
 	/**
@@ -132,9 +129,7 @@
 	 */
 	@Override
 	public ValueSpecification basicGetSpecification() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.TIME_CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__SPECIFICATION, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.TIME_CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__SPECIFICATION, false, true);
 	}
 
 	/**
@@ -145,13 +140,10 @@
 	@Override
 	public NotificationChain basicSetSpecification(
 			ValueSpecification newSpecification, NotificationChain msgs) {
-		if (newSpecification != null
-			&& !(newSpecification instanceof TimeInterval)) {
-			throw new IllegalArgumentException(
-				"newSpecification must be an instance of TimeInterval"); //$NON-NLS-1$
+		if (newSpecification != null && !(newSpecification instanceof TimeInterval)) {
+			throw new IllegalArgumentException("newSpecification must be an instance of TimeInterval"); //$NON-NLS-1$
 		}
-		msgs = eDynamicInverseAdd((InternalEObject) newSpecification,
-			UMLPackage.TIME_CONSTRAINT__SPECIFICATION, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newSpecification, UMLPackage.TIME_CONSTRAINT__SPECIFICATION, msgs);
 		return msgs;
 	}
 
@@ -162,14 +154,10 @@
 	 */
 	@Override
 	public void setSpecification(ValueSpecification newSpecification) {
-		if (newSpecification != null
-			&& !(newSpecification instanceof TimeInterval)) {
-			throw new IllegalArgumentException(
-				"newSpecification must be an instance of TimeInterval"); //$NON-NLS-1$
+		if (newSpecification != null && !(newSpecification instanceof TimeInterval)) {
+			throw new IllegalArgumentException("newSpecification must be an instance of TimeInterval"); //$NON-NLS-1$
 		}
-		eDynamicSet(
-			UMLPackage.TIME_CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.CONSTRAINT__SPECIFICATION, newSpecification);
+		eDynamicSet(UMLPackage.TIME_CONSTRAINT__SPECIFICATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.CONSTRAINT__SPECIFICATION, newSpecification);
 	}
 
 	/**
@@ -177,11 +165,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@Override
 	public ValueSpecification createSpecification(String name, Type type,
 			EClass eClass) {
-		ValueSpecification newSpecification = (ValueSpecification) create(
-			eClass);
+		ValueSpecification newSpecification = (ValueSpecification) create(eClass);
 		setSpecification(newSpecification);
 		if (name != null)
 			newSpecification.setName(name);
@@ -207,8 +193,7 @@
 	 */
 	public boolean validateHasOneConstrainedElement(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TimeConstraintOperations.validateHasOneConstrainedElement(this,
-			diagnostics, context);
+		return TimeConstraintOperations.validateHasOneConstrainedElement(this, diagnostics, context);
 	}
 
 	/**
@@ -220,22 +205,20 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TIME_CONSTRAINT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TIME_CONSTRAINT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TIME_CONSTRAINT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.TIME_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.TIME_CONSTRAINT__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.TIME_CONSTRAINT__CONTEXT :
-				return basicSetContext(null, msgs);
-			case UMLPackage.TIME_CONSTRAINT__SPECIFICATION :
-				return basicSetSpecification(null, msgs);
+		case UMLPackage.TIME_CONSTRAINT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TIME_CONSTRAINT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TIME_CONSTRAINT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.TIME_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.TIME_CONSTRAINT__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.TIME_CONSTRAINT__CONTEXT:
+			return basicSetContext(null, msgs);
+		case UMLPackage.TIME_CONSTRAINT__SPECIFICATION:
+			return basicSetSpecification(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -248,52 +231,52 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.TIME_CONSTRAINT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.TIME_CONSTRAINT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.TIME_CONSTRAINT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.TIME_CONSTRAINT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.TIME_CONSTRAINT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.TIME_CONSTRAINT__NAME :
-				return getName();
-			case UMLPackage.TIME_CONSTRAINT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.TIME_CONSTRAINT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.TIME_CONSTRAINT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TIME_CONSTRAINT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.TIME_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.TIME_CONSTRAINT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.TIME_CONSTRAINT__CONSTRAINED_ELEMENT :
-				return getConstrainedElements();
-			case UMLPackage.TIME_CONSTRAINT__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.TIME_CONSTRAINT__SPECIFICATION :
-				if (resolve)
-					return getSpecification();
-				return basicGetSpecification();
-			case UMLPackage.TIME_CONSTRAINT__FIRST_EVENT :
-				return isFirstEvent();
+		case UMLPackage.TIME_CONSTRAINT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.TIME_CONSTRAINT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.TIME_CONSTRAINT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.TIME_CONSTRAINT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.TIME_CONSTRAINT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.TIME_CONSTRAINT__NAME:
+			return getName();
+		case UMLPackage.TIME_CONSTRAINT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.TIME_CONSTRAINT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.TIME_CONSTRAINT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TIME_CONSTRAINT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.TIME_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.TIME_CONSTRAINT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.TIME_CONSTRAINT__CONSTRAINED_ELEMENT:
+			return getConstrainedElements();
+		case UMLPackage.TIME_CONSTRAINT__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.TIME_CONSTRAINT__SPECIFICATION:
+			if (resolve)
+				return getSpecification();
+			return basicGetSpecification();
+		case UMLPackage.TIME_CONSTRAINT__FIRST_EVENT:
+			return isFirstEvent();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -307,45 +290,42 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.TIME_CONSTRAINT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.TIME_CONSTRAINT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.TIME_CONSTRAINT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.TIME_CONSTRAINT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.TIME_CONSTRAINT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.TIME_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.TIME_CONSTRAINT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.TIME_CONSTRAINT__CONSTRAINED_ELEMENT :
-				getConstrainedElements().clear();
-				getConstrainedElements()
-					.addAll((Collection<? extends Element>) newValue);
-				return;
-			case UMLPackage.TIME_CONSTRAINT__CONTEXT :
-				setContext((Namespace) newValue);
-				return;
-			case UMLPackage.TIME_CONSTRAINT__SPECIFICATION :
-				setSpecification((ValueSpecification) newValue);
-				return;
-			case UMLPackage.TIME_CONSTRAINT__FIRST_EVENT :
-				setFirstEvent((Boolean) newValue);
-				return;
+		case UMLPackage.TIME_CONSTRAINT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.TIME_CONSTRAINT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.TIME_CONSTRAINT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.TIME_CONSTRAINT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.TIME_CONSTRAINT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.TIME_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.TIME_CONSTRAINT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.TIME_CONSTRAINT__CONSTRAINED_ELEMENT:
+			getConstrainedElements().clear();
+			getConstrainedElements().addAll((Collection<? extends Element>) newValue);
+			return;
+		case UMLPackage.TIME_CONSTRAINT__CONTEXT:
+			setContext((Namespace) newValue);
+			return;
+		case UMLPackage.TIME_CONSTRAINT__SPECIFICATION:
+			setSpecification((ValueSpecification) newValue);
+			return;
+		case UMLPackage.TIME_CONSTRAINT__FIRST_EVENT:
+			setFirstEvent((Boolean) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -358,39 +338,39 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TIME_CONSTRAINT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.TIME_CONSTRAINT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.TIME_CONSTRAINT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.TIME_CONSTRAINT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.TIME_CONSTRAINT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.TIME_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.TIME_CONSTRAINT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.TIME_CONSTRAINT__CONSTRAINED_ELEMENT :
-				getConstrainedElements().clear();
-				return;
-			case UMLPackage.TIME_CONSTRAINT__CONTEXT :
-				setContext((Namespace) null);
-				return;
-			case UMLPackage.TIME_CONSTRAINT__SPECIFICATION :
-				setSpecification((ValueSpecification) null);
-				return;
-			case UMLPackage.TIME_CONSTRAINT__FIRST_EVENT :
-				setFirstEvent(FIRST_EVENT_EDEFAULT);
-				return;
+		case UMLPackage.TIME_CONSTRAINT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.TIME_CONSTRAINT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.TIME_CONSTRAINT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.TIME_CONSTRAINT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.TIME_CONSTRAINT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.TIME_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.TIME_CONSTRAINT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.TIME_CONSTRAINT__CONSTRAINED_ELEMENT:
+			getConstrainedElements().clear();
+			return;
+		case UMLPackage.TIME_CONSTRAINT__CONTEXT:
+			setContext((Namespace) null);
+			return;
+		case UMLPackage.TIME_CONSTRAINT__SPECIFICATION:
+			setSpecification((ValueSpecification) null);
+			return;
+		case UMLPackage.TIME_CONSTRAINT__FIRST_EVENT:
+			setFirstEvent(FIRST_EVENT_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -403,40 +383,38 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TIME_CONSTRAINT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.TIME_CONSTRAINT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.TIME_CONSTRAINT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.TIME_CONSTRAINT__OWNER :
-				return isSetOwner();
-			case UMLPackage.TIME_CONSTRAINT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.TIME_CONSTRAINT__NAME :
-				return isSetName();
-			case UMLPackage.TIME_CONSTRAINT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.TIME_CONSTRAINT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.TIME_CONSTRAINT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.TIME_CONSTRAINT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.TIME_CONSTRAINT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.TIME_CONSTRAINT__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.TIME_CONSTRAINT__CONSTRAINED_ELEMENT :
-				return !getConstrainedElements().isEmpty();
-			case UMLPackage.TIME_CONSTRAINT__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.TIME_CONSTRAINT__SPECIFICATION :
-				return isSetSpecification();
-			case UMLPackage.TIME_CONSTRAINT__FIRST_EVENT :
-				return isFirstEvent() != FIRST_EVENT_EDEFAULT;
+		case UMLPackage.TIME_CONSTRAINT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.TIME_CONSTRAINT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.TIME_CONSTRAINT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.TIME_CONSTRAINT__OWNER:
+			return isSetOwner();
+		case UMLPackage.TIME_CONSTRAINT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.TIME_CONSTRAINT__NAME:
+			return isSetName();
+		case UMLPackage.TIME_CONSTRAINT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.TIME_CONSTRAINT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.TIME_CONSTRAINT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.TIME_CONSTRAINT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.TIME_CONSTRAINT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.TIME_CONSTRAINT__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.TIME_CONSTRAINT__CONSTRAINED_ELEMENT:
+			return !getConstrainedElements().isEmpty();
+		case UMLPackage.TIME_CONSTRAINT__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.TIME_CONSTRAINT__SPECIFICATION:
+			return isSetSpecification();
+		case UMLPackage.TIME_CONSTRAINT__FIRST_EVENT:
+			return isFirstEvent() != FIRST_EVENT_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -451,148 +429,124 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.TIME_CONSTRAINT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_CONSTRAINT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_CONSTRAINT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.TIME_CONSTRAINT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.TIME_CONSTRAINT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.TIME_CONSTRAINT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.TIME_CONSTRAINT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TIME_CONSTRAINT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___GET_MODEL :
-				return getModel();
-			case UMLPackage.TIME_CONSTRAINT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.TIME_CONSTRAINT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.TIME_CONSTRAINT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.TIME_CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.TIME_CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.TIME_CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.TIME_CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TIME_CONSTRAINT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TIME_CONSTRAINT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.TIME_CONSTRAINT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.TIME_CONSTRAINT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.TIME_CONSTRAINT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_CONSTRAINT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_CONSTRAINT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_CONSTRAINT___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___GET_LABEL :
-				return getLabel();
-			case UMLPackage.TIME_CONSTRAINT___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.TIME_CONSTRAINT___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.TIME_CONSTRAINT___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.TIME_CONSTRAINT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.TIME_CONSTRAINT___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TIME_CONSTRAINT___SEPARATOR :
-				return separator();
-			case UMLPackage.TIME_CONSTRAINT___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.TIME_CONSTRAINT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.TIME_CONSTRAINT___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.TIME_CONSTRAINT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_CONSTRAINT___VALIDATE_BOOLEAN_VALUE__DIAGNOSTICCHAIN_MAP :
-				return validateBooleanValue((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_CONSTRAINT___VALIDATE_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateNoSideEffects((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_CONSTRAINT___VALIDATE_NOT_APPLY_TO_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotApplyToSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_CONSTRAINT___VALIDATE_HAS_ONE_CONSTRAINED_ELEMENT__DIAGNOSTICCHAIN_MAP :
-				return validateHasOneConstrainedElement(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_CONSTRAINT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_CONSTRAINT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_CONSTRAINT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.TIME_CONSTRAINT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.TIME_CONSTRAINT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.TIME_CONSTRAINT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.TIME_CONSTRAINT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TIME_CONSTRAINT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___GET_MODEL:
+			return getModel();
+		case UMLPackage.TIME_CONSTRAINT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.TIME_CONSTRAINT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.TIME_CONSTRAINT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.TIME_CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.TIME_CONSTRAINT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.TIME_CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.TIME_CONSTRAINT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TIME_CONSTRAINT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TIME_CONSTRAINT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.TIME_CONSTRAINT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.TIME_CONSTRAINT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.TIME_CONSTRAINT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_CONSTRAINT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_CONSTRAINT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_CONSTRAINT___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___GET_LABEL:
+			return getLabel();
+		case UMLPackage.TIME_CONSTRAINT___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.TIME_CONSTRAINT___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.TIME_CONSTRAINT___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.TIME_CONSTRAINT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.TIME_CONSTRAINT___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TIME_CONSTRAINT___SEPARATOR:
+			return separator();
+		case UMLPackage.TIME_CONSTRAINT___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.TIME_CONSTRAINT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.TIME_CONSTRAINT___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.TIME_CONSTRAINT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_CONSTRAINT___VALIDATE_BOOLEAN_VALUE__DIAGNOSTICCHAIN_MAP:
+			return validateBooleanValue((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_CONSTRAINT___VALIDATE_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_CONSTRAINT___VALIDATE_NOT_APPLY_TO_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotApplyToSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_CONSTRAINT___VALIDATE_HAS_ONE_CONSTRAINED_ELEMENT__DIAGNOSTICCHAIN_MAP:
+			return validateHasOneConstrainedElement((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeEventImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeEventImpl.java
index f308bf6..f8e768d 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeEventImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeEventImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,6 +29,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -110,20 +113,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.TIME_EVENT__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TIME_EVENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.TIME_EVENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TIME_EVENT__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -132,9 +128,7 @@
 	 * @generated
 	 */
 	public boolean isRelative() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.TIME_EVENT__IS_RELATIVE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_EVENT__IS_RELATIVE, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.TIME_EVENT__IS_RELATIVE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_EVENT__IS_RELATIVE, true, true);
 	}
 
 	/**
@@ -143,8 +137,7 @@
 	 * @generated
 	 */
 	public void setIsRelative(boolean newIsRelative) {
-		eDynamicSet(UMLPackage.TIME_EVENT__IS_RELATIVE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_EVENT__IS_RELATIVE, newIsRelative);
+		eDynamicSet(UMLPackage.TIME_EVENT__IS_RELATIVE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_EVENT__IS_RELATIVE, newIsRelative);
 	}
 
 	/**
@@ -153,9 +146,7 @@
 	 * @generated
 	 */
 	public TimeExpression getWhen() {
-		return (TimeExpression) eDynamicGet(
-			UMLPackage.TIME_EVENT__WHEN - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_EVENT__WHEN, true, true);
+		return (TimeExpression) eDynamicGet(UMLPackage.TIME_EVENT__WHEN - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_EVENT__WHEN, true, true);
 	}
 
 	/**
@@ -164,9 +155,7 @@
 	 * @generated
 	 */
 	public TimeExpression basicGetWhen() {
-		return (TimeExpression) eDynamicGet(
-			UMLPackage.TIME_EVENT__WHEN - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_EVENT__WHEN, false, true);
+		return (TimeExpression) eDynamicGet(UMLPackage.TIME_EVENT__WHEN - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_EVENT__WHEN, false, true);
 	}
 
 	/**
@@ -176,8 +165,7 @@
 	 */
 	public NotificationChain basicSetWhen(TimeExpression newWhen,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newWhen,
-			UMLPackage.TIME_EVENT__WHEN, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newWhen, UMLPackage.TIME_EVENT__WHEN, msgs);
 		return msgs;
 	}
 
@@ -187,8 +175,7 @@
 	 * @generated
 	 */
 	public void setWhen(TimeExpression newWhen) {
-		eDynamicSet(UMLPackage.TIME_EVENT__WHEN - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_EVENT__WHEN, newWhen);
+		eDynamicSet(UMLPackage.TIME_EVENT__WHEN - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_EVENT__WHEN, newWhen);
 	}
 
 	/**
@@ -197,8 +184,7 @@
 	 * @generated
 	 */
 	public TimeExpression createWhen(String name, Type type) {
-		TimeExpression newWhen = (TimeExpression) create(
-			UMLPackage.Literals.TIME_EXPRESSION);
+		TimeExpression newWhen = (TimeExpression) create(UMLPackage.Literals.TIME_EXPRESSION);
 		setWhen(newWhen);
 		if (name != null)
 			newWhen.setName(name);
@@ -214,8 +200,7 @@
 	 */
 	public boolean validateWhenNonNegative(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TimeEventOperations.validateWhenNonNegative(this, diagnostics,
-			context);
+		return TimeEventOperations.validateWhenNonNegative(this, diagnostics, context);
 	}
 
 	/**
@@ -227,20 +212,18 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TIME_EVENT__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TIME_EVENT__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TIME_EVENT__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.TIME_EVENT__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.TIME_EVENT__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.TIME_EVENT__WHEN :
-				return basicSetWhen(null, msgs);
+		case UMLPackage.TIME_EVENT__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TIME_EVENT__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TIME_EVENT__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.TIME_EVENT__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.TIME_EVENT__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.TIME_EVENT__WHEN:
+			return basicSetWhen(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -253,46 +236,46 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.TIME_EVENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.TIME_EVENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.TIME_EVENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.TIME_EVENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.TIME_EVENT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.TIME_EVENT__NAME :
-				return getName();
-			case UMLPackage.TIME_EVENT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.TIME_EVENT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.TIME_EVENT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TIME_EVENT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.TIME_EVENT__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.TIME_EVENT__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.TIME_EVENT__IS_RELATIVE :
-				return isRelative();
-			case UMLPackage.TIME_EVENT__WHEN :
-				if (resolve)
-					return getWhen();
-				return basicGetWhen();
+		case UMLPackage.TIME_EVENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.TIME_EVENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.TIME_EVENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.TIME_EVENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.TIME_EVENT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.TIME_EVENT__NAME:
+			return getName();
+		case UMLPackage.TIME_EVENT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.TIME_EVENT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.TIME_EVENT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TIME_EVENT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.TIME_EVENT__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.TIME_EVENT__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.TIME_EVENT__IS_RELATIVE:
+			return isRelative();
+		case UMLPackage.TIME_EVENT__WHEN:
+			if (resolve)
+				return getWhen();
+			return basicGetWhen();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -306,37 +289,35 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.TIME_EVENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.TIME_EVENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.TIME_EVENT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.TIME_EVENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.TIME_EVENT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.TIME_EVENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.TIME_EVENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.TIME_EVENT__IS_RELATIVE :
-				setIsRelative((Boolean) newValue);
-				return;
-			case UMLPackage.TIME_EVENT__WHEN :
-				setWhen((TimeExpression) newValue);
-				return;
+		case UMLPackage.TIME_EVENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.TIME_EVENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.TIME_EVENT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.TIME_EVENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.TIME_EVENT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.TIME_EVENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.TIME_EVENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.TIME_EVENT__IS_RELATIVE:
+			setIsRelative((Boolean) newValue);
+			return;
+		case UMLPackage.TIME_EVENT__WHEN:
+			setWhen((TimeExpression) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -349,33 +330,33 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TIME_EVENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.TIME_EVENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.TIME_EVENT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.TIME_EVENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.TIME_EVENT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.TIME_EVENT__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.TIME_EVENT__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.TIME_EVENT__IS_RELATIVE :
-				setIsRelative(IS_RELATIVE_EDEFAULT);
-				return;
-			case UMLPackage.TIME_EVENT__WHEN :
-				setWhen((TimeExpression) null);
-				return;
+		case UMLPackage.TIME_EVENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.TIME_EVENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.TIME_EVENT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.TIME_EVENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.TIME_EVENT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.TIME_EVENT__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.TIME_EVENT__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.TIME_EVENT__IS_RELATIVE:
+			setIsRelative(IS_RELATIVE_EDEFAULT);
+			return;
+		case UMLPackage.TIME_EVENT__WHEN:
+			setWhen((TimeExpression) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -388,36 +369,34 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TIME_EVENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.TIME_EVENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.TIME_EVENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.TIME_EVENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.TIME_EVENT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.TIME_EVENT__NAME :
-				return isSetName();
-			case UMLPackage.TIME_EVENT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.TIME_EVENT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.TIME_EVENT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.TIME_EVENT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.TIME_EVENT__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.TIME_EVENT__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.TIME_EVENT__IS_RELATIVE :
-				return isRelative() != IS_RELATIVE_EDEFAULT;
-			case UMLPackage.TIME_EVENT__WHEN :
-				return basicGetWhen() != null;
+		case UMLPackage.TIME_EVENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.TIME_EVENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.TIME_EVENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.TIME_EVENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.TIME_EVENT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.TIME_EVENT__NAME:
+			return isSetName();
+		case UMLPackage.TIME_EVENT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.TIME_EVENT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.TIME_EVENT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.TIME_EVENT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.TIME_EVENT__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.TIME_EVENT__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.TIME_EVENT__IS_RELATIVE:
+			return isRelative() != IS_RELATIVE_EDEFAULT;
+		case UMLPackage.TIME_EVENT__WHEN:
+			return basicGetWhen() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -432,138 +411,118 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.TIME_EVENT___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.TIME_EVENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_EVENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_EVENT___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.TIME_EVENT___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_EVENT___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.TIME_EVENT___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.TIME_EVENT___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.TIME_EVENT___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.TIME_EVENT___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.TIME_EVENT___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.TIME_EVENT___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.TIME_EVENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TIME_EVENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_EVENT___GET_MODEL :
-				return getModel();
-			case UMLPackage.TIME_EVENT___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.TIME_EVENT___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.TIME_EVENT___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.TIME_EVENT___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.TIME_EVENT___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.TIME_EVENT___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.TIME_EVENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TIME_EVENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_EVENT___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.TIME_EVENT___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.TIME_EVENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TIME_EVENT___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TIME_EVENT___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.TIME_EVENT___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TIME_EVENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_EVENT___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_EVENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_EVENT___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.TIME_EVENT___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.TIME_EVENT___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_EVENT___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.TIME_EVENT___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.TIME_EVENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_EVENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_EVENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_EVENT___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.TIME_EVENT___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.TIME_EVENT___GET_LABEL :
-				return getLabel();
-			case UMLPackage.TIME_EVENT___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.TIME_EVENT___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.TIME_EVENT___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.TIME_EVENT___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.TIME_EVENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.TIME_EVENT___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TIME_EVENT___SEPARATOR :
-				return separator();
-			case UMLPackage.TIME_EVENT___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.TIME_EVENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.TIME_EVENT___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.TIME_EVENT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_EVENT___VALIDATE_WHEN_NON_NEGATIVE__DIAGNOSTICCHAIN_MAP :
-				return validateWhenNonNegative(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_EVENT___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.TIME_EVENT___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_EVENT___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_EVENT___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.TIME_EVENT___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_EVENT___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.TIME_EVENT___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.TIME_EVENT___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.TIME_EVENT___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.TIME_EVENT___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.TIME_EVENT___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.TIME_EVENT___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.TIME_EVENT___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TIME_EVENT___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_EVENT___GET_MODEL:
+			return getModel();
+		case UMLPackage.TIME_EVENT___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.TIME_EVENT___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.TIME_EVENT___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.TIME_EVENT___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.TIME_EVENT___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.TIME_EVENT___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.TIME_EVENT___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TIME_EVENT___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_EVENT___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.TIME_EVENT___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.TIME_EVENT___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TIME_EVENT___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TIME_EVENT___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.TIME_EVENT___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TIME_EVENT___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_EVENT___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_EVENT___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_EVENT___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.TIME_EVENT___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.TIME_EVENT___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_EVENT___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.TIME_EVENT___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.TIME_EVENT___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_EVENT___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_EVENT___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_EVENT___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.TIME_EVENT___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.TIME_EVENT___GET_LABEL:
+			return getLabel();
+		case UMLPackage.TIME_EVENT___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.TIME_EVENT___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.TIME_EVENT___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.TIME_EVENT___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.TIME_EVENT___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.TIME_EVENT___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TIME_EVENT___SEPARATOR:
+			return separator();
+		case UMLPackage.TIME_EVENT___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.TIME_EVENT___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.TIME_EVENT___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.TIME_EVENT___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_EVENT___VALIDATE_WHEN_NON_NEGATIVE__DIAGNOSTICCHAIN_MAP:
+			return validateWhenNonNegative((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -576,9 +535,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.TIME_EVENT__OWNED_COMMENT,
-		UMLPackage.TIME_EVENT__NAME_EXPRESSION, UMLPackage.TIME_EVENT__WHEN};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.TIME_EVENT__OWNED_COMMENT, UMLPackage.TIME_EVENT__NAME_EXPRESSION, UMLPackage.TIME_EVENT__WHEN };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -588,7 +545,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.TIME_EVENT__WHEN);
+				|| eIsSet(UMLPackage.TIME_EVENT__WHEN);
 	}
 
 } //TimeEventImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeExpressionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeExpressionImpl.java
index 2208e57..3fcc71f 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeExpressionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeExpressionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -16,6 +16,8 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
+
 import org.eclipse.emf.common.notify.NotificationChain;
 import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EList;
@@ -24,7 +26,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
@@ -94,20 +100,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.TIME_EXPRESSION__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TIME_EXPRESSION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.TIME_EXPRESSION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TIME_EXPRESSION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -118,10 +117,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.TIME_EXPRESSION__OWNED_COMMENT,
-		UMLPackage.TIME_EXPRESSION__NAME_EXPRESSION,
-		UMLPackage.TIME_EXPRESSION__EXPR};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.TIME_EXPRESSION__OWNED_COMMENT, UMLPackage.TIME_EXPRESSION__NAME_EXPRESSION, UMLPackage.TIME_EXPRESSION__EXPR };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -129,9 +125,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getExpr() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.TIME_EXPRESSION__EXPR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_EXPRESSION__EXPR, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.TIME_EXPRESSION__EXPR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_EXPRESSION__EXPR, true, true);
 	}
 
 	/**
@@ -140,9 +134,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetExpr() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.TIME_EXPRESSION__EXPR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_EXPRESSION__EXPR, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.TIME_EXPRESSION__EXPR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_EXPRESSION__EXPR, false, true);
 	}
 
 	/**
@@ -152,8 +144,7 @@
 	 */
 	public NotificationChain basicSetExpr(ValueSpecification newExpr,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newExpr,
-			UMLPackage.TIME_EXPRESSION__EXPR, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newExpr, UMLPackage.TIME_EXPRESSION__EXPR, msgs);
 		return msgs;
 	}
 
@@ -163,8 +154,7 @@
 	 * @generated
 	 */
 	public void setExpr(ValueSpecification newExpr) {
-		eDynamicSet(UMLPackage.TIME_EXPRESSION__EXPR - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_EXPRESSION__EXPR, newExpr);
+		eDynamicSet(UMLPackage.TIME_EXPRESSION__EXPR - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_EXPRESSION__EXPR, newExpr);
 	}
 
 	/**
@@ -190,9 +180,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Observation> getObservations() {
-		return (EList<Observation>) eDynamicGet(
-			UMLPackage.TIME_EXPRESSION__OBSERVATION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_EXPRESSION__OBSERVATION, true, true);
+		return (EList<Observation>) eDynamicGet(UMLPackage.TIME_EXPRESSION__OBSERVATION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_EXPRESSION__OBSERVATION, true, true);
 	}
 
 	/**
@@ -211,12 +199,10 @@
 	 */
 	public Observation getObservation(String name, boolean ignoreCase,
 			EClass eClass) {
-		observationLoop : for (Observation observation : getObservations()) {
+		observationLoop: for (Observation observation : getObservations()) {
 			if (eClass != null && !eClass.isInstance(observation))
 				continue observationLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(observation.getName())
-				: name.equals(observation.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(observation.getName()) : name.equals(observation.getName())))
 				continue observationLoop;
 			return observation;
 		}
@@ -230,8 +216,7 @@
 	 */
 	public boolean validateNoExprRequiresObservation(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return TimeExpressionOperations.validateNoExprRequiresObservation(this,
-			diagnostics, context);
+		return TimeExpressionOperations.validateNoExprRequiresObservation(this, diagnostics, context);
 	}
 
 	/**
@@ -253,20 +238,18 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TIME_EXPRESSION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TIME_EXPRESSION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TIME_EXPRESSION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.TIME_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.TIME_EXPRESSION__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.TIME_EXPRESSION__EXPR :
-				return basicSetExpr(null, msgs);
+		case UMLPackage.TIME_EXPRESSION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TIME_EXPRESSION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TIME_EXPRESSION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.TIME_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.TIME_EXPRESSION__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.TIME_EXPRESSION__EXPR:
+			return basicSetExpr(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -279,50 +262,50 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.TIME_EXPRESSION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.TIME_EXPRESSION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.TIME_EXPRESSION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.TIME_EXPRESSION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.TIME_EXPRESSION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.TIME_EXPRESSION__NAME :
-				return getName();
-			case UMLPackage.TIME_EXPRESSION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.TIME_EXPRESSION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.TIME_EXPRESSION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TIME_EXPRESSION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.TIME_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.TIME_EXPRESSION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.TIME_EXPRESSION__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.TIME_EXPRESSION__EXPR :
-				if (resolve)
-					return getExpr();
-				return basicGetExpr();
-			case UMLPackage.TIME_EXPRESSION__OBSERVATION :
-				return getObservations();
+		case UMLPackage.TIME_EXPRESSION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.TIME_EXPRESSION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.TIME_EXPRESSION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.TIME_EXPRESSION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.TIME_EXPRESSION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.TIME_EXPRESSION__NAME:
+			return getName();
+		case UMLPackage.TIME_EXPRESSION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.TIME_EXPRESSION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.TIME_EXPRESSION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TIME_EXPRESSION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.TIME_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.TIME_EXPRESSION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.TIME_EXPRESSION__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.TIME_EXPRESSION__EXPR:
+			if (resolve)
+				return getExpr();
+			return basicGetExpr();
+		case UMLPackage.TIME_EXPRESSION__OBSERVATION:
+			return getObservations();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -336,42 +319,39 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.TIME_EXPRESSION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.TIME_EXPRESSION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.TIME_EXPRESSION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.TIME_EXPRESSION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.TIME_EXPRESSION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.TIME_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.TIME_EXPRESSION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.TIME_EXPRESSION__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.TIME_EXPRESSION__EXPR :
-				setExpr((ValueSpecification) newValue);
-				return;
-			case UMLPackage.TIME_EXPRESSION__OBSERVATION :
-				getObservations().clear();
-				getObservations()
-					.addAll((Collection<? extends Observation>) newValue);
-				return;
+		case UMLPackage.TIME_EXPRESSION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.TIME_EXPRESSION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.TIME_EXPRESSION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.TIME_EXPRESSION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.TIME_EXPRESSION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.TIME_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.TIME_EXPRESSION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.TIME_EXPRESSION__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.TIME_EXPRESSION__EXPR:
+			setExpr((ValueSpecification) newValue);
+			return;
+		case UMLPackage.TIME_EXPRESSION__OBSERVATION:
+			getObservations().clear();
+			getObservations().addAll((Collection<? extends Observation>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -384,36 +364,36 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TIME_EXPRESSION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.TIME_EXPRESSION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.TIME_EXPRESSION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.TIME_EXPRESSION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.TIME_EXPRESSION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.TIME_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.TIME_EXPRESSION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.TIME_EXPRESSION__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.TIME_EXPRESSION__EXPR :
-				setExpr((ValueSpecification) null);
-				return;
-			case UMLPackage.TIME_EXPRESSION__OBSERVATION :
-				getObservations().clear();
-				return;
+		case UMLPackage.TIME_EXPRESSION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.TIME_EXPRESSION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.TIME_EXPRESSION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.TIME_EXPRESSION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.TIME_EXPRESSION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.TIME_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.TIME_EXPRESSION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.TIME_EXPRESSION__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.TIME_EXPRESSION__EXPR:
+			setExpr((ValueSpecification) null);
+			return;
+		case UMLPackage.TIME_EXPRESSION__OBSERVATION:
+			getObservations().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -426,38 +406,36 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TIME_EXPRESSION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.TIME_EXPRESSION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.TIME_EXPRESSION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.TIME_EXPRESSION__OWNER :
-				return isSetOwner();
-			case UMLPackage.TIME_EXPRESSION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.TIME_EXPRESSION__NAME :
-				return isSetName();
-			case UMLPackage.TIME_EXPRESSION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.TIME_EXPRESSION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.TIME_EXPRESSION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.TIME_EXPRESSION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.TIME_EXPRESSION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.TIME_EXPRESSION__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.TIME_EXPRESSION__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.TIME_EXPRESSION__EXPR :
-				return basicGetExpr() != null;
-			case UMLPackage.TIME_EXPRESSION__OBSERVATION :
-				return !getObservations().isEmpty();
+		case UMLPackage.TIME_EXPRESSION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.TIME_EXPRESSION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.TIME_EXPRESSION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.TIME_EXPRESSION__OWNER:
+			return isSetOwner();
+		case UMLPackage.TIME_EXPRESSION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.TIME_EXPRESSION__NAME:
+			return isSetName();
+		case UMLPackage.TIME_EXPRESSION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.TIME_EXPRESSION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.TIME_EXPRESSION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.TIME_EXPRESSION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.TIME_EXPRESSION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.TIME_EXPRESSION__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.TIME_EXPRESSION__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.TIME_EXPRESSION__EXPR:
+			return basicGetExpr() != null;
+		case UMLPackage.TIME_EXPRESSION__OBSERVATION:
+			return !getObservations().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -472,152 +450,132 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.TIME_EXPRESSION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_EXPRESSION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_EXPRESSION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.TIME_EXPRESSION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.TIME_EXPRESSION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.TIME_EXPRESSION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.TIME_EXPRESSION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TIME_EXPRESSION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___GET_MODEL :
-				return getModel();
-			case UMLPackage.TIME_EXPRESSION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.TIME_EXPRESSION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.TIME_EXPRESSION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.TIME_EXPRESSION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.TIME_EXPRESSION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.TIME_EXPRESSION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.TIME_EXPRESSION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TIME_EXPRESSION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TIME_EXPRESSION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.TIME_EXPRESSION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.TIME_EXPRESSION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.TIME_EXPRESSION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_EXPRESSION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_EXPRESSION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_EXPRESSION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.TIME_EXPRESSION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.TIME_EXPRESSION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.TIME_EXPRESSION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.TIME_EXPRESSION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.TIME_EXPRESSION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TIME_EXPRESSION___SEPARATOR :
-				return separator();
-			case UMLPackage.TIME_EXPRESSION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.TIME_EXPRESSION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.TIME_EXPRESSION___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.TIME_EXPRESSION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TIME_EXPRESSION___BOOLEAN_VALUE :
-				return booleanValue();
-			case UMLPackage.TIME_EXPRESSION___INTEGER_VALUE :
-				return integerValue();
-			case UMLPackage.TIME_EXPRESSION___IS_COMPUTABLE :
-				return isComputable();
-			case UMLPackage.TIME_EXPRESSION___IS_NULL :
-				return isNull();
-			case UMLPackage.TIME_EXPRESSION___REAL_VALUE :
-				return realValue();
-			case UMLPackage.TIME_EXPRESSION___STRING_VALUE :
-				return stringValue();
-			case UMLPackage.TIME_EXPRESSION___UNLIMITED_VALUE :
-				return unlimitedValue();
-			case UMLPackage.TIME_EXPRESSION___VALIDATE_NO_EXPR_REQUIRES_OBSERVATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoExprRequiresObservation(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_EXPRESSION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_EXPRESSION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_EXPRESSION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.TIME_EXPRESSION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.TIME_EXPRESSION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.TIME_EXPRESSION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.TIME_EXPRESSION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TIME_EXPRESSION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___GET_MODEL:
+			return getModel();
+		case UMLPackage.TIME_EXPRESSION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.TIME_EXPRESSION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.TIME_EXPRESSION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.TIME_EXPRESSION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.TIME_EXPRESSION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.TIME_EXPRESSION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.TIME_EXPRESSION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TIME_EXPRESSION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TIME_EXPRESSION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.TIME_EXPRESSION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.TIME_EXPRESSION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.TIME_EXPRESSION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_EXPRESSION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_EXPRESSION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_EXPRESSION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.TIME_EXPRESSION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.TIME_EXPRESSION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.TIME_EXPRESSION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.TIME_EXPRESSION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.TIME_EXPRESSION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TIME_EXPRESSION___SEPARATOR:
+			return separator();
+		case UMLPackage.TIME_EXPRESSION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.TIME_EXPRESSION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.TIME_EXPRESSION___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.TIME_EXPRESSION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TIME_EXPRESSION___BOOLEAN_VALUE:
+			return booleanValue();
+		case UMLPackage.TIME_EXPRESSION___INTEGER_VALUE:
+			return integerValue();
+		case UMLPackage.TIME_EXPRESSION___IS_COMPUTABLE:
+			return isComputable();
+		case UMLPackage.TIME_EXPRESSION___IS_NULL:
+			return isNull();
+		case UMLPackage.TIME_EXPRESSION___REAL_VALUE:
+			return realValue();
+		case UMLPackage.TIME_EXPRESSION___STRING_VALUE:
+			return stringValue();
+		case UMLPackage.TIME_EXPRESSION___UNLIMITED_VALUE:
+			return unlimitedValue();
+		case UMLPackage.TIME_EXPRESSION___VALIDATE_NO_EXPR_REQUIRES_OBSERVATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoExprRequiresObservation((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -630,7 +588,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.TIME_EXPRESSION__EXPR);
+				|| eIsSet(UMLPackage.TIME_EXPRESSION__EXPR);
 	}
 
 } //TimeExpressionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeIntervalImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeIntervalImpl.java
index 3b9ed1b..a301d73 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeIntervalImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeIntervalImpl.java
@@ -1,20 +1,27 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 212765, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.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.StringExpression;
 import org.eclipse.uml2.uml.TemplateParameter;
@@ -69,9 +76,7 @@
 	 */
 	@Override
 	public ValueSpecification getMax() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.TIME_INTERVAL__MAX - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MAX, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.TIME_INTERVAL__MAX - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MAX, true, true);
 	}
 
 	/**
@@ -81,9 +86,7 @@
 	 */
 	@Override
 	public ValueSpecification basicGetMax() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.TIME_INTERVAL__MAX - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MAX, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.TIME_INTERVAL__MAX - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MAX, false, true);
 	}
 
 	/**
@@ -94,11 +97,9 @@
 	@Override
 	public void setMax(ValueSpecification newMax) {
 		if (newMax != null && !(newMax instanceof TimeExpression)) {
-			throw new IllegalArgumentException(
-				"newMax must be an instance of TimeExpression"); //$NON-NLS-1$
+			throw new IllegalArgumentException("newMax must be an instance of TimeExpression"); //$NON-NLS-1$
 		}
-		eDynamicSet(UMLPackage.TIME_INTERVAL__MAX - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MAX, newMax);
+		eDynamicSet(UMLPackage.TIME_INTERVAL__MAX - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MAX, newMax);
 	}
 
 	/**
@@ -117,9 +118,7 @@
 	 */
 	@Override
 	public ValueSpecification getMin() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.TIME_INTERVAL__MIN - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MIN, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.TIME_INTERVAL__MIN - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MIN, true, true);
 	}
 
 	/**
@@ -129,9 +128,7 @@
 	 */
 	@Override
 	public ValueSpecification basicGetMin() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.TIME_INTERVAL__MIN - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MIN, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.TIME_INTERVAL__MIN - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MIN, false, true);
 	}
 
 	/**
@@ -142,11 +139,9 @@
 	@Override
 	public void setMin(ValueSpecification newMin) {
 		if (newMin != null && !(newMin instanceof TimeExpression)) {
-			throw new IllegalArgumentException(
-				"newMin must be an instance of TimeExpression"); //$NON-NLS-1$
+			throw new IllegalArgumentException("newMin must be an instance of TimeExpression"); //$NON-NLS-1$
 		}
-		eDynamicSet(UMLPackage.TIME_INTERVAL__MIN - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.INTERVAL__MIN, newMin);
+		eDynamicSet(UMLPackage.TIME_INTERVAL__MIN - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.INTERVAL__MIN, newMin);
 	}
 
 	/**
@@ -166,52 +161,52 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.TIME_INTERVAL__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.TIME_INTERVAL__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.TIME_INTERVAL__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.TIME_INTERVAL__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.TIME_INTERVAL__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.TIME_INTERVAL__NAME :
-				return getName();
-			case UMLPackage.TIME_INTERVAL__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.TIME_INTERVAL__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.TIME_INTERVAL__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TIME_INTERVAL__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.TIME_INTERVAL__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.TIME_INTERVAL__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.TIME_INTERVAL__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.TIME_INTERVAL__MAX :
-				if (resolve)
-					return getMax();
-				return basicGetMax();
-			case UMLPackage.TIME_INTERVAL__MIN :
-				if (resolve)
-					return getMin();
-				return basicGetMin();
+		case UMLPackage.TIME_INTERVAL__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.TIME_INTERVAL__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.TIME_INTERVAL__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.TIME_INTERVAL__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.TIME_INTERVAL__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.TIME_INTERVAL__NAME:
+			return getName();
+		case UMLPackage.TIME_INTERVAL__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.TIME_INTERVAL__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.TIME_INTERVAL__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TIME_INTERVAL__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.TIME_INTERVAL__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.TIME_INTERVAL__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.TIME_INTERVAL__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.TIME_INTERVAL__MAX:
+			if (resolve)
+				return getMax();
+			return basicGetMax();
+		case UMLPackage.TIME_INTERVAL__MIN:
+			if (resolve)
+				return getMin();
+			return basicGetMin();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -225,40 +220,38 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.TIME_INTERVAL__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.TIME_INTERVAL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.TIME_INTERVAL__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.TIME_INTERVAL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.TIME_INTERVAL__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.TIME_INTERVAL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.TIME_INTERVAL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.TIME_INTERVAL__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.TIME_INTERVAL__MAX :
-				setMax((ValueSpecification) newValue);
-				return;
-			case UMLPackage.TIME_INTERVAL__MIN :
-				setMin((ValueSpecification) newValue);
-				return;
+		case UMLPackage.TIME_INTERVAL__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.TIME_INTERVAL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.TIME_INTERVAL__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.TIME_INTERVAL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.TIME_INTERVAL__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.TIME_INTERVAL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.TIME_INTERVAL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.TIME_INTERVAL__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.TIME_INTERVAL__MAX:
+			setMax((ValueSpecification) newValue);
+			return;
+		case UMLPackage.TIME_INTERVAL__MIN:
+			setMin((ValueSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -271,36 +264,36 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TIME_INTERVAL__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.TIME_INTERVAL__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.TIME_INTERVAL__NAME :
-				unsetName();
-				return;
-			case UMLPackage.TIME_INTERVAL__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.TIME_INTERVAL__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.TIME_INTERVAL__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.TIME_INTERVAL__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.TIME_INTERVAL__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.TIME_INTERVAL__MAX :
-				setMax((ValueSpecification) null);
-				return;
-			case UMLPackage.TIME_INTERVAL__MIN :
-				setMin((ValueSpecification) null);
-				return;
+		case UMLPackage.TIME_INTERVAL__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.TIME_INTERVAL__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.TIME_INTERVAL__NAME:
+			unsetName();
+			return;
+		case UMLPackage.TIME_INTERVAL__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.TIME_INTERVAL__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.TIME_INTERVAL__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.TIME_INTERVAL__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.TIME_INTERVAL__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.TIME_INTERVAL__MAX:
+			setMax((ValueSpecification) null);
+			return;
+		case UMLPackage.TIME_INTERVAL__MIN:
+			setMin((ValueSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -313,38 +306,36 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TIME_INTERVAL__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.TIME_INTERVAL__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.TIME_INTERVAL__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.TIME_INTERVAL__OWNER :
-				return isSetOwner();
-			case UMLPackage.TIME_INTERVAL__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.TIME_INTERVAL__NAME :
-				return isSetName();
-			case UMLPackage.TIME_INTERVAL__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.TIME_INTERVAL__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.TIME_INTERVAL__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.TIME_INTERVAL__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.TIME_INTERVAL__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.TIME_INTERVAL__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.TIME_INTERVAL__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.TIME_INTERVAL__MAX :
-				return isSetMax();
-			case UMLPackage.TIME_INTERVAL__MIN :
-				return isSetMin();
+		case UMLPackage.TIME_INTERVAL__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.TIME_INTERVAL__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.TIME_INTERVAL__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.TIME_INTERVAL__OWNER:
+			return isSetOwner();
+		case UMLPackage.TIME_INTERVAL__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.TIME_INTERVAL__NAME:
+			return isSetName();
+		case UMLPackage.TIME_INTERVAL__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.TIME_INTERVAL__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.TIME_INTERVAL__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.TIME_INTERVAL__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.TIME_INTERVAL__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.TIME_INTERVAL__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.TIME_INTERVAL__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.TIME_INTERVAL__MAX:
+			return isSetMax();
+		case UMLPackage.TIME_INTERVAL__MIN:
+			return isSetMin();
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeObservationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeObservationImpl.java
index 0a08e17..5610e19 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeObservationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TimeObservationImpl.java
@@ -1,23 +1,29 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
- *   Kenn Hussey - 519572
+ *   Kenn Hussey - 519572, 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.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.NamedElement;
 import org.eclipse.uml2.uml.StringExpression;
@@ -79,9 +85,7 @@
 	 * @generated
 	 */
 	public NamedElement getEvent() {
-		return (NamedElement) eDynamicGet(
-			UMLPackage.TIME_OBSERVATION__EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_OBSERVATION__EVENT, true, true);
+		return (NamedElement) eDynamicGet(UMLPackage.TIME_OBSERVATION__EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_OBSERVATION__EVENT, true, true);
 	}
 
 	/**
@@ -90,9 +94,7 @@
 	 * @generated
 	 */
 	public NamedElement basicGetEvent() {
-		return (NamedElement) eDynamicGet(
-			UMLPackage.TIME_OBSERVATION__EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_OBSERVATION__EVENT, false, true);
+		return (NamedElement) eDynamicGet(UMLPackage.TIME_OBSERVATION__EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_OBSERVATION__EVENT, false, true);
 	}
 
 	/**
@@ -101,8 +103,7 @@
 	 * @generated
 	 */
 	public void setEvent(NamedElement newEvent) {
-		eDynamicSet(UMLPackage.TIME_OBSERVATION__EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_OBSERVATION__EVENT, newEvent);
+		eDynamicSet(UMLPackage.TIME_OBSERVATION__EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_OBSERVATION__EVENT, newEvent);
 	}
 
 	/**
@@ -111,9 +112,7 @@
 	 * @generated
 	 */
 	public boolean isFirstEvent() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.TIME_OBSERVATION__FIRST_EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_OBSERVATION__FIRST_EVENT, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.TIME_OBSERVATION__FIRST_EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_OBSERVATION__FIRST_EVENT, true, true);
 	}
 
 	/**
@@ -122,9 +121,7 @@
 	 * @generated
 	 */
 	public void setFirstEvent(boolean newFirstEvent) {
-		eDynamicSet(
-			UMLPackage.TIME_OBSERVATION__FIRST_EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TIME_OBSERVATION__FIRST_EVENT, newFirstEvent);
+		eDynamicSet(UMLPackage.TIME_OBSERVATION__FIRST_EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TIME_OBSERVATION__FIRST_EVENT, newFirstEvent);
 	}
 
 	/**
@@ -135,46 +132,46 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.TIME_OBSERVATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.TIME_OBSERVATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.TIME_OBSERVATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.TIME_OBSERVATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.TIME_OBSERVATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.TIME_OBSERVATION__NAME :
-				return getName();
-			case UMLPackage.TIME_OBSERVATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.TIME_OBSERVATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.TIME_OBSERVATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TIME_OBSERVATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.TIME_OBSERVATION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.TIME_OBSERVATION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.TIME_OBSERVATION__EVENT :
-				if (resolve)
-					return getEvent();
-				return basicGetEvent();
-			case UMLPackage.TIME_OBSERVATION__FIRST_EVENT :
-				return isFirstEvent();
+		case UMLPackage.TIME_OBSERVATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.TIME_OBSERVATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.TIME_OBSERVATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.TIME_OBSERVATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.TIME_OBSERVATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.TIME_OBSERVATION__NAME:
+			return getName();
+		case UMLPackage.TIME_OBSERVATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.TIME_OBSERVATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.TIME_OBSERVATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TIME_OBSERVATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.TIME_OBSERVATION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.TIME_OBSERVATION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.TIME_OBSERVATION__EVENT:
+			if (resolve)
+				return getEvent();
+			return basicGetEvent();
+		case UMLPackage.TIME_OBSERVATION__FIRST_EVENT:
+			return isFirstEvent();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -188,37 +185,35 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.TIME_OBSERVATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.TIME_OBSERVATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.TIME_OBSERVATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.TIME_OBSERVATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.TIME_OBSERVATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.TIME_OBSERVATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.TIME_OBSERVATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.TIME_OBSERVATION__EVENT :
-				setEvent((NamedElement) newValue);
-				return;
-			case UMLPackage.TIME_OBSERVATION__FIRST_EVENT :
-				setFirstEvent((Boolean) newValue);
-				return;
+		case UMLPackage.TIME_OBSERVATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.TIME_OBSERVATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.TIME_OBSERVATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.TIME_OBSERVATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.TIME_OBSERVATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.TIME_OBSERVATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.TIME_OBSERVATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.TIME_OBSERVATION__EVENT:
+			setEvent((NamedElement) newValue);
+			return;
+		case UMLPackage.TIME_OBSERVATION__FIRST_EVENT:
+			setFirstEvent((Boolean) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -231,33 +226,33 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TIME_OBSERVATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.TIME_OBSERVATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.TIME_OBSERVATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.TIME_OBSERVATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.TIME_OBSERVATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.TIME_OBSERVATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.TIME_OBSERVATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.TIME_OBSERVATION__EVENT :
-				setEvent((NamedElement) null);
-				return;
-			case UMLPackage.TIME_OBSERVATION__FIRST_EVENT :
-				setFirstEvent(FIRST_EVENT_EDEFAULT);
-				return;
+		case UMLPackage.TIME_OBSERVATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.TIME_OBSERVATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.TIME_OBSERVATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.TIME_OBSERVATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.TIME_OBSERVATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.TIME_OBSERVATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.TIME_OBSERVATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.TIME_OBSERVATION__EVENT:
+			setEvent((NamedElement) null);
+			return;
+		case UMLPackage.TIME_OBSERVATION__FIRST_EVENT:
+			setFirstEvent(FIRST_EVENT_EDEFAULT);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -270,36 +265,34 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TIME_OBSERVATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.TIME_OBSERVATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.TIME_OBSERVATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.TIME_OBSERVATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.TIME_OBSERVATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.TIME_OBSERVATION__NAME :
-				return isSetName();
-			case UMLPackage.TIME_OBSERVATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.TIME_OBSERVATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.TIME_OBSERVATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.TIME_OBSERVATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.TIME_OBSERVATION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.TIME_OBSERVATION__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.TIME_OBSERVATION__EVENT :
-				return basicGetEvent() != null;
-			case UMLPackage.TIME_OBSERVATION__FIRST_EVENT :
-				return isFirstEvent() != FIRST_EVENT_EDEFAULT;
+		case UMLPackage.TIME_OBSERVATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.TIME_OBSERVATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.TIME_OBSERVATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.TIME_OBSERVATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.TIME_OBSERVATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.TIME_OBSERVATION__NAME:
+			return isSetName();
+		case UMLPackage.TIME_OBSERVATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.TIME_OBSERVATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.TIME_OBSERVATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.TIME_OBSERVATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.TIME_OBSERVATION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.TIME_OBSERVATION__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.TIME_OBSERVATION__EVENT:
+			return basicGetEvent() != null;
+		case UMLPackage.TIME_OBSERVATION__FIRST_EVENT:
+			return isFirstEvent() != FIRST_EVENT_EDEFAULT;
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TransitionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TransitionImpl.java
index 6f09727..76d9155 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TransitionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TransitionImpl.java
@@ -1,25 +1,28 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
+ *   Eike Stepper - 540786
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
 
 import java.lang.reflect.InvocationTargetException;
+
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -30,15 +33,19 @@
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.EcoreEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
 import org.eclipse.uml2.common.util.DerivedUnionEObjectEList;
-
 import org.eclipse.uml2.uml.cdo.internal.util.SubsetSupersetEObjectContainmentWithInverseEList;
+
 import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.Classifier;
 import org.eclipse.uml2.uml.Comment;
@@ -133,17 +140,9 @@
 		return UMLPackage.Literals.TRANSITION;
 	}
 
-	@Override
-	protected EList<?> createList(EStructuralFeature eStructuralFeature) {
-		EList<?> result = createSpecialList(eStructuralFeature);
-		if (result != null) {
-			return result;
-		}
-		
-		return super.createList(eStructuralFeature);
-	}
-	
-	private EList<?> createSpecialList(EStructuralFeature eStructuralFeature) {
+	@SuppressWarnings("unused")
+	private EList<?> createSubsetSupersetList(
+			EStructuralFeature eStructuralFeature) {
 		if (eStructuralFeature == UMLPackage.Literals.NAMESPACE__OWNED_RULE) {
 			return createOwnedRulesList();
 		}
@@ -161,23 +160,14 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<RedefinableElement> redefinedElements = (EList<RedefinableElement>) cache
-				.get(eResource, this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT);
+			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>(
-						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>(
-			RedefinableElement.class, this,
-			UMLPackage.TRANSITION__REDEFINED_ELEMENT,
-			REDEFINED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<RedefinableElement>(RedefinableElement.class, this, UMLPackage.TRANSITION__REDEFINED_ELEMENT, REDEFINED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -191,20 +181,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.TRANSITION__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TRANSITION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.TRANSITION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.TRANSITION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -215,15 +198,13 @@
 	@Override
 	@SuppressWarnings("unchecked")
 	public EList<Constraint> getOwnedRules() {
-		return (EList<Constraint>) eDynamicGet(
-			UMLPackage.TRANSITION__OWNED_RULE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.NAMESPACE__OWNED_RULE, true, true);
+		return (EList<Constraint>) eDynamicGet(UMLPackage.TRANSITION__OWNED_RULE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.NAMESPACE__OWNED_RULE, true, true);
 	}
 
 	private EList<Constraint> createOwnedRulesList() {
 		return new SubsetSupersetEObjectContainmentWithInverseEList.Resolving<Constraint>(
-			Constraint.class, this, UMLPackage.TRANSITION__OWNED_RULE, null,
-			OWNED_RULE_ESUBSETS, UMLPackage.CONSTRAINT__CONTEXT);
+				Constraint.class, this, UMLPackage.TRANSITION__OWNED_RULE, null,
+				OWNED_RULE_ESUBSETS, UMLPackage.CONSTRAINT__CONTEXT);
 	}
 
 	/**
@@ -237,20 +218,20 @@
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
 			EList<Classifier> result = (EList<Classifier>) cache.get(this,
-				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
+					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT);
 
 			if (result == null) {
 				Classifier redefinitionContext = redefinitionContext();
 				List<Classifier> redefinitionContexts = redefinitionContext == null
-					? Collections.<Classifier> emptyList()
-					: Collections
-						.<Classifier> singletonList(redefinitionContext);
+						? Collections.<Classifier> emptyList()
+						: Collections
+								.<Classifier> singletonList(redefinitionContext);
 				cache.put(this,
-					UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-					result = new EcoreEList.UnmodifiableEList<Classifier>(this,
 						UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-						redefinitionContexts.size(),
-						redefinitionContexts.toArray()));
+						result = new EcoreEList.UnmodifiableEList<Classifier>(this,
+								UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
+								redefinitionContexts.size(),
+								redefinitionContexts.toArray()));
 			}
 
 			return result;
@@ -258,11 +239,11 @@
 
 		Classifier redefinitionContext = redefinitionContext();
 		List<Classifier> redefinitionContexts = redefinitionContext == null
-			? Collections.<Classifier> emptyList()
-			: Collections.singletonList(redefinitionContext);
+				? Collections.<Classifier> emptyList()
+				: Collections.singletonList(redefinitionContext);
 		return new EcoreEList.UnmodifiableEList<Classifier>(this,
-			UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
-			redefinitionContexts.size(), redefinitionContexts.toArray());
+				UMLPackage.Literals.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT,
+				redefinitionContexts.size(), redefinitionContexts.toArray());
 	}
 
 	/**
@@ -281,12 +262,10 @@
 	 */
 	public Classifier getRedefinitionContext(String name, boolean ignoreCase,
 			EClass eClass) {
-		redefinitionContextLoop : for (Classifier redefinitionContext : getRedefinitionContexts()) {
+		redefinitionContextLoop: for (Classifier redefinitionContext : getRedefinitionContexts()) {
 			if (eClass != null && !eClass.isInstance(redefinitionContext))
 				continue redefinitionContextLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinitionContext.getName())
-				: name.equals(redefinitionContext.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinitionContext.getName()) : name.equals(redefinitionContext.getName())))
 				continue redefinitionContextLoop;
 			return redefinitionContext;
 		}
@@ -308,9 +287,7 @@
 	 * @generated
 	 */
 	public boolean isLeaf() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.TRANSITION__IS_LEAF - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.TRANSITION__IS_LEAF - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, true, true);
 	}
 
 	/**
@@ -319,8 +296,7 @@
 	 * @generated
 	 */
 	public void setIsLeaf(boolean newIsLeaf) {
-		eDynamicSet(UMLPackage.TRANSITION__IS_LEAF - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, newIsLeaf);
+		eDynamicSet(UMLPackage.TRANSITION__IS_LEAF - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.REDEFINABLE_ELEMENT__IS_LEAF, newIsLeaf);
 	}
 
 	/**
@@ -331,9 +307,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -342,9 +316,7 @@
 	 * @generated
 	 */
 	public TransitionKind getKind() {
-		return (TransitionKind) eDynamicGet(
-			UMLPackage.TRANSITION__KIND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__KIND, true, true);
+		return (TransitionKind) eDynamicGet(UMLPackage.TRANSITION__KIND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__KIND, true, true);
 	}
 
 	/**
@@ -353,8 +325,7 @@
 	 * @generated
 	 */
 	public void setKind(TransitionKind newKind) {
-		eDynamicSet(UMLPackage.TRANSITION__KIND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__KIND, newKind);
+		eDynamicSet(UMLPackage.TRANSITION__KIND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__KIND, newKind);
 	}
 
 	/**
@@ -363,9 +334,7 @@
 	 * @generated
 	 */
 	public Region getContainer() {
-		return (Region) eDynamicGet(
-			UMLPackage.TRANSITION__CONTAINER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__CONTAINER, true, true);
+		return (Region) eDynamicGet(UMLPackage.TRANSITION__CONTAINER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__CONTAINER, true, true);
 	}
 
 	/**
@@ -374,9 +343,7 @@
 	 * @generated
 	 */
 	public Region basicGetContainer() {
-		return (Region) eDynamicGet(
-			UMLPackage.TRANSITION__CONTAINER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__CONTAINER, false, true);
+		return (Region) eDynamicGet(UMLPackage.TRANSITION__CONTAINER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__CONTAINER, false, true);
 	}
 
 	/**
@@ -386,8 +353,7 @@
 	 */
 	public NotificationChain basicSetContainer(Region newContainer,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newContainer,
-			UMLPackage.TRANSITION__CONTAINER, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newContainer, UMLPackage.TRANSITION__CONTAINER, msgs);
 		return msgs;
 	}
 
@@ -397,8 +363,7 @@
 	 * @generated
 	 */
 	public void setContainer(Region newContainer) {
-		eDynamicSet(UMLPackage.TRANSITION__CONTAINER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__CONTAINER, newContainer);
+		eDynamicSet(UMLPackage.TRANSITION__CONTAINER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__CONTAINER, newContainer);
 	}
 
 	/**
@@ -407,9 +372,7 @@
 	 * @generated
 	 */
 	public Vertex getTarget() {
-		return (Vertex) eDynamicGet(
-			UMLPackage.TRANSITION__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__TARGET, true, true);
+		return (Vertex) eDynamicGet(UMLPackage.TRANSITION__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__TARGET, true, true);
 	}
 
 	/**
@@ -418,9 +381,7 @@
 	 * @generated
 	 */
 	public Vertex basicGetTarget() {
-		return (Vertex) eDynamicGet(
-			UMLPackage.TRANSITION__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__TARGET, false, true);
+		return (Vertex) eDynamicGet(UMLPackage.TRANSITION__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__TARGET, false, true);
 	}
 
 	/**
@@ -429,8 +390,7 @@
 	 * @generated
 	 */
 	public void setTarget(Vertex newTarget) {
-		eDynamicSet(UMLPackage.TRANSITION__TARGET - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__TARGET, newTarget);
+		eDynamicSet(UMLPackage.TRANSITION__TARGET - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__TARGET, newTarget);
 	}
 
 	/**
@@ -439,9 +399,7 @@
 	 * @generated
 	 */
 	public Transition getRedefinedTransition() {
-		return (Transition) eDynamicGet(
-			UMLPackage.TRANSITION__REDEFINED_TRANSITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__REDEFINED_TRANSITION, true, true);
+		return (Transition) eDynamicGet(UMLPackage.TRANSITION__REDEFINED_TRANSITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__REDEFINED_TRANSITION, true, true);
 	}
 
 	/**
@@ -450,9 +408,7 @@
 	 * @generated
 	 */
 	public Transition basicGetRedefinedTransition() {
-		return (Transition) eDynamicGet(
-			UMLPackage.TRANSITION__REDEFINED_TRANSITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__REDEFINED_TRANSITION, false, true);
+		return (Transition) eDynamicGet(UMLPackage.TRANSITION__REDEFINED_TRANSITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__REDEFINED_TRANSITION, false, true);
 	}
 
 	/**
@@ -461,10 +417,7 @@
 	 * @generated
 	 */
 	public void setRedefinedTransition(Transition newRedefinedTransition) {
-		eDynamicSet(
-			UMLPackage.TRANSITION__REDEFINED_TRANSITION - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__REDEFINED_TRANSITION,
-			newRedefinedTransition);
+		eDynamicSet(UMLPackage.TRANSITION__REDEFINED_TRANSITION - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__REDEFINED_TRANSITION, newRedefinedTransition);
 	}
 
 	/**
@@ -473,9 +426,7 @@
 	 * @generated
 	 */
 	public Constraint getGuard() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.TRANSITION__GUARD - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__GUARD, true, true);
+		return (Constraint) eDynamicGet(UMLPackage.TRANSITION__GUARD - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__GUARD, true, true);
 	}
 
 	/**
@@ -484,9 +435,7 @@
 	 * @generated
 	 */
 	public Constraint basicGetGuard() {
-		return (Constraint) eDynamicGet(
-			UMLPackage.TRANSITION__GUARD - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__GUARD, false, true);
+		return (Constraint) eDynamicGet(UMLPackage.TRANSITION__GUARD - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__GUARD, false, true);
 	}
 
 	/**
@@ -495,8 +444,7 @@
 	 * @generated
 	 */
 	public void setGuard(Constraint newGuard) {
-		eDynamicSet(UMLPackage.TRANSITION__GUARD - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__GUARD, newGuard);
+		eDynamicSet(UMLPackage.TRANSITION__GUARD - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__GUARD, newGuard);
 		Resource.Internal eInternalResource = eInternalResource();
 		if (eInternalResource == null || !eInternalResource.isLoading()) {
 			if (newGuard != null) {
@@ -536,9 +484,7 @@
 	 * @generated
 	 */
 	public Behavior getEffect() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.TRANSITION__EFFECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__EFFECT, true, true);
+		return (Behavior) eDynamicGet(UMLPackage.TRANSITION__EFFECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__EFFECT, true, true);
 	}
 
 	/**
@@ -547,9 +493,7 @@
 	 * @generated
 	 */
 	public Behavior basicGetEffect() {
-		return (Behavior) eDynamicGet(
-			UMLPackage.TRANSITION__EFFECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__EFFECT, false, true);
+		return (Behavior) eDynamicGet(UMLPackage.TRANSITION__EFFECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__EFFECT, false, true);
 	}
 
 	/**
@@ -559,8 +503,7 @@
 	 */
 	public NotificationChain basicSetEffect(Behavior newEffect,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newEffect,
-			UMLPackage.TRANSITION__EFFECT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newEffect, UMLPackage.TRANSITION__EFFECT, msgs);
 		return msgs;
 	}
 
@@ -570,8 +513,7 @@
 	 * @generated
 	 */
 	public void setEffect(Behavior newEffect) {
-		eDynamicSet(UMLPackage.TRANSITION__EFFECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__EFFECT, newEffect);
+		eDynamicSet(UMLPackage.TRANSITION__EFFECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__EFFECT, newEffect);
 	}
 
 	/**
@@ -594,9 +536,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Trigger> getTriggers() {
-		return (EList<Trigger>) eDynamicGet(
-			UMLPackage.TRANSITION__TRIGGER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__TRIGGER, true, true);
+		return (EList<Trigger>) eDynamicGet(UMLPackage.TRANSITION__TRIGGER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__TRIGGER, true, true);
 	}
 
 	/**
@@ -628,16 +568,12 @@
 	 */
 	public Trigger getTrigger(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		triggerLoop : for (Trigger trigger : getTriggers()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(trigger.getName())
-				: name.equals(trigger.getName())))
+		triggerLoop: for (Trigger trigger : getTriggers()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(trigger.getName()) : name.equals(trigger.getName())))
 				continue triggerLoop;
 			return trigger;
 		}
-		return createOnDemand
-			? createTrigger(name)
-			: null;
+		return createOnDemand ? createTrigger(name) : null;
 	}
 
 	/**
@@ -646,9 +582,7 @@
 	 * @generated
 	 */
 	public Vertex getSource() {
-		return (Vertex) eDynamicGet(
-			UMLPackage.TRANSITION__SOURCE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__SOURCE, true, true);
+		return (Vertex) eDynamicGet(UMLPackage.TRANSITION__SOURCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__SOURCE, true, true);
 	}
 
 	/**
@@ -657,9 +591,7 @@
 	 * @generated
 	 */
 	public Vertex basicGetSource() {
-		return (Vertex) eDynamicGet(
-			UMLPackage.TRANSITION__SOURCE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__SOURCE, false, true);
+		return (Vertex) eDynamicGet(UMLPackage.TRANSITION__SOURCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__SOURCE, false, true);
 	}
 
 	/**
@@ -668,8 +600,7 @@
 	 * @generated
 	 */
 	public void setSource(Vertex newSource) {
-		eDynamicSet(UMLPackage.TRANSITION__SOURCE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRANSITION__SOURCE, newSource);
+		eDynamicSet(UMLPackage.TRANSITION__SOURCE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRANSITION__SOURCE, newSource);
 	}
 
 	/**
@@ -679,8 +610,7 @@
 	 */
 	public boolean validateRedefinitionContextValid(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations
-			.validateRedefinitionContextValid(this, diagnostics, context);
+		return RedefinableElementOperations.validateRedefinitionContextValid(this, diagnostics, context);
 	}
 
 	/**
@@ -690,8 +620,7 @@
 	 */
 	public boolean validateRedefinitionConsistent(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations.validateRedefinitionConsistent(this,
-			diagnostics, context);
+		return RedefinableElementOperations.validateRedefinitionConsistent(this, diagnostics, context);
 	}
 
 	/**
@@ -701,8 +630,7 @@
 	 */
 	public boolean validateNonLeafRedefinition(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return RedefinableElementOperations.validateNonLeafRedefinition(this,
-			diagnostics, context);
+		return RedefinableElementOperations.validateNonLeafRedefinition(this, diagnostics, context);
 	}
 
 	/**
@@ -712,8 +640,7 @@
 	 */
 	public boolean validateForkSegmentGuards(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TransitionOperations.validateForkSegmentGuards(this, diagnostics,
-			context);
+		return TransitionOperations.validateForkSegmentGuards(this, diagnostics, context);
 	}
 
 	/**
@@ -723,8 +650,7 @@
 	 */
 	public boolean validateJoinSegmentGuards(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TransitionOperations.validateJoinSegmentGuards(this, diagnostics,
-			context);
+		return TransitionOperations.validateJoinSegmentGuards(this, diagnostics, context);
 	}
 
 	/**
@@ -734,8 +660,7 @@
 	 */
 	public boolean validateStateIsInternal(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TransitionOperations.validateStateIsInternal(this, diagnostics,
-			context);
+		return TransitionOperations.validateStateIsInternal(this, diagnostics, context);
 	}
 
 	/**
@@ -745,8 +670,7 @@
 	 */
 	public boolean validateForkSegmentState(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TransitionOperations.validateForkSegmentState(this, diagnostics,
-			context);
+		return TransitionOperations.validateForkSegmentState(this, diagnostics, context);
 	}
 
 	/**
@@ -756,8 +680,7 @@
 	 */
 	public boolean validateJoinSegmentState(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TransitionOperations.validateJoinSegmentState(this, diagnostics,
-			context);
+		return TransitionOperations.validateJoinSegmentState(this, diagnostics, context);
 	}
 
 	/**
@@ -767,8 +690,7 @@
 	 */
 	public boolean validateOutgoingPseudostates(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TransitionOperations.validateOutgoingPseudostates(this,
-			diagnostics, context);
+		return TransitionOperations.validateOutgoingPseudostates(this, diagnostics, context);
 	}
 
 	/**
@@ -778,8 +700,7 @@
 	 */
 	public boolean validateInitialTransition(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TransitionOperations.validateInitialTransition(this, diagnostics,
-			context);
+		return TransitionOperations.validateInitialTransition(this, diagnostics, context);
 	}
 
 	/**
@@ -789,8 +710,7 @@
 	 */
 	public boolean validateStateIsLocal(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TransitionOperations.validateStateIsLocal(this, diagnostics,
-			context);
+		return TransitionOperations.validateStateIsLocal(this, diagnostics, context);
 	}
 
 	/**
@@ -827,8 +747,7 @@
 	 */
 	public boolean isRedefinitionContextValid(
 			RedefinableElement redefinedElement) {
-		return RedefinableElementOperations.isRedefinitionContextValid(this,
-			redefinedElement);
+		return RedefinableElementOperations.isRedefinitionContextValid(this, redefinedElement);
 	}
 
 	/**
@@ -838,8 +757,7 @@
 	 */
 	public boolean validateStateIsExternal(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TransitionOperations.validateStateIsExternal(this, diagnostics,
-			context);
+		return TransitionOperations.validateStateIsExternal(this, diagnostics, context);
 	}
 
 	/**
@@ -852,22 +770,18 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TRANSITION__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.TRANSITION__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.TRANSITION__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.TRANSITION__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.TRANSITION__CONTAINER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetContainer((Region) otherEnd, msgs);
+		case UMLPackage.TRANSITION__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.TRANSITION__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.TRANSITION__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.TRANSITION__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.TRANSITION__CONTAINER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetContainer((Region) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -881,30 +795,24 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.TRANSITION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TRANSITION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TRANSITION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.TRANSITION__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TRANSITION__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TRANSITION__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.TRANSITION__EFFECT :
-				return basicSetEffect(null, msgs);
-			case UMLPackage.TRANSITION__TRIGGER :
-				return ((InternalEList<?>) getTriggers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.TRANSITION__CONTAINER :
-				return basicSetContainer(null, msgs);
+		case UMLPackage.TRANSITION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TRANSITION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TRANSITION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.TRANSITION__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TRANSITION__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TRANSITION__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TRANSITION__EFFECT:
+			return basicSetEffect(null, msgs);
+		case UMLPackage.TRANSITION__TRIGGER:
+			return ((InternalEList<?>) getTriggers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.TRANSITION__CONTAINER:
+			return basicSetContainer(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -918,9 +826,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.TRANSITION__CONTAINER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.REGION__TRANSITION, Region.class, msgs);
+		case UMLPackage.TRANSITION__CONTAINER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.REGION__TRANSITION, Region.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -933,78 +840,78 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.TRANSITION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.TRANSITION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.TRANSITION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.TRANSITION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.TRANSITION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.TRANSITION__NAME :
-				return getName();
-			case UMLPackage.TRANSITION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.TRANSITION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.TRANSITION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TRANSITION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.TRANSITION__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.TRANSITION__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.TRANSITION__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.TRANSITION__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.TRANSITION__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.TRANSITION__MEMBER :
-				return getMembers();
-			case UMLPackage.TRANSITION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.TRANSITION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.TRANSITION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.TRANSITION__EFFECT :
-				if (resolve)
-					return getEffect();
-				return basicGetEffect();
-			case UMLPackage.TRANSITION__GUARD :
-				if (resolve)
-					return getGuard();
-				return basicGetGuard();
-			case UMLPackage.TRANSITION__KIND :
-				return getKind();
-			case UMLPackage.TRANSITION__REDEFINED_TRANSITION :
-				if (resolve)
-					return getRedefinedTransition();
-				return basicGetRedefinedTransition();
-			case UMLPackage.TRANSITION__SOURCE :
-				if (resolve)
-					return getSource();
-				return basicGetSource();
-			case UMLPackage.TRANSITION__TARGET :
-				if (resolve)
-					return getTarget();
-				return basicGetTarget();
-			case UMLPackage.TRANSITION__TRIGGER :
-				return getTriggers();
-			case UMLPackage.TRANSITION__CONTAINER :
-				if (resolve)
-					return getContainer();
-				return basicGetContainer();
+		case UMLPackage.TRANSITION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.TRANSITION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.TRANSITION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.TRANSITION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.TRANSITION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.TRANSITION__NAME:
+			return getName();
+		case UMLPackage.TRANSITION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.TRANSITION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.TRANSITION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TRANSITION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.TRANSITION__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.TRANSITION__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.TRANSITION__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.TRANSITION__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.TRANSITION__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.TRANSITION__MEMBER:
+			return getMembers();
+		case UMLPackage.TRANSITION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.TRANSITION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.TRANSITION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.TRANSITION__EFFECT:
+			if (resolve)
+				return getEffect();
+			return basicGetEffect();
+		case UMLPackage.TRANSITION__GUARD:
+			if (resolve)
+				return getGuard();
+			return basicGetGuard();
+		case UMLPackage.TRANSITION__KIND:
+			return getKind();
+		case UMLPackage.TRANSITION__REDEFINED_TRANSITION:
+			if (resolve)
+				return getRedefinedTransition();
+			return basicGetRedefinedTransition();
+		case UMLPackage.TRANSITION__SOURCE:
+			if (resolve)
+				return getSource();
+			return basicGetSource();
+		case UMLPackage.TRANSITION__TARGET:
+			if (resolve)
+				return getTarget();
+			return basicGetTarget();
+		case UMLPackage.TRANSITION__TRIGGER:
+			return getTriggers();
+		case UMLPackage.TRANSITION__CONTAINER:
+			if (resolve)
+				return getContainer();
+			return basicGetContainer();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -1018,68 +925,63 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.TRANSITION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.TRANSITION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.TRANSITION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.TRANSITION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.TRANSITION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.TRANSITION__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.TRANSITION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.TRANSITION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.TRANSITION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.TRANSITION__EFFECT :
-				setEffect((Behavior) newValue);
-				return;
-			case UMLPackage.TRANSITION__GUARD :
-				setGuard((Constraint) newValue);
-				return;
-			case UMLPackage.TRANSITION__KIND :
-				setKind((TransitionKind) newValue);
-				return;
-			case UMLPackage.TRANSITION__REDEFINED_TRANSITION :
-				setRedefinedTransition((Transition) newValue);
-				return;
-			case UMLPackage.TRANSITION__SOURCE :
-				setSource((Vertex) newValue);
-				return;
-			case UMLPackage.TRANSITION__TARGET :
-				setTarget((Vertex) newValue);
-				return;
-			case UMLPackage.TRANSITION__TRIGGER :
-				getTriggers().clear();
-				getTriggers().addAll((Collection<? extends Trigger>) newValue);
-				return;
-			case UMLPackage.TRANSITION__CONTAINER :
-				setContainer((Region) newValue);
-				return;
+		case UMLPackage.TRANSITION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.TRANSITION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.TRANSITION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.TRANSITION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.TRANSITION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.TRANSITION__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.TRANSITION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.TRANSITION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.TRANSITION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.TRANSITION__EFFECT:
+			setEffect((Behavior) newValue);
+			return;
+		case UMLPackage.TRANSITION__GUARD:
+			setGuard((Constraint) newValue);
+			return;
+		case UMLPackage.TRANSITION__KIND:
+			setKind((TransitionKind) newValue);
+			return;
+		case UMLPackage.TRANSITION__REDEFINED_TRANSITION:
+			setRedefinedTransition((Transition) newValue);
+			return;
+		case UMLPackage.TRANSITION__SOURCE:
+			setSource((Vertex) newValue);
+			return;
+		case UMLPackage.TRANSITION__TARGET:
+			setTarget((Vertex) newValue);
+			return;
+		case UMLPackage.TRANSITION__TRIGGER:
+			getTriggers().clear();
+			getTriggers().addAll((Collection<? extends Trigger>) newValue);
+			return;
+		case UMLPackage.TRANSITION__CONTAINER:
+			setContainer((Region) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -1092,57 +994,57 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TRANSITION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.TRANSITION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.TRANSITION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.TRANSITION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.TRANSITION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.TRANSITION__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.TRANSITION__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.TRANSITION__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.TRANSITION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.TRANSITION__EFFECT :
-				setEffect((Behavior) null);
-				return;
-			case UMLPackage.TRANSITION__GUARD :
-				setGuard((Constraint) null);
-				return;
-			case UMLPackage.TRANSITION__KIND :
-				setKind(KIND_EDEFAULT);
-				return;
-			case UMLPackage.TRANSITION__REDEFINED_TRANSITION :
-				setRedefinedTransition((Transition) null);
-				return;
-			case UMLPackage.TRANSITION__SOURCE :
-				setSource((Vertex) null);
-				return;
-			case UMLPackage.TRANSITION__TARGET :
-				setTarget((Vertex) null);
-				return;
-			case UMLPackage.TRANSITION__TRIGGER :
-				getTriggers().clear();
-				return;
-			case UMLPackage.TRANSITION__CONTAINER :
-				setContainer((Region) null);
-				return;
+		case UMLPackage.TRANSITION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.TRANSITION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.TRANSITION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.TRANSITION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.TRANSITION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.TRANSITION__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.TRANSITION__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.TRANSITION__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.TRANSITION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.TRANSITION__EFFECT:
+			setEffect((Behavior) null);
+			return;
+		case UMLPackage.TRANSITION__GUARD:
+			setGuard((Constraint) null);
+			return;
+		case UMLPackage.TRANSITION__KIND:
+			setKind(KIND_EDEFAULT);
+			return;
+		case UMLPackage.TRANSITION__REDEFINED_TRANSITION:
+			setRedefinedTransition((Transition) null);
+			return;
+		case UMLPackage.TRANSITION__SOURCE:
+			setSource((Vertex) null);
+			return;
+		case UMLPackage.TRANSITION__TARGET:
+			setTarget((Vertex) null);
+			return;
+		case UMLPackage.TRANSITION__TRIGGER:
+			getTriggers().clear();
+			return;
+		case UMLPackage.TRANSITION__CONTAINER:
+			setContainer((Region) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -1155,62 +1057,60 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TRANSITION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.TRANSITION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.TRANSITION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.TRANSITION__OWNER :
-				return isSetOwner();
-			case UMLPackage.TRANSITION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.TRANSITION__NAME :
-				return isSetName();
-			case UMLPackage.TRANSITION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.TRANSITION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.TRANSITION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.TRANSITION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.TRANSITION__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.TRANSITION__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.TRANSITION__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.TRANSITION__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.TRANSITION__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.TRANSITION__MEMBER :
-				return isSetMembers();
-			case UMLPackage.TRANSITION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.TRANSITION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.TRANSITION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.TRANSITION__EFFECT :
-				return basicGetEffect() != null;
-			case UMLPackage.TRANSITION__GUARD :
-				return basicGetGuard() != null;
-			case UMLPackage.TRANSITION__KIND :
-				return getKind() != KIND_EDEFAULT;
-			case UMLPackage.TRANSITION__REDEFINED_TRANSITION :
-				return basicGetRedefinedTransition() != null;
-			case UMLPackage.TRANSITION__SOURCE :
-				return basicGetSource() != null;
-			case UMLPackage.TRANSITION__TARGET :
-				return basicGetTarget() != null;
-			case UMLPackage.TRANSITION__TRIGGER :
-				return !getTriggers().isEmpty();
-			case UMLPackage.TRANSITION__CONTAINER :
-				return basicGetContainer() != null;
+		case UMLPackage.TRANSITION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.TRANSITION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.TRANSITION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.TRANSITION__OWNER:
+			return isSetOwner();
+		case UMLPackage.TRANSITION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.TRANSITION__NAME:
+			return isSetName();
+		case UMLPackage.TRANSITION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.TRANSITION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.TRANSITION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.TRANSITION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.TRANSITION__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.TRANSITION__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.TRANSITION__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.TRANSITION__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.TRANSITION__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.TRANSITION__MEMBER:
+			return isSetMembers();
+		case UMLPackage.TRANSITION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.TRANSITION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.TRANSITION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.TRANSITION__EFFECT:
+			return basicGetEffect() != null;
+		case UMLPackage.TRANSITION__GUARD:
+			return basicGetGuard() != null;
+		case UMLPackage.TRANSITION__KIND:
+			return getKind() != KIND_EDEFAULT;
+		case UMLPackage.TRANSITION__REDEFINED_TRANSITION:
+			return basicGetRedefinedTransition() != null;
+		case UMLPackage.TRANSITION__SOURCE:
+			return basicGetSource() != null;
+		case UMLPackage.TRANSITION__TARGET:
+			return basicGetTarget() != null;
+		case UMLPackage.TRANSITION__TRIGGER:
+			return !getTriggers().isEmpty();
+		case UMLPackage.TRANSITION__CONTAINER:
+			return basicGetContainer() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1225,14 +1125,14 @@
 			Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.TRANSITION__IS_LEAF :
-					return UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF;
-				case UMLPackage.TRANSITION__REDEFINED_ELEMENT :
-					return UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT;
-				case UMLPackage.TRANSITION__REDEFINITION_CONTEXT :
-					return UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT;
-				default :
-					return -1;
+			case UMLPackage.TRANSITION__IS_LEAF:
+				return UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF;
+			case UMLPackage.TRANSITION__REDEFINED_ELEMENT:
+				return UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT;
+			case UMLPackage.TRANSITION__REDEFINITION_CONTEXT:
+				return UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -1248,14 +1148,14 @@
 			Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF :
-					return UMLPackage.TRANSITION__IS_LEAF;
-				case UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT :
-					return UMLPackage.TRANSITION__REDEFINED_ELEMENT;
-				case UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT :
-					return UMLPackage.TRANSITION__REDEFINITION_CONTEXT;
-				default :
-					return -1;
+			case UMLPackage.REDEFINABLE_ELEMENT__IS_LEAF:
+				return UMLPackage.TRANSITION__IS_LEAF;
+			case UMLPackage.REDEFINABLE_ELEMENT__REDEFINED_ELEMENT:
+				return UMLPackage.TRANSITION__REDEFINED_ELEMENT;
+			case UMLPackage.REDEFINABLE_ELEMENT__REDEFINITION_CONTEXT:
+				return UMLPackage.TRANSITION__REDEFINITION_CONTEXT;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1270,18 +1170,18 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == RedefinableElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.TRANSITION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.TRANSITION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.TRANSITION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.REDEFINABLE_ELEMENT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-					return UMLPackage.TRANSITION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT;
-				case UMLPackage.REDEFINABLE_ELEMENT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-					return UMLPackage.TRANSITION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT;
-				default :
-					return -1;
+			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.TRANSITION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.TRANSITION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.REDEFINABLE_ELEMENT___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.TRANSITION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.REDEFINABLE_ELEMENT___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+				return UMLPackage.TRANSITION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT;
+			case UMLPackage.REDEFINABLE_ELEMENT___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+				return UMLPackage.TRANSITION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -1297,219 +1197,168 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.TRANSITION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.TRANSITION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.TRANSITION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TRANSITION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.TRANSITION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.TRANSITION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.TRANSITION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.TRANSITION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.TRANSITION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.TRANSITION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.TRANSITION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TRANSITION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.TRANSITION___GET_MODEL :
-				return getModel();
-			case UMLPackage.TRANSITION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.TRANSITION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.TRANSITION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.TRANSITION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.TRANSITION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.TRANSITION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.TRANSITION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TRANSITION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.TRANSITION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.TRANSITION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.TRANSITION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TRANSITION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TRANSITION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.TRANSITION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TRANSITION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.TRANSITION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.TRANSITION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.TRANSITION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.TRANSITION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.TRANSITION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TRANSITION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.TRANSITION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.TRANSITION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.TRANSITION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.TRANSITION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.TRANSITION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.TRANSITION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.TRANSITION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.TRANSITION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.TRANSITION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.TRANSITION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TRANSITION___SEPARATOR :
-				return separator();
-			case UMLPackage.TRANSITION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.TRANSITION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.TRANSITION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.TRANSITION___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.TRANSITION___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.TRANSITION___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.TRANSITION___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.TRANSITION___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.TRANSITION___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.TRANSITION___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.TRANSITION___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.TRANSITION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.TRANSITION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.TRANSITION___VALIDATE_STATE_IS_EXTERNAL__DIAGNOSTICCHAIN_MAP :
-				return validateStateIsExternal(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___VALIDATE_JOIN_SEGMENT_GUARDS__DIAGNOSTICCHAIN_MAP :
-				return validateJoinSegmentGuards(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___VALIDATE_STATE_IS_INTERNAL__DIAGNOSTICCHAIN_MAP :
-				return validateStateIsInternal(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___VALIDATE_OUTGOING_PSEUDOSTATES__DIAGNOSTICCHAIN_MAP :
-				return validateOutgoingPseudostates(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___VALIDATE_JOIN_SEGMENT_STATE__DIAGNOSTICCHAIN_MAP :
-				return validateJoinSegmentState(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___VALIDATE_FORK_SEGMENT_STATE__DIAGNOSTICCHAIN_MAP :
-				return validateForkSegmentState(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___VALIDATE_STATE_IS_LOCAL__DIAGNOSTICCHAIN_MAP :
-				return validateStateIsLocal((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___VALIDATE_INITIAL_TRANSITION__DIAGNOSTICCHAIN_MAP :
-				return validateInitialTransition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___VALIDATE_FORK_SEGMENT_GUARDS__DIAGNOSTICCHAIN_MAP :
-				return validateForkSegmentGuards(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRANSITION___CONTAINING_STATE_MACHINE :
-				return containingStateMachine();
-			case UMLPackage.TRANSITION___REDEFINITION_CONTEXT :
-				return redefinitionContext();
+		case UMLPackage.TRANSITION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.TRANSITION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.TRANSITION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TRANSITION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.TRANSITION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.TRANSITION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.TRANSITION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.TRANSITION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.TRANSITION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.TRANSITION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.TRANSITION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TRANSITION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.TRANSITION___GET_MODEL:
+			return getModel();
+		case UMLPackage.TRANSITION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.TRANSITION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.TRANSITION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.TRANSITION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.TRANSITION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.TRANSITION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.TRANSITION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TRANSITION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.TRANSITION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.TRANSITION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.TRANSITION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TRANSITION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TRANSITION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.TRANSITION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TRANSITION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.TRANSITION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.TRANSITION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.TRANSITION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.TRANSITION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.TRANSITION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TRANSITION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.TRANSITION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.TRANSITION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.TRANSITION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.TRANSITION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.TRANSITION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.TRANSITION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.TRANSITION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.TRANSITION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.TRANSITION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.TRANSITION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TRANSITION___SEPARATOR:
+			return separator();
+		case UMLPackage.TRANSITION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.TRANSITION___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.TRANSITION___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.TRANSITION___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.TRANSITION___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.TRANSITION___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.TRANSITION___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.TRANSITION___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.TRANSITION___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.TRANSITION___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.TRANSITION___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.TRANSITION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.TRANSITION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.TRANSITION___VALIDATE_STATE_IS_EXTERNAL__DIAGNOSTICCHAIN_MAP:
+			return validateStateIsExternal((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___VALIDATE_JOIN_SEGMENT_GUARDS__DIAGNOSTICCHAIN_MAP:
+			return validateJoinSegmentGuards((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___VALIDATE_STATE_IS_INTERNAL__DIAGNOSTICCHAIN_MAP:
+			return validateStateIsInternal((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___VALIDATE_OUTGOING_PSEUDOSTATES__DIAGNOSTICCHAIN_MAP:
+			return validateOutgoingPseudostates((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___VALIDATE_JOIN_SEGMENT_STATE__DIAGNOSTICCHAIN_MAP:
+			return validateJoinSegmentState((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___VALIDATE_FORK_SEGMENT_STATE__DIAGNOSTICCHAIN_MAP:
+			return validateForkSegmentState((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___VALIDATE_STATE_IS_LOCAL__DIAGNOSTICCHAIN_MAP:
+			return validateStateIsLocal((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___VALIDATE_INITIAL_TRANSITION__DIAGNOSTICCHAIN_MAP:
+			return validateInitialTransition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___VALIDATE_FORK_SEGMENT_GUARDS__DIAGNOSTICCHAIN_MAP:
+			return validateForkSegmentGuards((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRANSITION___CONTAINING_STATE_MACHINE:
+			return containingStateMachine();
+		case UMLPackage.TRANSITION___REDEFINITION_CONTEXT:
+			return redefinitionContext();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1522,8 +1371,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.TRANSITION__REDEFINED_TRANSITION};
+	protected static final int[] REDEFINED_ELEMENT_ESUBSETS = new int[] { UMLPackage.TRANSITION__REDEFINED_TRANSITION };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1541,12 +1389,10 @@
 	 */
 	public RedefinableElement getRedefinedElement(String name,
 			boolean ignoreCase, EClass eClass) {
-		redefinedElementLoop : for (RedefinableElement redefinedElement : getRedefinedElements()) {
+		redefinedElementLoop: for (RedefinableElement redefinedElement : getRedefinedElements()) {
 			if (eClass != null && !eClass.isInstance(redefinedElement))
 				continue redefinedElementLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(redefinedElement.getName())
-				: name.equals(redefinedElement.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(redefinedElement.getName()) : name.equals(redefinedElement.getName())))
 				continue redefinedElementLoop;
 			return redefinedElement;
 		}
@@ -1575,7 +1421,7 @@
 	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
-			|| eIsSet(UMLPackage.TRANSITION__CONTAINER);
+				|| eIsSet(UMLPackage.TRANSITION__CONTAINER);
 	}
 
 	/**
@@ -1586,13 +1432,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.TRANSITION__OWNED_COMMENT,
-		UMLPackage.TRANSITION__NAME_EXPRESSION,
-		UMLPackage.TRANSITION__ELEMENT_IMPORT,
-		UMLPackage.TRANSITION__PACKAGE_IMPORT,
-		UMLPackage.TRANSITION__OWNED_MEMBER, UMLPackage.TRANSITION__EFFECT,
-		UMLPackage.TRANSITION__TRIGGER};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.TRANSITION__OWNED_COMMENT, UMLPackage.TRANSITION__NAME_EXPRESSION, UMLPackage.TRANSITION__ELEMENT_IMPORT, UMLPackage.TRANSITION__PACKAGE_IMPORT,
+			UMLPackage.TRANSITION__OWNED_MEMBER, UMLPackage.TRANSITION__EFFECT, UMLPackage.TRANSITION__TRIGGER };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOwnedRules() <em>Owned Rule</em>}' containment reference list.
@@ -1602,8 +1443,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_RULE_ESUBSETS = new int[]{
-		UMLPackage.TRANSITION__GUARD};
+	protected static final int[] OWNED_RULE_ESUBSETS = new int[] { UMLPackage.TRANSITION__GUARD };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1622,8 +1462,8 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.TRANSITION__EFFECT)
-			|| eIsSet(UMLPackage.TRANSITION__TRIGGER);
+				|| eIsSet(UMLPackage.TRANSITION__EFFECT)
+				|| eIsSet(UMLPackage.TRANSITION__TRIGGER);
 	}
 
 } //TransitionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TriggerImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TriggerImpl.java
index 757d2b9..bdf0376 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TriggerImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TriggerImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -15,11 +16,19 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Event;
 import org.eclipse.uml2.uml.NamedElement;
@@ -76,9 +85,7 @@
 	 * @generated
 	 */
 	public Event getEvent() {
-		return (Event) eDynamicGet(
-			UMLPackage.TRIGGER__EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRIGGER__EVENT, true, true);
+		return (Event) eDynamicGet(UMLPackage.TRIGGER__EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRIGGER__EVENT, true, true);
 	}
 
 	/**
@@ -87,9 +94,7 @@
 	 * @generated
 	 */
 	public Event basicGetEvent() {
-		return (Event) eDynamicGet(
-			UMLPackage.TRIGGER__EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRIGGER__EVENT, false, true);
+		return (Event) eDynamicGet(UMLPackage.TRIGGER__EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRIGGER__EVENT, false, true);
 	}
 
 	/**
@@ -98,8 +103,7 @@
 	 * @generated
 	 */
 	public void setEvent(Event newEvent) {
-		eDynamicSet(UMLPackage.TRIGGER__EVENT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRIGGER__EVENT, newEvent);
+		eDynamicSet(UMLPackage.TRIGGER__EVENT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRIGGER__EVENT, newEvent);
 	}
 
 	/**
@@ -109,9 +113,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Port> getPorts() {
-		return (EList<Port>) eDynamicGet(
-			UMLPackage.TRIGGER__PORT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TRIGGER__PORT, true, true);
+		return (EList<Port>) eDynamicGet(UMLPackage.TRIGGER__PORT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TRIGGER__PORT, true, true);
 	}
 
 	/**
@@ -129,10 +131,8 @@
 	 * @generated
 	 */
 	public Port getPort(String name, Type type, boolean ignoreCase) {
-		portLoop : for (Port port : getPorts()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(port.getName())
-				: name.equals(port.getName())))
+		portLoop: for (Port port : getPorts()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(port.getName()) : name.equals(port.getName())))
 				continue portLoop;
 			if (type != null && !type.equals(port.getType()))
 				continue portLoop;
@@ -148,8 +148,7 @@
 	 */
 	public boolean validateTriggerWithPorts(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return TriggerOperations.validateTriggerWithPorts(this, diagnostics,
-			context);
+		return TriggerOperations.validateTriggerWithPorts(this, diagnostics, context);
 	}
 
 	/**
@@ -160,38 +159,38 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.TRIGGER__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.TRIGGER__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.TRIGGER__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.TRIGGER__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.TRIGGER__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.TRIGGER__NAME :
-				return getName();
-			case UMLPackage.TRIGGER__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.TRIGGER__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.TRIGGER__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TRIGGER__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.TRIGGER__EVENT :
-				if (resolve)
-					return getEvent();
-				return basicGetEvent();
-			case UMLPackage.TRIGGER__PORT :
-				return getPorts();
+		case UMLPackage.TRIGGER__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.TRIGGER__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.TRIGGER__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.TRIGGER__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.TRIGGER__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.TRIGGER__NAME:
+			return getName();
+		case UMLPackage.TRIGGER__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.TRIGGER__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.TRIGGER__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TRIGGER__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.TRIGGER__EVENT:
+			if (resolve)
+				return getEvent();
+			return basicGetEvent();
+		case UMLPackage.TRIGGER__PORT:
+			return getPorts();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -205,32 +204,30 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.TRIGGER__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.TRIGGER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.TRIGGER__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.TRIGGER__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.TRIGGER__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.TRIGGER__EVENT :
-				setEvent((Event) newValue);
-				return;
-			case UMLPackage.TRIGGER__PORT :
-				getPorts().clear();
-				getPorts().addAll((Collection<? extends Port>) newValue);
-				return;
+		case UMLPackage.TRIGGER__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.TRIGGER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.TRIGGER__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.TRIGGER__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.TRIGGER__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.TRIGGER__EVENT:
+			setEvent((Event) newValue);
+			return;
+		case UMLPackage.TRIGGER__PORT:
+			getPorts().clear();
+			getPorts().addAll((Collection<? extends Port>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -243,27 +240,27 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TRIGGER__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.TRIGGER__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.TRIGGER__NAME :
-				unsetName();
-				return;
-			case UMLPackage.TRIGGER__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.TRIGGER__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.TRIGGER__EVENT :
-				setEvent((Event) null);
-				return;
-			case UMLPackage.TRIGGER__PORT :
-				getPorts().clear();
-				return;
+		case UMLPackage.TRIGGER__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.TRIGGER__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.TRIGGER__NAME:
+			unsetName();
+			return;
+		case UMLPackage.TRIGGER__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.TRIGGER__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.TRIGGER__EVENT:
+			setEvent((Event) null);
+			return;
+		case UMLPackage.TRIGGER__PORT:
+			getPorts().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -276,32 +273,30 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TRIGGER__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.TRIGGER__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.TRIGGER__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.TRIGGER__OWNER :
-				return isSetOwner();
-			case UMLPackage.TRIGGER__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.TRIGGER__NAME :
-				return isSetName();
-			case UMLPackage.TRIGGER__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.TRIGGER__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.TRIGGER__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.TRIGGER__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.TRIGGER__EVENT :
-				return basicGetEvent() != null;
-			case UMLPackage.TRIGGER__PORT :
-				return !getPorts().isEmpty();
+		case UMLPackage.TRIGGER__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.TRIGGER__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.TRIGGER__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.TRIGGER__OWNER:
+			return isSetOwner();
+		case UMLPackage.TRIGGER__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.TRIGGER__NAME:
+			return isSetName();
+		case UMLPackage.TRIGGER__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.TRIGGER__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.TRIGGER__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.TRIGGER__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.TRIGGER__EVENT:
+			return basicGetEvent() != null;
+		case UMLPackage.TRIGGER__PORT:
+			return !getPorts().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -316,129 +311,112 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.TRIGGER___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.TRIGGER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRIGGER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRIGGER___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.TRIGGER___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TRIGGER___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.TRIGGER___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.TRIGGER___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.TRIGGER___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.TRIGGER___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.TRIGGER___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.TRIGGER___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.TRIGGER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TRIGGER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.TRIGGER___GET_MODEL :
-				return getModel();
-			case UMLPackage.TRIGGER___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.TRIGGER___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.TRIGGER___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.TRIGGER___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.TRIGGER___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.TRIGGER___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.TRIGGER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TRIGGER___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.TRIGGER___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.TRIGGER___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.TRIGGER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TRIGGER___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TRIGGER___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.TRIGGER___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TRIGGER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.TRIGGER___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.TRIGGER___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.TRIGGER___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.TRIGGER___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.TRIGGER___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TRIGGER___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.TRIGGER___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.TRIGGER___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRIGGER___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRIGGER___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TRIGGER___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.TRIGGER___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.TRIGGER___GET_LABEL :
-				return getLabel();
-			case UMLPackage.TRIGGER___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.TRIGGER___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.TRIGGER___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.TRIGGER___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.TRIGGER___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.TRIGGER___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TRIGGER___SEPARATOR :
-				return separator();
-			case UMLPackage.TRIGGER___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.TRIGGER___VALIDATE_TRIGGER_WITH_PORTS__DIAGNOSTICCHAIN_MAP :
-				return validateTriggerWithPorts(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRIGGER___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.TRIGGER___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRIGGER___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRIGGER___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.TRIGGER___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TRIGGER___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.TRIGGER___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.TRIGGER___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.TRIGGER___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.TRIGGER___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.TRIGGER___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.TRIGGER___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.TRIGGER___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TRIGGER___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.TRIGGER___GET_MODEL:
+			return getModel();
+		case UMLPackage.TRIGGER___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.TRIGGER___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.TRIGGER___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.TRIGGER___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.TRIGGER___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.TRIGGER___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.TRIGGER___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TRIGGER___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.TRIGGER___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.TRIGGER___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.TRIGGER___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TRIGGER___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TRIGGER___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.TRIGGER___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TRIGGER___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.TRIGGER___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.TRIGGER___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.TRIGGER___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.TRIGGER___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.TRIGGER___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TRIGGER___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.TRIGGER___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.TRIGGER___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRIGGER___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRIGGER___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TRIGGER___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.TRIGGER___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.TRIGGER___GET_LABEL:
+			return getLabel();
+		case UMLPackage.TRIGGER___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.TRIGGER___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.TRIGGER___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.TRIGGER___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.TRIGGER___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.TRIGGER___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TRIGGER___SEPARATOR:
+			return separator();
+		case UMLPackage.TRIGGER___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.TRIGGER___VALIDATE_TRIGGER_WITH_PORTS__DIAGNOSTICCHAIN_MAP:
+			return validateTriggerWithPorts((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TypeImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TypeImpl.java
index 1f7a13c..8fe6335 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TypeImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TypeImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -89,9 +89,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -115,10 +113,7 @@
 	 */
 	public org.eclipse.uml2.uml.Package getPackage() {
 		org.eclipse.uml2.uml.Package package_ = basicGetPackage();
-		return package_ != null && package_.eIsProxy()
-			? (org.eclipse.uml2.uml.Package) eResolveProxy(
-				(InternalEObject) package_)
-			: package_;
+		return package_ != null && package_.eIsProxy() ? (org.eclipse.uml2.uml.Package) eResolveProxy((InternalEObject) package_) : package_;
 	}
 
 	/**
@@ -129,8 +124,8 @@
 	public org.eclipse.uml2.uml.Package basicGetPackage() {
 		InternalEObject eInternalContainer = eInternalContainer();
 		return eInternalContainer instanceof org.eclipse.uml2.uml.Package
-			? (org.eclipse.uml2.uml.Package) eInternalContainer
-			: null;
+				? (org.eclipse.uml2.uml.Package) eInternalContainer
+				: null;
 	}
 
 	/**
@@ -142,22 +137,22 @@
 		if (newPackage != eInternalContainer()) {
 			if (EcoreUtil.isAncestor(this, newPackage))
 				throw new IllegalArgumentException(
-					"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
+						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
 			NotificationChain msgs = null;
 			if (eInternalContainer() != null)
 				msgs = eBasicRemoveFromContainer(msgs);
 			if (newPackage != null)
 				msgs = ((InternalEList<Type>) newPackage.getOwnedTypes())
-					.basicAdd(this, msgs);
+						.basicAdd(this, msgs);
 			msgs = eBasicSetContainer((InternalEObject) newPackage,
-				InternalEObject.EOPPOSITE_FEATURE_BASE
-					- UMLPackage.PACKAGE__PACKAGED_ELEMENT,
-				msgs);
+					InternalEObject.EOPPOSITE_FEATURE_BASE
+							- UMLPackage.PACKAGE__PACKAGED_ELEMENT,
+					msgs);
 			if (msgs != null)
 				msgs.dispatch();
 		} else if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET,
-				UMLPackage.TYPE__PACKAGE, newPackage, newPackage));
+					UMLPackage.TYPE__PACKAGE, newPackage, newPackage));
 	}
 
 	/**
@@ -170,9 +165,7 @@
 			int end1Upper, Type end1Type, boolean end2IsNavigable,
 			AggregationKind end2Aggregation, String end2Name, int end2Lower,
 			int end2Upper) {
-		return TypeOperations.createAssociation(this, end1IsNavigable,
-			end1Aggregation, end1Name, end1Lower, end1Upper, end1Type,
-			end2IsNavigable, end2Aggregation, end2Name, end2Lower, end2Upper);
+		return TypeOperations.createAssociation(this, end1IsNavigable, end1Aggregation, end1Name, end1Lower, end1Upper, end1Type, end2IsNavigable, end2Aggregation, end2Name, end2Lower, end2Upper);
 	}
 
 	/**
@@ -184,11 +177,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<Association> result = (EList<Association>) cache.get(this,
-				UMLPackage.Literals.TYPE___GET_ASSOCIATIONS);
+			EList<Association> result = (EList<Association>) cache.get(this, UMLPackage.Literals.TYPE___GET_ASSOCIATIONS);
 			if (result == null) {
-				cache.put(this, UMLPackage.Literals.TYPE___GET_ASSOCIATIONS,
-					result = TypeOperations.getAssociations(this));
+				cache.put(this, UMLPackage.Literals.TYPE___GET_ASSOCIATIONS, result = TypeOperations.getAssociations(this));
 			}
 			return result;
 		}
@@ -212,44 +203,44 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.TYPE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.TYPE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.TYPE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.TYPE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.TYPE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.TYPE__NAME :
-				return getName();
-			case UMLPackage.TYPE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.TYPE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.TYPE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TYPE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.TYPE__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.TYPE__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.TYPE__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
+		case UMLPackage.TYPE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.TYPE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.TYPE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.TYPE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.TYPE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.TYPE__NAME:
+			return getName();
+		case UMLPackage.TYPE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.TYPE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.TYPE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TYPE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.TYPE__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.TYPE__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.TYPE__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -263,34 +254,32 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.TYPE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.TYPE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.TYPE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.TYPE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.TYPE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.TYPE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.TYPE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.TYPE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
+		case UMLPackage.TYPE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.TYPE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.TYPE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.TYPE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.TYPE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.TYPE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.TYPE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.TYPE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -303,30 +292,30 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TYPE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.TYPE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.TYPE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.TYPE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.TYPE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.TYPE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.TYPE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.TYPE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
+		case UMLPackage.TYPE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.TYPE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.TYPE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.TYPE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.TYPE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.TYPE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.TYPE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.TYPE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -339,34 +328,32 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TYPE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.TYPE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.TYPE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.TYPE__OWNER :
-				return isSetOwner();
-			case UMLPackage.TYPE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.TYPE__NAME :
-				return isSetName();
-			case UMLPackage.TYPE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.TYPE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.TYPE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.TYPE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.TYPE__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.TYPE__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.TYPE__PACKAGE :
-				return basicGetPackage() != null;
+		case UMLPackage.TYPE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.TYPE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.TYPE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.TYPE__OWNER:
+			return isSetOwner();
+		case UMLPackage.TYPE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.TYPE__NAME:
+			return isSetName();
+		case UMLPackage.TYPE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.TYPE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.TYPE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.TYPE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.TYPE__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.TYPE__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.TYPE__PACKAGE:
+			return basicGetPackage() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -381,147 +368,123 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.TYPE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.TYPE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TYPE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TYPE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.TYPE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TYPE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.TYPE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.TYPE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.TYPE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.TYPE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.TYPE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.TYPE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.TYPE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TYPE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.TYPE___GET_MODEL :
-				return getModel();
-			case UMLPackage.TYPE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.TYPE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.TYPE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.TYPE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.TYPE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.TYPE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.TYPE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TYPE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.TYPE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.TYPE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.TYPE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.TYPE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TYPE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.TYPE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.TYPE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.TYPE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.TYPE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.TYPE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.TYPE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.TYPE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.TYPE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.TYPE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.TYPE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TYPE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TYPE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TYPE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.TYPE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.TYPE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.TYPE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.TYPE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.TYPE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.TYPE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.TYPE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.TYPE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TYPE___SEPARATOR :
-				return separator();
-			case UMLPackage.TYPE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.TYPE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.TYPE___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.TYPE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.TYPE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.TYPE___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.TYPE___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
+		case UMLPackage.TYPE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.TYPE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TYPE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TYPE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.TYPE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TYPE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.TYPE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.TYPE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.TYPE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.TYPE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.TYPE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.TYPE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.TYPE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TYPE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.TYPE___GET_MODEL:
+			return getModel();
+		case UMLPackage.TYPE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.TYPE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.TYPE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.TYPE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.TYPE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.TYPE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.TYPE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TYPE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.TYPE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.TYPE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.TYPE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.TYPE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TYPE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.TYPE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.TYPE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.TYPE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.TYPE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.TYPE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.TYPE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.TYPE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.TYPE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.TYPE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.TYPE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TYPE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TYPE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TYPE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.TYPE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.TYPE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.TYPE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.TYPE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.TYPE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.TYPE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.TYPE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.TYPE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TYPE___SEPARATOR:
+			return separator();
+		case UMLPackage.TYPE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.TYPE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.TYPE___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.TYPE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.TYPE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.TYPE___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.TYPE___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -533,7 +496,8 @@
 	 */
 	@Override
 	public boolean isSetNamespace() {
-		return super.isSetNamespace() || eIsSet(UMLPackage.TYPE__PACKAGE);
+		return super.isSetNamespace()
+				|| eIsSet(UMLPackage.TYPE__PACKAGE);
 	}
 
 } //TypeImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TypedElementImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TypedElementImpl.java
index a69eb31..43e54bb 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TypedElementImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/TypedElementImpl.java
@@ -1,20 +1,27 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.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.StringExpression;
 import org.eclipse.uml2.uml.Type;
@@ -64,9 +71,7 @@
 	 * @generated
 	 */
 	public Type getType() {
-		return (Type) eDynamicGet(
-			UMLPackage.TYPED_ELEMENT__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TYPED_ELEMENT__TYPE, true, true);
+		return (Type) eDynamicGet(UMLPackage.TYPED_ELEMENT__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TYPED_ELEMENT__TYPE, true, true);
 	}
 
 	/**
@@ -75,9 +80,7 @@
 	 * @generated
 	 */
 	public Type basicGetType() {
-		return (Type) eDynamicGet(
-			UMLPackage.TYPED_ELEMENT__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TYPED_ELEMENT__TYPE, false, true);
+		return (Type) eDynamicGet(UMLPackage.TYPED_ELEMENT__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TYPED_ELEMENT__TYPE, false, true);
 	}
 
 	/**
@@ -86,8 +89,7 @@
 	 * @generated
 	 */
 	public void setType(Type newType) {
-		eDynamicSet(UMLPackage.TYPED_ELEMENT__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TYPED_ELEMENT__TYPE, newType);
+		eDynamicSet(UMLPackage.TYPED_ELEMENT__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TYPED_ELEMENT__TYPE, newType);
 	}
 
 	/**
@@ -98,36 +100,36 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.TYPED_ELEMENT__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.TYPED_ELEMENT__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.TYPED_ELEMENT__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.TYPED_ELEMENT__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.TYPED_ELEMENT__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.TYPED_ELEMENT__NAME :
-				return getName();
-			case UMLPackage.TYPED_ELEMENT__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.TYPED_ELEMENT__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.TYPED_ELEMENT__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.TYPED_ELEMENT__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.TYPED_ELEMENT__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
+		case UMLPackage.TYPED_ELEMENT__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.TYPED_ELEMENT__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.TYPED_ELEMENT__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.TYPED_ELEMENT__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.TYPED_ELEMENT__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.TYPED_ELEMENT__NAME:
+			return getName();
+		case UMLPackage.TYPED_ELEMENT__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.TYPED_ELEMENT__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.TYPED_ELEMENT__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.TYPED_ELEMENT__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.TYPED_ELEMENT__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -141,28 +143,26 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.TYPED_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.TYPED_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.TYPED_ELEMENT__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.TYPED_ELEMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.TYPED_ELEMENT__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.TYPED_ELEMENT__TYPE :
-				setType((Type) newValue);
-				return;
+		case UMLPackage.TYPED_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.TYPED_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.TYPED_ELEMENT__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.TYPED_ELEMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.TYPED_ELEMENT__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.TYPED_ELEMENT__TYPE:
+			setType((Type) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -175,24 +175,24 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TYPED_ELEMENT__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.TYPED_ELEMENT__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.TYPED_ELEMENT__NAME :
-				unsetName();
-				return;
-			case UMLPackage.TYPED_ELEMENT__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.TYPED_ELEMENT__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.TYPED_ELEMENT__TYPE :
-				setType((Type) null);
-				return;
+		case UMLPackage.TYPED_ELEMENT__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.TYPED_ELEMENT__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.TYPED_ELEMENT__NAME:
+			unsetName();
+			return;
+		case UMLPackage.TYPED_ELEMENT__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.TYPED_ELEMENT__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.TYPED_ELEMENT__TYPE:
+			setType((Type) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -205,30 +205,28 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.TYPED_ELEMENT__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.TYPED_ELEMENT__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.TYPED_ELEMENT__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.TYPED_ELEMENT__OWNER :
-				return isSetOwner();
-			case UMLPackage.TYPED_ELEMENT__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.TYPED_ELEMENT__NAME :
-				return isSetName();
-			case UMLPackage.TYPED_ELEMENT__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.TYPED_ELEMENT__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.TYPED_ELEMENT__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.TYPED_ELEMENT__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.TYPED_ELEMENT__TYPE :
-				return basicGetType() != null;
+		case UMLPackage.TYPED_ELEMENT__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.TYPED_ELEMENT__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.TYPED_ELEMENT__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.TYPED_ELEMENT__OWNER:
+			return isSetOwner();
+		case UMLPackage.TYPED_ELEMENT__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.TYPED_ELEMENT__NAME:
+			return isSetName();
+		case UMLPackage.TYPED_ELEMENT__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.TYPED_ELEMENT__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.TYPED_ELEMENT__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.TYPED_ELEMENT__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.TYPED_ELEMENT__TYPE:
+			return basicGetType() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UMLFactoryImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UMLFactoryImpl.java
index e68fa25..7e449dc 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UMLFactoryImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UMLFactoryImpl.java
@@ -1,14 +1,15 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 205188
  *   Kenn Hussey (CEA) - 327039, 351774, 397324, 418466, 485756
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
@@ -247,8 +248,7 @@
 	 */
 	public static UMLFactory init() {
 		try {
-			UMLFactory theUMLFactory = (UMLFactory) EPackage.Registry.INSTANCE
-				.getEFactory(UMLPackage.eNS_URI);
+			UMLFactory theUMLFactory = (UMLFactory) EPackage.Registry.INSTANCE.getEFactory(UMLPackage.eNS_URI);
 			if (theUMLFactory != null) {
 				return theUMLFactory;
 			}
@@ -276,395 +276,394 @@
 	@Override
 	public EObject create(EClass eClass) {
 		switch (eClass.getClassifierID()) {
-			case UMLPackage.ACTIVITY :
-				return createActivity();
-			case UMLPackage.CLASS :
-				return createClass();
-			case UMLPackage.COMMENT :
-				return createComment();
-			case UMLPackage.STEREOTYPE :
-				return createStereotype();
-			case UMLPackage.IMAGE :
-				return createImage();
-			case UMLPackage.PROFILE :
-				return createProfile();
-			case UMLPackage.PACKAGE :
-				return createPackage();
-			case UMLPackage.TEMPLATE_PARAMETER :
-				return createTemplateParameter();
-			case UMLPackage.TEMPLATE_SIGNATURE :
-				return createTemplateSignature();
-			case UMLPackage.TEMPLATE_BINDING :
-				return createTemplateBinding();
-			case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION :
-				return createTemplateParameterSubstitution();
-			case UMLPackage.ASSOCIATION :
-				return createAssociation();
-			case UMLPackage.PROPERTY :
-				return createProperty();
-			case UMLPackage.CONNECTOR_END :
-				return createConnectorEnd();
-			case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER :
-				return createConnectableElementTemplateParameter();
-			case UMLPackage.DEPLOYMENT :
-				return createDeployment();
-			case UMLPackage.DEPENDENCY :
-				return createDependency();
-			case UMLPackage.DEPLOYMENT_SPECIFICATION :
-				return createDeploymentSpecification();
-			case UMLPackage.ARTIFACT :
-				return createArtifact();
-			case UMLPackage.MANIFESTATION :
-				return createManifestation();
-			case UMLPackage.ABSTRACTION :
-				return createAbstraction();
-			case UMLPackage.OPAQUE_EXPRESSION :
-				return createOpaqueExpression();
-			case UMLPackage.PARAMETER :
-				return createParameter();
-			case UMLPackage.OPERATION :
-				return createOperation();
-			case UMLPackage.PARAMETER_SET :
-				return createParameterSet();
-			case UMLPackage.CONSTRAINT :
-				return createConstraint();
-			case UMLPackage.DATA_TYPE :
-				return createDataType();
-			case UMLPackage.INTERFACE :
-				return createInterface();
-			case UMLPackage.RECEPTION :
-				return createReception();
-			case UMLPackage.SIGNAL :
-				return createSignal();
-			case UMLPackage.PROTOCOL_STATE_MACHINE :
-				return createProtocolStateMachine();
-			case UMLPackage.STATE_MACHINE :
-				return createStateMachine();
-			case UMLPackage.PSEUDOSTATE :
-				return createPseudostate();
-			case UMLPackage.REGION :
-				return createRegion();
-			case UMLPackage.STATE :
-				return createState();
-			case UMLPackage.CONNECTION_POINT_REFERENCE :
-				return createConnectionPointReference();
-			case UMLPackage.TRIGGER :
-				return createTrigger();
-			case UMLPackage.PORT :
-				return createPort();
-			case UMLPackage.TRANSITION :
-				return createTransition();
-			case UMLPackage.PROTOCOL_CONFORMANCE :
-				return createProtocolConformance();
-			case UMLPackage.OPERATION_TEMPLATE_PARAMETER :
-				return createOperationTemplateParameter();
-			case UMLPackage.PACKAGE_MERGE :
-				return createPackageMerge();
-			case UMLPackage.PROFILE_APPLICATION :
-				return createProfileApplication();
-			case UMLPackage.ENUMERATION :
-				return createEnumeration();
-			case UMLPackage.ENUMERATION_LITERAL :
-				return createEnumerationLiteral();
-			case UMLPackage.INSTANCE_SPECIFICATION :
-				return createInstanceSpecification();
-			case UMLPackage.SLOT :
-				return createSlot();
-			case UMLPackage.PRIMITIVE_TYPE :
-				return createPrimitiveType();
-			case UMLPackage.ELEMENT_IMPORT :
-				return createElementImport();
-			case UMLPackage.PACKAGE_IMPORT :
-				return createPackageImport();
-			case UMLPackage.EXTENSION :
-				return createExtension();
-			case UMLPackage.EXTENSION_END :
-				return createExtensionEnd();
-			case UMLPackage.MODEL :
-				return createModel();
-			case UMLPackage.STRING_EXPRESSION :
-				return createStringExpression();
-			case UMLPackage.EXPRESSION :
-				return createExpression();
-			case UMLPackage.USAGE :
-				return createUsage();
-			case UMLPackage.COLLABORATION_USE :
-				return createCollaborationUse();
-			case UMLPackage.COLLABORATION :
-				return createCollaboration();
-			case UMLPackage.CONNECTOR :
-				return createConnector();
-			case UMLPackage.GENERALIZATION :
-				return createGeneralization();
-			case UMLPackage.GENERALIZATION_SET :
-				return createGeneralizationSet();
-			case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE :
-				return createRedefinableTemplateSignature();
-			case UMLPackage.USE_CASE :
-				return createUseCase();
-			case UMLPackage.EXTEND :
-				return createExtend();
-			case UMLPackage.EXTENSION_POINT :
-				return createExtensionPoint();
-			case UMLPackage.INCLUDE :
-				return createInclude();
-			case UMLPackage.SUBSTITUTION :
-				return createSubstitution();
-			case UMLPackage.REALIZATION :
-				return createRealization();
-			case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER :
-				return createClassifierTemplateParameter();
-			case UMLPackage.INTERFACE_REALIZATION :
-				return createInterfaceRealization();
-			case UMLPackage.ACTIVITY_PARTITION :
-				return createActivityPartition();
-			case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION :
-				return createInterruptibleActivityRegion();
-			case UMLPackage.STRUCTURED_ACTIVITY_NODE :
-				return createStructuredActivityNode();
-			case UMLPackage.EXCEPTION_HANDLER :
-				return createExceptionHandler();
-			case UMLPackage.INPUT_PIN :
-				return createInputPin();
-			case UMLPackage.OUTPUT_PIN :
-				return createOutputPin();
-			case UMLPackage.VARIABLE :
-				return createVariable();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION :
-				return createValueSpecificationAction();
-			case UMLPackage.LINK_END_DATA :
-				return createLinkEndData();
-			case UMLPackage.QUALIFIER_VALUE :
-				return createQualifierValue();
-			case UMLPackage.ACCEPT_CALL_ACTION :
-				return createAcceptCallAction();
-			case UMLPackage.ACCEPT_EVENT_ACTION :
-				return createAcceptEventAction();
-			case UMLPackage.ACTION_INPUT_PIN :
-				return createActionInputPin();
-			case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION :
-				return createAddStructuralFeatureValueAction();
-			case UMLPackage.ADD_VARIABLE_VALUE_ACTION :
-				return createAddVariableValueAction();
-			case UMLPackage.BROADCAST_SIGNAL_ACTION :
-				return createBroadcastSignalAction();
-			case UMLPackage.CALL_BEHAVIOR_ACTION :
-				return createCallBehaviorAction();
-			case UMLPackage.CALL_OPERATION_ACTION :
-				return createCallOperationAction();
-			case UMLPackage.CLAUSE :
-				return createClause();
-			case UMLPackage.CLEAR_ASSOCIATION_ACTION :
-				return createClearAssociationAction();
-			case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION :
-				return createClearStructuralFeatureAction();
-			case UMLPackage.CLEAR_VARIABLE_ACTION :
-				return createClearVariableAction();
-			case UMLPackage.CONDITIONAL_NODE :
-				return createConditionalNode();
-			case UMLPackage.CREATE_LINK_ACTION :
-				return createCreateLinkAction();
-			case UMLPackage.LINK_END_CREATION_DATA :
-				return createLinkEndCreationData();
-			case UMLPackage.CREATE_LINK_OBJECT_ACTION :
-				return createCreateLinkObjectAction();
-			case UMLPackage.CREATE_OBJECT_ACTION :
-				return createCreateObjectAction();
-			case UMLPackage.DESTROY_LINK_ACTION :
-				return createDestroyLinkAction();
-			case UMLPackage.LINK_END_DESTRUCTION_DATA :
-				return createLinkEndDestructionData();
-			case UMLPackage.DESTROY_OBJECT_ACTION :
-				return createDestroyObjectAction();
-			case UMLPackage.EXPANSION_NODE :
-				return createExpansionNode();
-			case UMLPackage.EXPANSION_REGION :
-				return createExpansionRegion();
-			case UMLPackage.LOOP_NODE :
-				return createLoopNode();
-			case UMLPackage.OPAQUE_ACTION :
-				return createOpaqueAction();
-			case UMLPackage.RAISE_EXCEPTION_ACTION :
-				return createRaiseExceptionAction();
-			case UMLPackage.READ_EXTENT_ACTION :
-				return createReadExtentAction();
-			case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION :
-				return createReadIsClassifiedObjectAction();
-			case UMLPackage.READ_LINK_ACTION :
-				return createReadLinkAction();
-			case UMLPackage.READ_LINK_OBJECT_END_ACTION :
-				return createReadLinkObjectEndAction();
-			case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION :
-				return createReadLinkObjectEndQualifierAction();
-			case UMLPackage.READ_SELF_ACTION :
-				return createReadSelfAction();
-			case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION :
-				return createReadStructuralFeatureAction();
-			case UMLPackage.READ_VARIABLE_ACTION :
-				return createReadVariableAction();
-			case UMLPackage.RECLASSIFY_OBJECT_ACTION :
-				return createReclassifyObjectAction();
-			case UMLPackage.REDUCE_ACTION :
-				return createReduceAction();
-			case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION :
-				return createRemoveStructuralFeatureValueAction();
-			case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION :
-				return createRemoveVariableValueAction();
-			case UMLPackage.REPLY_ACTION :
-				return createReplyAction();
-			case UMLPackage.SEND_OBJECT_ACTION :
-				return createSendObjectAction();
-			case UMLPackage.SEND_SIGNAL_ACTION :
-				return createSendSignalAction();
-			case UMLPackage.SEQUENCE_NODE :
-				return createSequenceNode();
-			case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION :
-				return createStartClassifierBehaviorAction();
-			case UMLPackage.START_OBJECT_BEHAVIOR_ACTION :
-				return createStartObjectBehaviorAction();
-			case UMLPackage.TEST_IDENTITY_ACTION :
-				return createTestIdentityAction();
-			case UMLPackage.UNMARSHALL_ACTION :
-				return createUnmarshallAction();
-			case UMLPackage.VALUE_PIN :
-				return createValuePin();
-			case UMLPackage.ACTIVITY_FINAL_NODE :
-				return createActivityFinalNode();
-			case UMLPackage.ACTIVITY_PARAMETER_NODE :
-				return createActivityParameterNode();
-			case UMLPackage.CENTRAL_BUFFER_NODE :
-				return createCentralBufferNode();
-			case UMLPackage.CONTROL_FLOW :
-				return createControlFlow();
-			case UMLPackage.DATA_STORE_NODE :
-				return createDataStoreNode();
-			case UMLPackage.DECISION_NODE :
-				return createDecisionNode();
-			case UMLPackage.OBJECT_FLOW :
-				return createObjectFlow();
-			case UMLPackage.FLOW_FINAL_NODE :
-				return createFlowFinalNode();
-			case UMLPackage.FORK_NODE :
-				return createForkNode();
-			case UMLPackage.INITIAL_NODE :
-				return createInitialNode();
-			case UMLPackage.JOIN_NODE :
-				return createJoinNode();
-			case UMLPackage.MERGE_NODE :
-				return createMergeNode();
-			case UMLPackage.INSTANCE_VALUE :
-				return createInstanceValue();
-			case UMLPackage.ANY_RECEIVE_EVENT :
-				return createAnyReceiveEvent();
-			case UMLPackage.CALL_EVENT :
-				return createCallEvent();
-			case UMLPackage.CHANGE_EVENT :
-				return createChangeEvent();
-			case UMLPackage.FUNCTION_BEHAVIOR :
-				return createFunctionBehavior();
-			case UMLPackage.OPAQUE_BEHAVIOR :
-				return createOpaqueBehavior();
-			case UMLPackage.SIGNAL_EVENT :
-				return createSignalEvent();
-			case UMLPackage.TIME_EVENT :
-				return createTimeEvent();
-			case UMLPackage.TIME_EXPRESSION :
-				return createTimeExpression();
-			case UMLPackage.COMMUNICATION_PATH :
-				return createCommunicationPath();
-			case UMLPackage.DEVICE :
-				return createDevice();
-			case UMLPackage.NODE :
-				return createNode();
-			case UMLPackage.EXECUTION_ENVIRONMENT :
-				return createExecutionEnvironment();
-			case UMLPackage.INFORMATION_FLOW :
-				return createInformationFlow();
-			case UMLPackage.MESSAGE :
-				return createMessage();
-			case UMLPackage.INTERACTION :
-				return createInteraction();
-			case UMLPackage.LIFELINE :
-				return createLifeline();
-			case UMLPackage.PART_DECOMPOSITION :
-				return createPartDecomposition();
-			case UMLPackage.INTERACTION_USE :
-				return createInteractionUse();
-			case UMLPackage.GATE :
-				return createGate();
-			case UMLPackage.INTERACTION_OPERAND :
-				return createInteractionOperand();
-			case UMLPackage.INTERACTION_CONSTRAINT :
-				return createInteractionConstraint();
-			case UMLPackage.GENERAL_ORDERING :
-				return createGeneralOrdering();
-			case UMLPackage.OCCURRENCE_SPECIFICATION :
-				return createOccurrenceSpecification();
-			case UMLPackage.INFORMATION_ITEM :
-				return createInformationItem();
-			case UMLPackage.ACTION_EXECUTION_SPECIFICATION :
-				return createActionExecutionSpecification();
-			case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION :
-				return createBehaviorExecutionSpecification();
-			case UMLPackage.COMBINED_FRAGMENT :
-				return createCombinedFragment();
-			case UMLPackage.CONSIDER_IGNORE_FRAGMENT :
-				return createConsiderIgnoreFragment();
-			case UMLPackage.CONTINUATION :
-				return createContinuation();
-			case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION :
-				return createDestructionOccurrenceSpecification();
-			case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION :
-				return createMessageOccurrenceSpecification();
-			case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION :
-				return createExecutionOccurrenceSpecification();
-			case UMLPackage.STATE_INVARIANT :
-				return createStateInvariant();
-			case UMLPackage.FINAL_STATE :
-				return createFinalState();
-			case UMLPackage.PROTOCOL_TRANSITION :
-				return createProtocolTransition();
-			case UMLPackage.ASSOCIATION_CLASS :
-				return createAssociationClass();
-			case UMLPackage.COMPONENT :
-				return createComponent();
-			case UMLPackage.COMPONENT_REALIZATION :
-				return createComponentRealization();
-			case UMLPackage.ACTOR :
-				return createActor();
-			case UMLPackage.DURATION :
-				return createDuration();
-			case UMLPackage.DURATION_CONSTRAINT :
-				return createDurationConstraint();
-			case UMLPackage.INTERVAL_CONSTRAINT :
-				return createIntervalConstraint();
-			case UMLPackage.INTERVAL :
-				return createInterval();
-			case UMLPackage.DURATION_INTERVAL :
-				return createDurationInterval();
-			case UMLPackage.DURATION_OBSERVATION :
-				return createDurationObservation();
-			case UMLPackage.LITERAL_BOOLEAN :
-				return createLiteralBoolean();
-			case UMLPackage.LITERAL_INTEGER :
-				return createLiteralInteger();
-			case UMLPackage.LITERAL_NULL :
-				return createLiteralNull();
-			case UMLPackage.LITERAL_REAL :
-				return createLiteralReal();
-			case UMLPackage.LITERAL_STRING :
-				return createLiteralString();
-			case UMLPackage.LITERAL_UNLIMITED_NATURAL :
-				return createLiteralUnlimitedNatural();
-			case UMLPackage.TIME_CONSTRAINT :
-				return createTimeConstraint();
-			case UMLPackage.TIME_INTERVAL :
-				return createTimeInterval();
-			case UMLPackage.TIME_OBSERVATION :
-				return createTimeObservation();
-			default :
-				throw new IllegalArgumentException("The class '" //$NON-NLS-1$
-					+ eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$
+		case UMLPackage.ACTIVITY:
+			return createActivity();
+		case UMLPackage.CLASS:
+			return createClass();
+		case UMLPackage.COMMENT:
+			return createComment();
+		case UMLPackage.STEREOTYPE:
+			return createStereotype();
+		case UMLPackage.IMAGE:
+			return createImage();
+		case UMLPackage.PROFILE:
+			return createProfile();
+		case UMLPackage.PACKAGE:
+			return createPackage();
+		case UMLPackage.TEMPLATE_PARAMETER:
+			return createTemplateParameter();
+		case UMLPackage.TEMPLATE_SIGNATURE:
+			return createTemplateSignature();
+		case UMLPackage.TEMPLATE_BINDING:
+			return createTemplateBinding();
+		case UMLPackage.TEMPLATE_PARAMETER_SUBSTITUTION:
+			return createTemplateParameterSubstitution();
+		case UMLPackage.ASSOCIATION:
+			return createAssociation();
+		case UMLPackage.PROPERTY:
+			return createProperty();
+		case UMLPackage.CONNECTOR_END:
+			return createConnectorEnd();
+		case UMLPackage.CONNECTABLE_ELEMENT_TEMPLATE_PARAMETER:
+			return createConnectableElementTemplateParameter();
+		case UMLPackage.DEPLOYMENT:
+			return createDeployment();
+		case UMLPackage.DEPENDENCY:
+			return createDependency();
+		case UMLPackage.DEPLOYMENT_SPECIFICATION:
+			return createDeploymentSpecification();
+		case UMLPackage.ARTIFACT:
+			return createArtifact();
+		case UMLPackage.MANIFESTATION:
+			return createManifestation();
+		case UMLPackage.ABSTRACTION:
+			return createAbstraction();
+		case UMLPackage.OPAQUE_EXPRESSION:
+			return createOpaqueExpression();
+		case UMLPackage.PARAMETER:
+			return createParameter();
+		case UMLPackage.OPERATION:
+			return createOperation();
+		case UMLPackage.PARAMETER_SET:
+			return createParameterSet();
+		case UMLPackage.CONSTRAINT:
+			return createConstraint();
+		case UMLPackage.DATA_TYPE:
+			return createDataType();
+		case UMLPackage.INTERFACE:
+			return createInterface();
+		case UMLPackage.RECEPTION:
+			return createReception();
+		case UMLPackage.SIGNAL:
+			return createSignal();
+		case UMLPackage.PROTOCOL_STATE_MACHINE:
+			return createProtocolStateMachine();
+		case UMLPackage.STATE_MACHINE:
+			return createStateMachine();
+		case UMLPackage.PSEUDOSTATE:
+			return createPseudostate();
+		case UMLPackage.REGION:
+			return createRegion();
+		case UMLPackage.STATE:
+			return createState();
+		case UMLPackage.CONNECTION_POINT_REFERENCE:
+			return createConnectionPointReference();
+		case UMLPackage.TRIGGER:
+			return createTrigger();
+		case UMLPackage.PORT:
+			return createPort();
+		case UMLPackage.TRANSITION:
+			return createTransition();
+		case UMLPackage.PROTOCOL_CONFORMANCE:
+			return createProtocolConformance();
+		case UMLPackage.OPERATION_TEMPLATE_PARAMETER:
+			return createOperationTemplateParameter();
+		case UMLPackage.PACKAGE_MERGE:
+			return createPackageMerge();
+		case UMLPackage.PROFILE_APPLICATION:
+			return createProfileApplication();
+		case UMLPackage.ENUMERATION:
+			return createEnumeration();
+		case UMLPackage.ENUMERATION_LITERAL:
+			return createEnumerationLiteral();
+		case UMLPackage.INSTANCE_SPECIFICATION:
+			return createInstanceSpecification();
+		case UMLPackage.SLOT:
+			return createSlot();
+		case UMLPackage.PRIMITIVE_TYPE:
+			return createPrimitiveType();
+		case UMLPackage.ELEMENT_IMPORT:
+			return createElementImport();
+		case UMLPackage.PACKAGE_IMPORT:
+			return createPackageImport();
+		case UMLPackage.EXTENSION:
+			return createExtension();
+		case UMLPackage.EXTENSION_END:
+			return createExtensionEnd();
+		case UMLPackage.MODEL:
+			return createModel();
+		case UMLPackage.STRING_EXPRESSION:
+			return createStringExpression();
+		case UMLPackage.EXPRESSION:
+			return createExpression();
+		case UMLPackage.USAGE:
+			return createUsage();
+		case UMLPackage.COLLABORATION_USE:
+			return createCollaborationUse();
+		case UMLPackage.COLLABORATION:
+			return createCollaboration();
+		case UMLPackage.CONNECTOR:
+			return createConnector();
+		case UMLPackage.GENERALIZATION:
+			return createGeneralization();
+		case UMLPackage.GENERALIZATION_SET:
+			return createGeneralizationSet();
+		case UMLPackage.REDEFINABLE_TEMPLATE_SIGNATURE:
+			return createRedefinableTemplateSignature();
+		case UMLPackage.USE_CASE:
+			return createUseCase();
+		case UMLPackage.EXTEND:
+			return createExtend();
+		case UMLPackage.EXTENSION_POINT:
+			return createExtensionPoint();
+		case UMLPackage.INCLUDE:
+			return createInclude();
+		case UMLPackage.SUBSTITUTION:
+			return createSubstitution();
+		case UMLPackage.REALIZATION:
+			return createRealization();
+		case UMLPackage.CLASSIFIER_TEMPLATE_PARAMETER:
+			return createClassifierTemplateParameter();
+		case UMLPackage.INTERFACE_REALIZATION:
+			return createInterfaceRealization();
+		case UMLPackage.ACTIVITY_PARTITION:
+			return createActivityPartition();
+		case UMLPackage.INTERRUPTIBLE_ACTIVITY_REGION:
+			return createInterruptibleActivityRegion();
+		case UMLPackage.STRUCTURED_ACTIVITY_NODE:
+			return createStructuredActivityNode();
+		case UMLPackage.EXCEPTION_HANDLER:
+			return createExceptionHandler();
+		case UMLPackage.INPUT_PIN:
+			return createInputPin();
+		case UMLPackage.OUTPUT_PIN:
+			return createOutputPin();
+		case UMLPackage.VARIABLE:
+			return createVariable();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION:
+			return createValueSpecificationAction();
+		case UMLPackage.LINK_END_DATA:
+			return createLinkEndData();
+		case UMLPackage.QUALIFIER_VALUE:
+			return createQualifierValue();
+		case UMLPackage.ACCEPT_CALL_ACTION:
+			return createAcceptCallAction();
+		case UMLPackage.ACCEPT_EVENT_ACTION:
+			return createAcceptEventAction();
+		case UMLPackage.ACTION_INPUT_PIN:
+			return createActionInputPin();
+		case UMLPackage.ADD_STRUCTURAL_FEATURE_VALUE_ACTION:
+			return createAddStructuralFeatureValueAction();
+		case UMLPackage.ADD_VARIABLE_VALUE_ACTION:
+			return createAddVariableValueAction();
+		case UMLPackage.BROADCAST_SIGNAL_ACTION:
+			return createBroadcastSignalAction();
+		case UMLPackage.CALL_BEHAVIOR_ACTION:
+			return createCallBehaviorAction();
+		case UMLPackage.CALL_OPERATION_ACTION:
+			return createCallOperationAction();
+		case UMLPackage.CLAUSE:
+			return createClause();
+		case UMLPackage.CLEAR_ASSOCIATION_ACTION:
+			return createClearAssociationAction();
+		case UMLPackage.CLEAR_STRUCTURAL_FEATURE_ACTION:
+			return createClearStructuralFeatureAction();
+		case UMLPackage.CLEAR_VARIABLE_ACTION:
+			return createClearVariableAction();
+		case UMLPackage.CONDITIONAL_NODE:
+			return createConditionalNode();
+		case UMLPackage.CREATE_LINK_ACTION:
+			return createCreateLinkAction();
+		case UMLPackage.LINK_END_CREATION_DATA:
+			return createLinkEndCreationData();
+		case UMLPackage.CREATE_LINK_OBJECT_ACTION:
+			return createCreateLinkObjectAction();
+		case UMLPackage.CREATE_OBJECT_ACTION:
+			return createCreateObjectAction();
+		case UMLPackage.DESTROY_LINK_ACTION:
+			return createDestroyLinkAction();
+		case UMLPackage.LINK_END_DESTRUCTION_DATA:
+			return createLinkEndDestructionData();
+		case UMLPackage.DESTROY_OBJECT_ACTION:
+			return createDestroyObjectAction();
+		case UMLPackage.EXPANSION_NODE:
+			return createExpansionNode();
+		case UMLPackage.EXPANSION_REGION:
+			return createExpansionRegion();
+		case UMLPackage.LOOP_NODE:
+			return createLoopNode();
+		case UMLPackage.OPAQUE_ACTION:
+			return createOpaqueAction();
+		case UMLPackage.RAISE_EXCEPTION_ACTION:
+			return createRaiseExceptionAction();
+		case UMLPackage.READ_EXTENT_ACTION:
+			return createReadExtentAction();
+		case UMLPackage.READ_IS_CLASSIFIED_OBJECT_ACTION:
+			return createReadIsClassifiedObjectAction();
+		case UMLPackage.READ_LINK_ACTION:
+			return createReadLinkAction();
+		case UMLPackage.READ_LINK_OBJECT_END_ACTION:
+			return createReadLinkObjectEndAction();
+		case UMLPackage.READ_LINK_OBJECT_END_QUALIFIER_ACTION:
+			return createReadLinkObjectEndQualifierAction();
+		case UMLPackage.READ_SELF_ACTION:
+			return createReadSelfAction();
+		case UMLPackage.READ_STRUCTURAL_FEATURE_ACTION:
+			return createReadStructuralFeatureAction();
+		case UMLPackage.READ_VARIABLE_ACTION:
+			return createReadVariableAction();
+		case UMLPackage.RECLASSIFY_OBJECT_ACTION:
+			return createReclassifyObjectAction();
+		case UMLPackage.REDUCE_ACTION:
+			return createReduceAction();
+		case UMLPackage.REMOVE_STRUCTURAL_FEATURE_VALUE_ACTION:
+			return createRemoveStructuralFeatureValueAction();
+		case UMLPackage.REMOVE_VARIABLE_VALUE_ACTION:
+			return createRemoveVariableValueAction();
+		case UMLPackage.REPLY_ACTION:
+			return createReplyAction();
+		case UMLPackage.SEND_OBJECT_ACTION:
+			return createSendObjectAction();
+		case UMLPackage.SEND_SIGNAL_ACTION:
+			return createSendSignalAction();
+		case UMLPackage.SEQUENCE_NODE:
+			return createSequenceNode();
+		case UMLPackage.START_CLASSIFIER_BEHAVIOR_ACTION:
+			return createStartClassifierBehaviorAction();
+		case UMLPackage.START_OBJECT_BEHAVIOR_ACTION:
+			return createStartObjectBehaviorAction();
+		case UMLPackage.TEST_IDENTITY_ACTION:
+			return createTestIdentityAction();
+		case UMLPackage.UNMARSHALL_ACTION:
+			return createUnmarshallAction();
+		case UMLPackage.VALUE_PIN:
+			return createValuePin();
+		case UMLPackage.ACTIVITY_FINAL_NODE:
+			return createActivityFinalNode();
+		case UMLPackage.ACTIVITY_PARAMETER_NODE:
+			return createActivityParameterNode();
+		case UMLPackage.CENTRAL_BUFFER_NODE:
+			return createCentralBufferNode();
+		case UMLPackage.CONTROL_FLOW:
+			return createControlFlow();
+		case UMLPackage.DATA_STORE_NODE:
+			return createDataStoreNode();
+		case UMLPackage.DECISION_NODE:
+			return createDecisionNode();
+		case UMLPackage.OBJECT_FLOW:
+			return createObjectFlow();
+		case UMLPackage.FLOW_FINAL_NODE:
+			return createFlowFinalNode();
+		case UMLPackage.FORK_NODE:
+			return createForkNode();
+		case UMLPackage.INITIAL_NODE:
+			return createInitialNode();
+		case UMLPackage.JOIN_NODE:
+			return createJoinNode();
+		case UMLPackage.MERGE_NODE:
+			return createMergeNode();
+		case UMLPackage.INSTANCE_VALUE:
+			return createInstanceValue();
+		case UMLPackage.ANY_RECEIVE_EVENT:
+			return createAnyReceiveEvent();
+		case UMLPackage.CALL_EVENT:
+			return createCallEvent();
+		case UMLPackage.CHANGE_EVENT:
+			return createChangeEvent();
+		case UMLPackage.FUNCTION_BEHAVIOR:
+			return createFunctionBehavior();
+		case UMLPackage.OPAQUE_BEHAVIOR:
+			return createOpaqueBehavior();
+		case UMLPackage.SIGNAL_EVENT:
+			return createSignalEvent();
+		case UMLPackage.TIME_EVENT:
+			return createTimeEvent();
+		case UMLPackage.TIME_EXPRESSION:
+			return createTimeExpression();
+		case UMLPackage.COMMUNICATION_PATH:
+			return createCommunicationPath();
+		case UMLPackage.DEVICE:
+			return createDevice();
+		case UMLPackage.NODE:
+			return createNode();
+		case UMLPackage.EXECUTION_ENVIRONMENT:
+			return createExecutionEnvironment();
+		case UMLPackage.INFORMATION_FLOW:
+			return createInformationFlow();
+		case UMLPackage.MESSAGE:
+			return createMessage();
+		case UMLPackage.INTERACTION:
+			return createInteraction();
+		case UMLPackage.LIFELINE:
+			return createLifeline();
+		case UMLPackage.PART_DECOMPOSITION:
+			return createPartDecomposition();
+		case UMLPackage.INTERACTION_USE:
+			return createInteractionUse();
+		case UMLPackage.GATE:
+			return createGate();
+		case UMLPackage.INTERACTION_OPERAND:
+			return createInteractionOperand();
+		case UMLPackage.INTERACTION_CONSTRAINT:
+			return createInteractionConstraint();
+		case UMLPackage.GENERAL_ORDERING:
+			return createGeneralOrdering();
+		case UMLPackage.OCCURRENCE_SPECIFICATION:
+			return createOccurrenceSpecification();
+		case UMLPackage.INFORMATION_ITEM:
+			return createInformationItem();
+		case UMLPackage.ACTION_EXECUTION_SPECIFICATION:
+			return createActionExecutionSpecification();
+		case UMLPackage.BEHAVIOR_EXECUTION_SPECIFICATION:
+			return createBehaviorExecutionSpecification();
+		case UMLPackage.COMBINED_FRAGMENT:
+			return createCombinedFragment();
+		case UMLPackage.CONSIDER_IGNORE_FRAGMENT:
+			return createConsiderIgnoreFragment();
+		case UMLPackage.CONTINUATION:
+			return createContinuation();
+		case UMLPackage.DESTRUCTION_OCCURRENCE_SPECIFICATION:
+			return createDestructionOccurrenceSpecification();
+		case UMLPackage.MESSAGE_OCCURRENCE_SPECIFICATION:
+			return createMessageOccurrenceSpecification();
+		case UMLPackage.EXECUTION_OCCURRENCE_SPECIFICATION:
+			return createExecutionOccurrenceSpecification();
+		case UMLPackage.STATE_INVARIANT:
+			return createStateInvariant();
+		case UMLPackage.FINAL_STATE:
+			return createFinalState();
+		case UMLPackage.PROTOCOL_TRANSITION:
+			return createProtocolTransition();
+		case UMLPackage.ASSOCIATION_CLASS:
+			return createAssociationClass();
+		case UMLPackage.COMPONENT:
+			return createComponent();
+		case UMLPackage.COMPONENT_REALIZATION:
+			return createComponentRealization();
+		case UMLPackage.ACTOR:
+			return createActor();
+		case UMLPackage.DURATION:
+			return createDuration();
+		case UMLPackage.DURATION_CONSTRAINT:
+			return createDurationConstraint();
+		case UMLPackage.INTERVAL_CONSTRAINT:
+			return createIntervalConstraint();
+		case UMLPackage.INTERVAL:
+			return createInterval();
+		case UMLPackage.DURATION_INTERVAL:
+			return createDurationInterval();
+		case UMLPackage.DURATION_OBSERVATION:
+			return createDurationObservation();
+		case UMLPackage.LITERAL_BOOLEAN:
+			return createLiteralBoolean();
+		case UMLPackage.LITERAL_INTEGER:
+			return createLiteralInteger();
+		case UMLPackage.LITERAL_NULL:
+			return createLiteralNull();
+		case UMLPackage.LITERAL_REAL:
+			return createLiteralReal();
+		case UMLPackage.LITERAL_STRING:
+			return createLiteralString();
+		case UMLPackage.LITERAL_UNLIMITED_NATURAL:
+			return createLiteralUnlimitedNatural();
+		case UMLPackage.TIME_CONSTRAINT:
+			return createTimeConstraint();
+		case UMLPackage.TIME_INTERVAL:
+			return createTimeInterval();
+		case UMLPackage.TIME_OBSERVATION:
+			return createTimeObservation();
+		default:
+			throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
 		}
 	}
 
@@ -676,40 +675,34 @@
 	@Override
 	public Object createFromString(EDataType eDataType, String initialValue) {
 		switch (eDataType.getClassifierID()) {
-			case UMLPackage.VISIBILITY_KIND :
-				return createVisibilityKindFromString(eDataType, initialValue);
-			case UMLPackage.PARAMETER_DIRECTION_KIND :
-				return createParameterDirectionKindFromString(eDataType,
-					initialValue);
-			case UMLPackage.PARAMETER_EFFECT_KIND :
-				return createParameterEffectKindFromString(eDataType,
-					initialValue);
-			case UMLPackage.CALL_CONCURRENCY_KIND :
-				return createCallConcurrencyKindFromString(eDataType,
-					initialValue);
-			case UMLPackage.TRANSITION_KIND :
-				return createTransitionKindFromString(eDataType, initialValue);
-			case UMLPackage.PSEUDOSTATE_KIND :
-				return createPseudostateKindFromString(eDataType, initialValue);
-			case UMLPackage.AGGREGATION_KIND :
-				return createAggregationKindFromString(eDataType, initialValue);
-			case UMLPackage.CONNECTOR_KIND :
-				return createConnectorKindFromString(eDataType, initialValue);
-			case UMLPackage.OBJECT_NODE_ORDERING_KIND :
-				return createObjectNodeOrderingKindFromString(eDataType,
-					initialValue);
-			case UMLPackage.EXPANSION_KIND :
-				return createExpansionKindFromString(eDataType, initialValue);
-			case UMLPackage.MESSAGE_KIND :
-				return createMessageKindFromString(eDataType, initialValue);
-			case UMLPackage.MESSAGE_SORT :
-				return createMessageSortFromString(eDataType, initialValue);
-			case UMLPackage.INTERACTION_OPERATOR_KIND :
-				return createInteractionOperatorKindFromString(eDataType,
-					initialValue);
-			default :
-				throw new IllegalArgumentException("The datatype '" //$NON-NLS-1$
-					+ eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$
+		case UMLPackage.VISIBILITY_KIND:
+			return createVisibilityKindFromString(eDataType, initialValue);
+		case UMLPackage.PARAMETER_DIRECTION_KIND:
+			return createParameterDirectionKindFromString(eDataType, initialValue);
+		case UMLPackage.PARAMETER_EFFECT_KIND:
+			return createParameterEffectKindFromString(eDataType, initialValue);
+		case UMLPackage.CALL_CONCURRENCY_KIND:
+			return createCallConcurrencyKindFromString(eDataType, initialValue);
+		case UMLPackage.TRANSITION_KIND:
+			return createTransitionKindFromString(eDataType, initialValue);
+		case UMLPackage.PSEUDOSTATE_KIND:
+			return createPseudostateKindFromString(eDataType, initialValue);
+		case UMLPackage.AGGREGATION_KIND:
+			return createAggregationKindFromString(eDataType, initialValue);
+		case UMLPackage.CONNECTOR_KIND:
+			return createConnectorKindFromString(eDataType, initialValue);
+		case UMLPackage.OBJECT_NODE_ORDERING_KIND:
+			return createObjectNodeOrderingKindFromString(eDataType, initialValue);
+		case UMLPackage.EXPANSION_KIND:
+			return createExpansionKindFromString(eDataType, initialValue);
+		case UMLPackage.MESSAGE_KIND:
+			return createMessageKindFromString(eDataType, initialValue);
+		case UMLPackage.MESSAGE_SORT:
+			return createMessageSortFromString(eDataType, initialValue);
+		case UMLPackage.INTERACTION_OPERATOR_KIND:
+			return createInteractionOperatorKindFromString(eDataType, initialValue);
+		default:
+			throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
 		}
 	}
 
@@ -721,40 +714,34 @@
 	@Override
 	public String convertToString(EDataType eDataType, Object instanceValue) {
 		switch (eDataType.getClassifierID()) {
-			case UMLPackage.VISIBILITY_KIND :
-				return convertVisibilityKindToString(eDataType, instanceValue);
-			case UMLPackage.PARAMETER_DIRECTION_KIND :
-				return convertParameterDirectionKindToString(eDataType,
-					instanceValue);
-			case UMLPackage.PARAMETER_EFFECT_KIND :
-				return convertParameterEffectKindToString(eDataType,
-					instanceValue);
-			case UMLPackage.CALL_CONCURRENCY_KIND :
-				return convertCallConcurrencyKindToString(eDataType,
-					instanceValue);
-			case UMLPackage.TRANSITION_KIND :
-				return convertTransitionKindToString(eDataType, instanceValue);
-			case UMLPackage.PSEUDOSTATE_KIND :
-				return convertPseudostateKindToString(eDataType, instanceValue);
-			case UMLPackage.AGGREGATION_KIND :
-				return convertAggregationKindToString(eDataType, instanceValue);
-			case UMLPackage.CONNECTOR_KIND :
-				return convertConnectorKindToString(eDataType, instanceValue);
-			case UMLPackage.OBJECT_NODE_ORDERING_KIND :
-				return convertObjectNodeOrderingKindToString(eDataType,
-					instanceValue);
-			case UMLPackage.EXPANSION_KIND :
-				return convertExpansionKindToString(eDataType, instanceValue);
-			case UMLPackage.MESSAGE_KIND :
-				return convertMessageKindToString(eDataType, instanceValue);
-			case UMLPackage.MESSAGE_SORT :
-				return convertMessageSortToString(eDataType, instanceValue);
-			case UMLPackage.INTERACTION_OPERATOR_KIND :
-				return convertInteractionOperatorKindToString(eDataType,
-					instanceValue);
-			default :
-				throw new IllegalArgumentException("The datatype '" //$NON-NLS-1$
-					+ eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$
+		case UMLPackage.VISIBILITY_KIND:
+			return convertVisibilityKindToString(eDataType, instanceValue);
+		case UMLPackage.PARAMETER_DIRECTION_KIND:
+			return convertParameterDirectionKindToString(eDataType, instanceValue);
+		case UMLPackage.PARAMETER_EFFECT_KIND:
+			return convertParameterEffectKindToString(eDataType, instanceValue);
+		case UMLPackage.CALL_CONCURRENCY_KIND:
+			return convertCallConcurrencyKindToString(eDataType, instanceValue);
+		case UMLPackage.TRANSITION_KIND:
+			return convertTransitionKindToString(eDataType, instanceValue);
+		case UMLPackage.PSEUDOSTATE_KIND:
+			return convertPseudostateKindToString(eDataType, instanceValue);
+		case UMLPackage.AGGREGATION_KIND:
+			return convertAggregationKindToString(eDataType, instanceValue);
+		case UMLPackage.CONNECTOR_KIND:
+			return convertConnectorKindToString(eDataType, instanceValue);
+		case UMLPackage.OBJECT_NODE_ORDERING_KIND:
+			return convertObjectNodeOrderingKindToString(eDataType, instanceValue);
+		case UMLPackage.EXPANSION_KIND:
+			return convertExpansionKindToString(eDataType, instanceValue);
+		case UMLPackage.MESSAGE_KIND:
+			return convertMessageKindToString(eDataType, instanceValue);
+		case UMLPackage.MESSAGE_SORT:
+			return convertMessageSortToString(eDataType, instanceValue);
+		case UMLPackage.INTERACTION_OPERATOR_KIND:
+			return convertInteractionOperatorKindToString(eDataType, instanceValue);
+		default:
+			throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
 		}
 	}
 
@@ -2697,9 +2684,7 @@
 			String initialValue) {
 		VisibilityKind result = VisibilityKind.get(initialValue);
 		if (result == null)
-			throw new IllegalArgumentException("The value '" + initialValue //$NON-NLS-1$
-				+ "' is not a valid enumerator of '" + eDataType.getName() //$NON-NLS-1$
-				+ "'"); //$NON-NLS-1$
+			throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		return result;
 	}
 
@@ -2710,9 +2695,7 @@
 	 */
 	public String convertVisibilityKindToString(EDataType eDataType,
 			Object instanceValue) {
-		return instanceValue == null
-			? null
-			: instanceValue.toString();
+		return instanceValue == null ? null : instanceValue.toString();
 	}
 
 	/**
@@ -2724,9 +2707,7 @@
 			EDataType eDataType, String initialValue) {
 		CallConcurrencyKind result = CallConcurrencyKind.get(initialValue);
 		if (result == null)
-			throw new IllegalArgumentException("The value '" + initialValue //$NON-NLS-1$
-				+ "' is not a valid enumerator of '" + eDataType.getName() //$NON-NLS-1$
-				+ "'"); //$NON-NLS-1$
+			throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		return result;
 	}
 
@@ -2737,9 +2718,7 @@
 	 */
 	public String convertCallConcurrencyKindToString(EDataType eDataType,
 			Object instanceValue) {
-		return instanceValue == null
-			? null
-			: instanceValue.toString();
+		return instanceValue == null ? null : instanceValue.toString();
 	}
 
 	/**
@@ -2751,9 +2730,7 @@
 			String initialValue) {
 		TransitionKind result = TransitionKind.get(initialValue);
 		if (result == null)
-			throw new IllegalArgumentException("The value '" + initialValue //$NON-NLS-1$
-				+ "' is not a valid enumerator of '" + eDataType.getName() //$NON-NLS-1$
-				+ "'"); //$NON-NLS-1$
+			throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		return result;
 	}
 
@@ -2764,9 +2741,7 @@
 	 */
 	public String convertTransitionKindToString(EDataType eDataType,
 			Object instanceValue) {
-		return instanceValue == null
-			? null
-			: instanceValue.toString();
+		return instanceValue == null ? null : instanceValue.toString();
 	}
 
 	/**
@@ -2778,9 +2753,7 @@
 			String initialValue) {
 		PseudostateKind result = PseudostateKind.get(initialValue);
 		if (result == null)
-			throw new IllegalArgumentException("The value '" + initialValue //$NON-NLS-1$
-				+ "' is not a valid enumerator of '" + eDataType.getName() //$NON-NLS-1$
-				+ "'"); //$NON-NLS-1$
+			throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		return result;
 	}
 
@@ -2791,9 +2764,7 @@
 	 */
 	public String convertPseudostateKindToString(EDataType eDataType,
 			Object instanceValue) {
-		return instanceValue == null
-			? null
-			: instanceValue.toString();
+		return instanceValue == null ? null : instanceValue.toString();
 	}
 
 	/**
@@ -2805,9 +2776,7 @@
 			String initialValue) {
 		AggregationKind result = AggregationKind.get(initialValue);
 		if (result == null)
-			throw new IllegalArgumentException("The value '" + initialValue //$NON-NLS-1$
-				+ "' is not a valid enumerator of '" + eDataType.getName() //$NON-NLS-1$
-				+ "'"); //$NON-NLS-1$
+			throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		return result;
 	}
 
@@ -2818,9 +2787,7 @@
 	 */
 	public String convertAggregationKindToString(EDataType eDataType,
 			Object instanceValue) {
-		return instanceValue == null
-			? null
-			: instanceValue.toString();
+		return instanceValue == null ? null : instanceValue.toString();
 	}
 
 	/**
@@ -2830,12 +2797,9 @@
 	 */
 	public ParameterDirectionKind createParameterDirectionKindFromString(
 			EDataType eDataType, String initialValue) {
-		ParameterDirectionKind result = ParameterDirectionKind
-			.get(initialValue);
+		ParameterDirectionKind result = ParameterDirectionKind.get(initialValue);
 		if (result == null)
-			throw new IllegalArgumentException("The value '" + initialValue //$NON-NLS-1$
-				+ "' is not a valid enumerator of '" + eDataType.getName() //$NON-NLS-1$
-				+ "'"); //$NON-NLS-1$
+			throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		return result;
 	}
 
@@ -2846,9 +2810,7 @@
 	 */
 	public String convertParameterDirectionKindToString(EDataType eDataType,
 			Object instanceValue) {
-		return instanceValue == null
-			? null
-			: instanceValue.toString();
+		return instanceValue == null ? null : instanceValue.toString();
 	}
 
 	/**
@@ -2860,9 +2822,7 @@
 			EDataType eDataType, String initialValue) {
 		ParameterEffectKind result = ParameterEffectKind.get(initialValue);
 		if (result == null)
-			throw new IllegalArgumentException("The value '" + initialValue //$NON-NLS-1$
-				+ "' is not a valid enumerator of '" + eDataType.getName() //$NON-NLS-1$
-				+ "'"); //$NON-NLS-1$
+			throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		return result;
 	}
 
@@ -2873,9 +2833,7 @@
 	 */
 	public String convertParameterEffectKindToString(EDataType eDataType,
 			Object instanceValue) {
-		return instanceValue == null
-			? null
-			: instanceValue.toString();
+		return instanceValue == null ? null : instanceValue.toString();
 	}
 
 	/**
@@ -2887,9 +2845,7 @@
 			String initialValue) {
 		ConnectorKind result = ConnectorKind.get(initialValue);
 		if (result == null)
-			throw new IllegalArgumentException("The value '" + initialValue //$NON-NLS-1$
-				+ "' is not a valid enumerator of '" + eDataType.getName() //$NON-NLS-1$
-				+ "'"); //$NON-NLS-1$
+			throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		return result;
 	}
 
@@ -2900,9 +2856,7 @@
 	 */
 	public String convertConnectorKindToString(EDataType eDataType,
 			Object instanceValue) {
-		return instanceValue == null
-			? null
-			: instanceValue.toString();
+		return instanceValue == null ? null : instanceValue.toString();
 	}
 
 	/**
@@ -2914,9 +2868,7 @@
 			String initialValue) {
 		MessageKind result = MessageKind.get(initialValue);
 		if (result == null)
-			throw new IllegalArgumentException("The value '" + initialValue //$NON-NLS-1$
-				+ "' is not a valid enumerator of '" + eDataType.getName() //$NON-NLS-1$
-				+ "'"); //$NON-NLS-1$
+			throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		return result;
 	}
 
@@ -2927,9 +2879,7 @@
 	 */
 	public String convertMessageKindToString(EDataType eDataType,
 			Object instanceValue) {
-		return instanceValue == null
-			? null
-			: instanceValue.toString();
+		return instanceValue == null ? null : instanceValue.toString();
 	}
 
 	/**
@@ -2941,9 +2891,7 @@
 			String initialValue) {
 		MessageSort result = MessageSort.get(initialValue);
 		if (result == null)
-			throw new IllegalArgumentException("The value '" + initialValue //$NON-NLS-1$
-				+ "' is not a valid enumerator of '" + eDataType.getName() //$NON-NLS-1$
-				+ "'"); //$NON-NLS-1$
+			throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		return result;
 	}
 
@@ -2954,9 +2902,7 @@
 	 */
 	public String convertMessageSortToString(EDataType eDataType,
 			Object instanceValue) {
-		return instanceValue == null
-			? null
-			: instanceValue.toString();
+		return instanceValue == null ? null : instanceValue.toString();
 	}
 
 	/**
@@ -2966,12 +2912,9 @@
 	 */
 	public ObjectNodeOrderingKind createObjectNodeOrderingKindFromString(
 			EDataType eDataType, String initialValue) {
-		ObjectNodeOrderingKind result = ObjectNodeOrderingKind
-			.get(initialValue);
+		ObjectNodeOrderingKind result = ObjectNodeOrderingKind.get(initialValue);
 		if (result == null)
-			throw new IllegalArgumentException("The value '" + initialValue //$NON-NLS-1$
-				+ "' is not a valid enumerator of '" + eDataType.getName() //$NON-NLS-1$
-				+ "'"); //$NON-NLS-1$
+			throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		return result;
 	}
 
@@ -2982,9 +2925,7 @@
 	 */
 	public String convertObjectNodeOrderingKindToString(EDataType eDataType,
 			Object instanceValue) {
-		return instanceValue == null
-			? null
-			: instanceValue.toString();
+		return instanceValue == null ? null : instanceValue.toString();
 	}
 
 	/**
@@ -2994,12 +2935,9 @@
 	 */
 	public InteractionOperatorKind createInteractionOperatorKindFromString(
 			EDataType eDataType, String initialValue) {
-		InteractionOperatorKind result = InteractionOperatorKind
-			.get(initialValue);
+		InteractionOperatorKind result = InteractionOperatorKind.get(initialValue);
 		if (result == null)
-			throw new IllegalArgumentException("The value '" + initialValue //$NON-NLS-1$
-				+ "' is not a valid enumerator of '" + eDataType.getName() //$NON-NLS-1$
-				+ "'"); //$NON-NLS-1$
+			throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		return result;
 	}
 
@@ -3010,9 +2948,7 @@
 	 */
 	public String convertInteractionOperatorKindToString(EDataType eDataType,
 			Object instanceValue) {
-		return instanceValue == null
-			? null
-			: instanceValue.toString();
+		return instanceValue == null ? null : instanceValue.toString();
 	}
 
 	/**
@@ -3024,9 +2960,7 @@
 			String initialValue) {
 		ExpansionKind result = ExpansionKind.get(initialValue);
 		if (result == null)
-			throw new IllegalArgumentException("The value '" + initialValue //$NON-NLS-1$
-				+ "' is not a valid enumerator of '" + eDataType.getName() //$NON-NLS-1$
-				+ "'"); //$NON-NLS-1$
+			throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		return result;
 	}
 
@@ -3037,9 +2971,7 @@
 	 */
 	public String convertExpansionKindToString(EDataType eDataType,
 			Object instanceValue) {
-		return instanceValue == null
-			? null
-			: instanceValue.toString();
+		return instanceValue == null ? null : instanceValue.toString();
 	}
 
 	/**
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UMLPackageImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UMLPackageImpl.java
deleted file mode 100644
index a65cc07..0000000
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UMLPackageImpl.java
+++ /dev/null
@@ -1,17573 +0,0 @@
-/*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - initial API and implementation
- *   Kenn Hussey (Embarcadero Technologies) - 205188, 247980
- *   Kenn Hussey - 286329, 323181, 485764
- *   Kenn Hussey (CEA) - 327039, 351774, 366083, 382637, 297216, 418466, 485756
- *
- */
-package org.eclipse.uml2.uml.cdo.internal.impl;
-
-import java.io.IOException;
-
-import java.net.URL;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EOperation;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EValidator;
-
-import org.eclipse.emf.ecore.EcorePackage;
-
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-
-import org.eclipse.emf.ecore.resource.Resource;
-
-import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;
-
-import org.eclipse.uml2.types.TypesPackage;
-import org.eclipse.uml2.uml.UMLFactory;
-import org.eclipse.uml2.uml.UMLPackage;
-
-import org.eclipse.uml2.uml.util.UMLValidator;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class UMLPackageImpl
-		extends EPackageImpl
-		implements UMLPackage {
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected String packageFilename = "uml.ecore"; //$NON-NLS-1$
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass activityContentEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass commentEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass elementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass directedRelationshipEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass relationshipEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass literalSpecificationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass valueSpecificationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass typedElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass namedElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass dependencyEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass packageableElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass parameterableElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass templateParameterEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass templateSignatureEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass templateableElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass templateBindingEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass templateParameterSubstitutionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass namespaceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass elementImportEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass packageImportEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass packageEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass packageMergeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass typeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass profileApplicationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass profileEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass stereotypeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass classEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass behavioredClassifierEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass classifierEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass redefinableElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass generalizationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass generalizationSetEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass featureEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass useCaseEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass includeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass extendEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass constraintEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass extensionPointEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass substitutionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass realizationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass abstractionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass opaqueExpressionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass parameterEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass multiplicityElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass connectableElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass connectorEndEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass propertyEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass deploymentTargetEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass deploymentEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass deployedArtifactEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass deploymentSpecificationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass artifactEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass manifestationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass operationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass behavioralFeatureEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass behaviorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass parameterSetEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass dataTypeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass interfaceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass receptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass signalEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass protocolStateMachineEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass stateMachineEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass regionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass vertexEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass transitionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass triggerEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass eventEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass portEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass stateEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass connectionPointReferenceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass pseudostateEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass protocolConformanceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass operationTemplateParameterEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass structuralFeatureEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass associationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass connectableElementTemplateParameterEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass collaborationUseEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass collaborationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass structuredClassifierEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass connectorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass redefinableTemplateSignatureEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass classifierTemplateParameterEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass interfaceRealizationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass encapsulatedClassifierEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass extensionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass extensionEndEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass imageEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass stringExpressionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass expressionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass literalIntegerEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass literalStringEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass literalBooleanEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass literalNullEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass literalRealEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass slotEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass instanceSpecificationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass enumerationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass enumerationLiteralEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass primitiveTypeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass instanceValueEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass literalUnlimitedNaturalEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass opaqueBehaviorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass functionBehaviorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass actorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass usageEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass messageEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass messageEndEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass interactionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass interactionFragmentEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass lifelineEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass partDecompositionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass interactionUseEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass gateEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass actionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass executableNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass activityNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass activityEdgeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass activityEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass activityPartitionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass activityGroupEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass structuredActivityNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass variableEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass interruptibleActivityRegionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass exceptionHandlerEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass objectNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass outputPinEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass pinEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass inputPinEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass generalOrderingEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass occurrenceSpecificationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass interactionOperandEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass interactionConstraintEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass executionSpecificationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass executionOccurrenceSpecificationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass stateInvariantEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass actionExecutionSpecificationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass behaviorExecutionSpecificationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass messageEventEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass messageOccurrenceSpecificationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass combinedFragmentEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass continuationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass considerIgnoreFragmentEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass callEventEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass changeEventEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass signalEventEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass anyReceiveEventEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass createObjectActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass destroyObjectActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass destructionOccurrenceSpecificationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass testIdentityActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass readSelfActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass structuralFeatureActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass readStructuralFeatureActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass writeStructuralFeatureActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass clearStructuralFeatureActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass removeStructuralFeatureValueActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass addStructuralFeatureValueActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass linkActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass linkEndDataEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass qualifierValueEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass readLinkActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass linkEndCreationDataEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass createLinkActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass writeLinkActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass destroyLinkActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass linkEndDestructionDataEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass clearAssociationActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass broadcastSignalActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass invocationActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass sendObjectActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass valueSpecificationActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass timeExpressionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass observationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass durationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass valuePinEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass durationIntervalEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass intervalEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass timeConstraintEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass intervalConstraintEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass timeIntervalEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass durationConstraintEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass timeObservationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass durationObservationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass opaqueActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass callActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass sendSignalActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass callOperationActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass callBehaviorActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass informationItemEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass informationFlowEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass modelEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass variableActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass readVariableActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass writeVariableActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass clearVariableActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass addVariableValueActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass removeVariableValueActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass raiseExceptionActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass actionInputPinEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass readExtentActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass reclassifyObjectActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass readIsClassifiedObjectActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass startClassifierBehaviorActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass readLinkObjectEndActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass readLinkObjectEndQualifierActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass createLinkObjectActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass acceptEventActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass acceptCallActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass replyActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass unmarshallActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass reduceActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass startObjectBehaviorActionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass controlNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass controlFlowEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass initialNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass activityParameterNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass forkNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass flowFinalNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass finalNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass centralBufferNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass mergeNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass decisionNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass activityFinalNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass joinNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass dataStoreNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass objectFlowEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass sequenceNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass conditionalNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass clauseEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass loopNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass expansionNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass expansionRegionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass componentRealizationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass componentEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass nodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass deviceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass executionEnvironmentEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass communicationPathEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass finalStateEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass timeEventEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass protocolTransitionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass associationClassEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum visibilityKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum callConcurrencyKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum transitionKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum pseudostateKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum aggregationKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum parameterDirectionKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum parameterEffectKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum connectorKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum messageKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum messageSortEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum objectNodeOrderingKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum interactionOperatorKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum expansionKindEEnum = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.uml2.uml.UMLPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private UMLPackageImpl() {
-		super(eNS_URI, UMLFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
-	 *
-	 * <p>This method is used to initialize {@link UMLPackage#eINSTANCE} when that field is accessed.
-	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @generated
-	 */
-	public static UMLPackage init() {
-		if (isInited)
-			return (UMLPackage) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI);
-
-		// Obtain or create and register package
-		Object registeredUMLPackage = EPackage.Registry.INSTANCE.get(eNS_URI);
-		UMLPackageImpl theUMLPackage = registeredUMLPackage instanceof UMLPackageImpl
-			? (UMLPackageImpl) registeredUMLPackage
-			: new UMLPackageImpl();
-
-		isInited = true;
-
-		// Initialize simple dependencies
-		EcorePackage.eINSTANCE.eClass();
-		TypesPackage.eINSTANCE.eClass();
-
-		// Load packages
-		theUMLPackage.loadPackage();
-
-		// Fix loaded packages
-		theUMLPackage.fixPackageContents();
-
-		// Register package validator
-		EValidator.Registry.INSTANCE.put(theUMLPackage,
-			new EValidator.Descriptor() {
-
-				public EValidator getEValidator() {
-					return UMLValidator.INSTANCE;
-				}
-			});
-
-		// Mark meta-data to indicate it can't be changed
-		theUMLPackage.freeze();
-
-		// Update the registry and return the package
-		EPackage.Registry.INSTANCE.put(UMLPackage.eNS_URI, theUMLPackage);
-		return theUMLPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActivityContent() {
-		if (activityContentEClass == null) {
-			activityContentEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(0);
-		}
-		return activityContentEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActivityContent__ContainingActivity() {
-		return getActivityContent().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getComment() {
-		if (commentEClass == null) {
-			commentEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(9);
-		}
-		return commentEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComment_Body() {
-		return (EAttribute) getComment().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComment_AnnotatedElement() {
-		return (EReference) getComment().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getElement() {
-		if (elementEClass == null) {
-			elementEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(8);
-		}
-		return elementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getElement_OwnedElement() {
-		return (EReference) getElement().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getElement_Owner() {
-		return (EReference) getElement().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getElement_OwnedComment() {
-		return (EReference) getElement().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__ValidateNotOwnSelf__DiagnosticChain_Map() {
-		return getElement().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__ValidateHasOwner__DiagnosticChain_Map() {
-		return getElement().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__Destroy() {
-		return getElement().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__HasKeyword__String() {
-		return getElement().getEOperations().get(26);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetKeywords() {
-		return getElement().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__AddKeyword__String() {
-		return getElement().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__RemoveKeyword__String() {
-		return getElement().getEOperations().get(31);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetNearestPackage() {
-		return getElement().getEOperations().get(14);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetModel() {
-		return getElement().getEOperations().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__IsStereotypeApplicable__Stereotype() {
-		return getElement().getEOperations().get(28);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__IsStereotypeRequired__Stereotype() {
-		return getElement().getEOperations().get(30);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__IsStereotypeApplied__Stereotype() {
-		return getElement().getEOperations().get(29);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__ApplyStereotype__Stereotype() {
-		return getElement().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__UnapplyStereotype__Stereotype() {
-		return getElement().getEOperations().get(33);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetApplicableStereotypes() {
-		return getElement().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetApplicableStereotype__String() {
-		return getElement().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetStereotypeApplications() {
-		return getElement().getEOperations().get(22);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetStereotypeApplication__Stereotype() {
-		return getElement().getEOperations().get(21);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetRequiredStereotypes() {
-		return getElement().getEOperations().get(18);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetRequiredStereotype__String() {
-		return getElement().getEOperations().get(17);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetAppliedStereotypes() {
-		return getElement().getEOperations().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetAppliedStereotype__String() {
-		return getElement().getEOperations().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetAppliedSubstereotypes__Stereotype() {
-		return getElement().getEOperations().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetAppliedSubstereotype__Stereotype_String() {
-		return getElement().getEOperations().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__HasValue__Stereotype_String() {
-		return getElement().getEOperations().get(27);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetValue__Stereotype_String() {
-		return getElement().getEOperations().get(25);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__SetValue__Stereotype_String_Object() {
-		return getElement().getEOperations().get(32);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__CreateEAnnotation__String() {
-		return getElement().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetRelationships() {
-		return getElement().getEOperations().get(15);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetRelationships__EClass() {
-		return getElement().getEOperations().get(16);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetSourceDirectedRelationships() {
-		return getElement().getEOperations().get(19);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetSourceDirectedRelationships__EClass() {
-		return getElement().getEOperations().get(20);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetTargetDirectedRelationships() {
-		return getElement().getEOperations().get(23);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__GetTargetDirectedRelationships__EClass() {
-		return getElement().getEOperations().get(24);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__AllOwnedElements() {
-		return getElement().getEOperations().get(34);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElement__MustBeOwned() {
-		return getElement().getEOperations().get(35);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDirectedRelationship() {
-		if (directedRelationshipEClass == null) {
-			directedRelationshipEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(20);
-		}
-		return directedRelationshipEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDirectedRelationship_Source() {
-		return (EReference) getDirectedRelationship().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDirectedRelationship_Target() {
-		return (EReference) getDirectedRelationship().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRelationship() {
-		if (relationshipEClass == null) {
-			relationshipEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(21);
-		}
-		return relationshipEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRelationship_RelatedElement() {
-		return (EReference) getRelationship().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLiteralSpecification() {
-		if (literalSpecificationEClass == null) {
-			literalSpecificationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(247);
-		}
-		return literalSpecificationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValueSpecification() {
-		if (valueSpecificationEClass == null) {
-			valueSpecificationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(31);
-		}
-		return valueSpecificationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getValueSpecification__IsComputable() {
-		return getValueSpecification().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getValueSpecification__IntegerValue() {
-		return getValueSpecification().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getValueSpecification__BooleanValue() {
-		return getValueSpecification().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getValueSpecification__StringValue() {
-		return getValueSpecification().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getValueSpecification__UnlimitedValue() {
-		return getValueSpecification().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getValueSpecification__IsNull() {
-		return getValueSpecification().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getValueSpecification__RealValue() {
-		return getValueSpecification().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTypedElement() {
-		if (typedElementEClass == null) {
-			typedElementEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(28);
-		}
-		return typedElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTypedElement_Type() {
-		return (EReference) getTypedElement().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNamedElement() {
-		if (namedElementEClass == null) {
-			namedElementEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(7);
-		}
-		return namedElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNamedElement_Name() {
-		return (EAttribute) getNamedElement().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNamedElement_Visibility() {
-		return (EAttribute) getNamedElement().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNamedElement_QualifiedName() {
-		return (EAttribute) getNamedElement().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNamedElement_ClientDependency() {
-		return (EReference) getNamedElement().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNamedElement_Namespace() {
-		return (EReference) getNamedElement().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNamedElement_NameExpression() {
-		return (EReference) getNamedElement().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamedElement__ValidateHasNoQualifiedName__DiagnosticChain_Map() {
-		return getNamedElement().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamedElement__ValidateHasQualifiedName__DiagnosticChain_Map() {
-		return getNamedElement().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamedElement__ValidateVisibilityNeedsOwnership__DiagnosticChain_Map() {
-		return getNamedElement().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamedElement__CreateDependency__NamedElement() {
-		return getNamedElement().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamedElement__GetLabel() {
-		return getNamedElement().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamedElement__GetLabel__boolean() {
-		return getNamedElement().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamedElement__CreateUsage__NamedElement() {
-		return getNamedElement().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamedElement__AllNamespaces() {
-		return getNamedElement().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamedElement__IsDistinguishableFrom__NamedElement_Namespace() {
-		return getNamedElement().getEOperations().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamedElement__GetNamespace() {
-		return getNamedElement().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamedElement__GetQualifiedName() {
-		return getNamedElement().getEOperations().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamedElement__Separator() {
-		return getNamedElement().getEOperations().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamedElement__GetClientDependencies() {
-		return getNamedElement().getEOperations().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamedElement__AllOwningPackages() {
-		return getNamedElement().getEOperations().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDependency() {
-		if (dependencyEClass == null) {
-			dependencyEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(35);
-		}
-		return dependencyEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDependency_Supplier() {
-		return (EReference) getDependency().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDependency_Client() {
-		return (EReference) getDependency().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPackageableElement() {
-		if (packageableElementEClass == null) {
-			packageableElementEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(14);
-		}
-		return packageableElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackageableElement__ValidateNamespaceNeedsVisibility__DiagnosticChain_Map() {
-		return getPackageableElement().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getParameterableElement() {
-		if (parameterableElementEClass == null) {
-			parameterableElementEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(15);
-		}
-		return parameterableElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getParameterableElement_TemplateParameter() {
-		return (EReference) getParameterableElement().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameterableElement__IsCompatibleWith__ParameterableElement() {
-		return getParameterableElement().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameterableElement__IsTemplateParameter() {
-		return getParameterableElement().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getParameterableElement_OwningTemplateParameter() {
-		return (EReference) getParameterableElement().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTemplateParameter() {
-		if (templateParameterEClass == null) {
-			templateParameterEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(16);
-		}
-		return templateParameterEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateParameter_Signature() {
-		return (EReference) getTemplateParameter().getEStructuralFeatures()
-			.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateParameter_OwnedParameteredElement() {
-		return (EReference) getTemplateParameter().getEStructuralFeatures()
-			.get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateParameter_Default() {
-		return (EReference) getTemplateParameter().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateParameter_OwnedDefault() {
-		return (EReference) getTemplateParameter().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTemplateParameter__ValidateMustBeCompatible__DiagnosticChain_Map() {
-		return getTemplateParameter().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateParameter_ParameteredElement() {
-		return (EReference) getTemplateParameter().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTemplateSignature() {
-		if (templateSignatureEClass == null) {
-			templateSignatureEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(17);
-		}
-		return templateSignatureEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateSignature_Parameter() {
-		return (EReference) getTemplateSignature().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateSignature_Template() {
-		return (EReference) getTemplateSignature().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTemplateSignature__ValidateOwnElements__DiagnosticChain_Map() {
-		return getTemplateSignature().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTemplateSignature__ValidateUniqueParameters__DiagnosticChain_Map() {
-		return getTemplateSignature().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateSignature_OwnedParameter() {
-		return (EReference) getTemplateSignature().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTemplateableElement() {
-		if (templateableElementEClass == null) {
-			templateableElementEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(18);
-		}
-		return templateableElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateableElement_TemplateBinding() {
-		return (EReference) getTemplateableElement().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateableElement_OwnedTemplateSignature() {
-		return (EReference) getTemplateableElement().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTemplateableElement__ParameterableElements() {
-		return getTemplateableElement().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTemplateableElement__IsTemplate() {
-		return getTemplateableElement().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTemplateBinding() {
-		if (templateBindingEClass == null) {
-			templateBindingEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(19);
-		}
-		return templateBindingEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateBinding_Signature() {
-		return (EReference) getTemplateBinding().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateBinding_ParameterSubstitution() {
-		return (EReference) getTemplateBinding().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateBinding_BoundElement() {
-		return (EReference) getTemplateBinding().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTemplateBinding__ValidateParameterSubstitutionFormal__DiagnosticChain_Map() {
-		return getTemplateBinding().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTemplateBinding__ValidateOneParameterSubstitution__DiagnosticChain_Map() {
-		return getTemplateBinding().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTemplateParameterSubstitution() {
-		if (templateParameterSubstitutionEClass == null) {
-			templateParameterSubstitutionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(22);
-		}
-		return templateParameterSubstitutionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateParameterSubstitution_Formal() {
-		return (EReference) getTemplateParameterSubstitution()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateParameterSubstitution_Actual() {
-		return (EReference) getTemplateParameterSubstitution()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateParameterSubstitution_OwnedActual() {
-		return (EReference) getTemplateParameterSubstitution()
-			.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTemplateParameterSubstitution_TemplateBinding() {
-		return (EReference) getTemplateParameterSubstitution()
-			.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTemplateParameterSubstitution__ValidateMustBeCompatible__DiagnosticChain_Map() {
-		return getTemplateParameterSubstitution().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNamespace() {
-		if (namespaceEClass == null) {
-			namespaceEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(6);
-		}
-		return namespaceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNamespace_ElementImport() {
-		return (EReference) getNamespace().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNamespace_PackageImport() {
-		return (EReference) getNamespace().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNamespace_OwnedRule() {
-		return (EReference) getNamespace().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNamespace_Member() {
-		return (EReference) getNamespace().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNamespace_ImportedMember() {
-		return (EReference) getNamespace().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNamespace_OwnedMember() {
-		return (EReference) getNamespace().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamespace__ValidateMembersDistinguishable__DiagnosticChain_Map() {
-		return getNamespace().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamespace__ValidateCannotImportSelf__DiagnosticChain_Map() {
-		return getNamespace().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamespace__ValidateCannotImportOwnedMembers__DiagnosticChain_Map() {
-		return getNamespace().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamespace__CreateElementImport__PackageableElement_VisibilityKind() {
-		return getNamespace().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamespace__CreatePackageImport__Package_VisibilityKind() {
-		return getNamespace().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamespace__GetImportedElements() {
-		return getNamespace().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamespace__GetImportedPackages() {
-		return getNamespace().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamespace__GetNamesOfMember__NamedElement() {
-		return getNamespace().getEOperations().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamespace__MembersAreDistinguishable() {
-		return getNamespace().getEOperations().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamespace__GetOwnedMembers() {
-		return getNamespace().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamespace__ImportMembers__EList() {
-		return getNamespace().getEOperations().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamespace__GetImportedMembers() {
-		return getNamespace().getEOperations().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNamespace__ExcludeCollisions__EList() {
-		return getNamespace().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getElementImport() {
-		if (elementImportEClass == null) {
-			elementImportEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(80);
-		}
-		return elementImportEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getElementImport_Visibility() {
-		return (EAttribute) getElementImport().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getElementImport_Alias() {
-		return (EAttribute) getElementImport().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getElementImport_ImportedElement() {
-		return (EReference) getElementImport().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getElementImport_ImportingNamespace() {
-		return (EReference) getElementImport().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElementImport__ValidateVisibilityPublicOrPrivate__DiagnosticChain_Map() {
-		return getElementImport().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElementImport__ValidateImportedElementIsPublic__DiagnosticChain_Map() {
-		return getElementImport().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getElementImport__GetName() {
-		return getElementImport().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPackageImport() {
-		if (packageImportEClass == null) {
-			packageImportEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(81);
-		}
-		return packageImportEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPackageImport_Visibility() {
-		return (EAttribute) getPackageImport().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPackageImport_ImportedPackage() {
-		return (EReference) getPackageImport().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPackageImport_ImportingNamespace() {
-		return (EReference) getPackageImport().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackageImport__ValidatePublicOrPrivate__DiagnosticChain_Map() {
-		return getPackageImport().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPackage() {
-		if (packageEClass == null) {
-			packageEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(13);
-		}
-		return packageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPackage_URI() {
-		return (EAttribute) getPackage().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPackage_PackageMerge() {
-		return (EReference) getPackage().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPackage_PackagedElement() {
-		return (EReference) getPackage().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPackage_OwnedType() {
-		return (EReference) getPackage().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPackage_NestedPackage() {
-		return (EReference) getPackage().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPackage_NestingPackage() {
-		return (EReference) getPackage().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPackage_OwnedStereotype() {
-		return (EReference) getPackage().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPackage_ProfileApplication() {
-		return (EReference) getPackage().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__ValidateElementsPublicOrPrivate__DiagnosticChain_Map() {
-		return getPackage().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__CreateOwnedClass__String_boolean() {
-		return getPackage().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__CreateOwnedEnumeration__String() {
-		return getPackage().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__CreateOwnedPrimitiveType__String() {
-		return getPackage().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__CreateOwnedStereotype__String_boolean() {
-		return getPackage().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__CreateOwnedInterface__String() {
-		return getPackage().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__IsProfileApplied__Profile() {
-		return getPackage().getEOperations().get(15);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__GetOwnedTypes() {
-		return getPackage().getEOperations().get(23);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__ApplyProfile__Profile() {
-		return getPackage().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__UnapplyProfile__Profile() {
-		return getPackage().getEOperations().get(16);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__ApplyProfiles__EList() {
-		return getPackage().getEOperations().get(17);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__AllApplicableStereotypes() {
-		return getPackage().getEOperations().get(18);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__ContainingProfile() {
-		return getPackage().getEOperations().get(19);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__GetAppliedProfiles() {
-		return getPackage().getEOperations().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__GetAllAppliedProfiles() {
-		return getPackage().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__GetAppliedProfile__String() {
-		return getPackage().getEOperations().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__GetAppliedProfile__String_boolean() {
-		return getPackage().getEOperations().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__GetAllProfileApplications() {
-		return getPackage().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__GetProfileApplication__Profile() {
-		return getPackage().getEOperations().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__GetProfileApplication__Profile_boolean() {
-		return getPackage().getEOperations().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__IsModelLibrary() {
-		return getPackage().getEOperations().get(14);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__VisibleMembers() {
-		return getPackage().getEOperations().get(24);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__MakesVisible__NamedElement() {
-		return getPackage().getEOperations().get(20);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__GetNestedPackages() {
-		return getPackage().getEOperations().get(21);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPackage__GetOwnedStereotypes() {
-		return getPackage().getEOperations().get(22);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPackageMerge() {
-		if (packageMergeEClass == null) {
-			packageMergeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(73);
-		}
-		return packageMergeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPackageMerge_MergedPackage() {
-		return (EReference) getPackageMerge().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPackageMerge_ReceivingPackage() {
-		return (EReference) getPackageMerge().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getType() {
-		if (typeEClass == null) {
-			typeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(24);
-		}
-		return typeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getType_Package() {
-		return (EReference) getType().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getType__CreateAssociation__boolean_AggregationKind_String_int_int_Type_boolean_AggregationKind_String_int_int() {
-		return getType().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getType__GetAssociations() {
-		return getType().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getType__ConformsTo__Type() {
-		return getType().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProfileApplication() {
-		if (profileApplicationEClass == null) {
-			profileApplicationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(74);
-		}
-		return profileApplicationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProfileApplication_AppliedProfile() {
-		return (EReference) getProfileApplication().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProfileApplication_IsStrict() {
-		return (EAttribute) getProfileApplication().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProfileApplication_ApplyingPackage() {
-		return (EReference) getProfileApplication().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProfileApplication__GetAppliedDefinition() {
-		return getProfileApplication().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProfileApplication__GetAppliedDefinition__NamedElement() {
-		return getProfileApplication().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProfile() {
-		if (profileEClass == null) {
-			profileEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(12);
-		}
-		return profileEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProfile_MetaclassReference() {
-		return (EReference) getProfile().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProfile_MetamodelReference() {
-		return (EReference) getProfile().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProfile__ValidateMetaclassReferenceNotSpecialized__DiagnosticChain_Map() {
-		return getProfile().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProfile__ValidateReferencesSameMetamodel__DiagnosticChain_Map() {
-		return getProfile().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProfile__Create__Classifier() {
-		return getProfile().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProfile__IsDefined() {
-		return getProfile().getEOperations().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProfile__Define() {
-		return getProfile().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProfile__Define__Map_DiagnosticChain_Map() {
-		return getProfile().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProfile__GetDefinition() {
-		return getProfile().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProfile__GetDefinition__NamedElement() {
-		return getProfile().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProfile__GetReferencedMetaclasses() {
-		return getProfile().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProfile__GetReferencedMetamodels() {
-		return getProfile().getEOperations().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProfile__GetOwnedExtensions__boolean() {
-		return getProfile().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getStereotype() {
-		if (stereotypeEClass == null) {
-			stereotypeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(10);
-		}
-		return stereotypeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStereotype_Icon() {
-		return (EReference) getStereotype().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStereotype_Profile() {
-		return (EReference) getStereotype().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__ValidateBinaryAssociationsOnly__DiagnosticChain_Map() {
-		return getStereotype().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__ValidateNameNotClash__DiagnosticChain_Map() {
-		return getStereotype().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__ValidateAssociationEndOwnership__DiagnosticChain_Map() {
-		return getStereotype().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__ValidateBasePropertyUpperBound__DiagnosticChain_Map() {
-		return getStereotype().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__ValidateBasePropertyMultiplicitySingleExtension__DiagnosticChain_Map() {
-		return getStereotype().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__ValidateBasePropertyMultiplicityMultipleExtension__DiagnosticChain_Map() {
-		return getStereotype().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__ValidateGeneralize__DiagnosticChain_Map() {
-		return getStereotype().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__CreateExtension__Class_boolean() {
-		return getStereotype().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__GetKeyword() {
-		return getStereotype().getEOperations().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__GetKeyword__boolean() {
-		return getStereotype().getEOperations().get(14);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__ContainingProfile() {
-		return getStereotype().getEOperations().get(15);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__GetProfile() {
-		return getStereotype().getEOperations().get(16);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__GetExtendedMetaclasses() {
-		return getStereotype().getEOperations().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__GetAllExtendedMetaclasses() {
-		return getStereotype().getEOperations().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__GetDefinition() {
-		return getStereotype().getEOperations().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__CreateIcon__String() {
-		return getStereotype().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStereotype__CreateIcon__String_String() {
-		return getStereotype().getEOperations().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getClass_() {
-		if (classEClass == null) {
-			classEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(3);
-		}
-		return classEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClass_OwnedOperation() {
-		return (EReference) getClass_().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClass_NestedClassifier() {
-		return (EReference) getClass_().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClass_SuperClass() {
-		return (EReference) getClass_().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getClass_IsActive() {
-		return (EAttribute) getClass_().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClass_OwnedReception() {
-		return (EReference) getClass_().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClass_Extension() {
-		return (EReference) getClass_().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClass__ValidatePassiveClass__DiagnosticChain_Map() {
-		return getClass_().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClass__GetExtensions() {
-		return getClass_().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClass__GetSuperClasses() {
-		return getClass_().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClass__CreateOwnedOperation__String_EList_EList_Type() {
-		return getClass_().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClass__IsMetaclass() {
-		return getClass_().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBehavioredClassifier() {
-		if (behavioredClassifierEClass == null) {
-			behavioredClassifierEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(4);
-		}
-		return behavioredClassifierEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehavioredClassifier_OwnedBehavior() {
-		return (EReference) getBehavioredClassifier().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehavioredClassifier_ClassifierBehavior() {
-		return (EReference) getBehavioredClassifier().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehavioredClassifier_InterfaceRealization() {
-		return (EReference) getBehavioredClassifier().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBehavioredClassifier__ValidateClassBehavior__DiagnosticChain_Map() {
-		return getBehavioredClassifier().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBehavioredClassifier__GetImplementedInterfaces() {
-		return getBehavioredClassifier().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBehavioredClassifier__GetAllImplementedInterfaces() {
-		return getBehavioredClassifier().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getClassifier() {
-		if (classifierEClass == null) {
-			classifierEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(5);
-		}
-		return classifierEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getClassifier_IsAbstract() {
-		return (EAttribute) getClassifier().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getClassifier_IsFinalSpecialization() {
-		return (EAttribute) getClassifier().getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClassifier_Generalization() {
-		return (EReference) getClassifier().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClassifier_PowertypeExtent() {
-		return (EReference) getClassifier().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClassifier_Feature() {
-		return (EReference) getClassifier().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClassifier_InheritedMember() {
-		return (EReference) getClassifier().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClassifier_RedefinedClassifier() {
-		return (EReference) getClassifier().getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClassifier_General() {
-		return (EReference) getClassifier().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClassifier_OwnedUseCase() {
-		return (EReference) getClassifier().getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClassifier_UseCase() {
-		return (EReference) getClassifier().getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__ValidateNoCyclesInGeneralization__DiagnosticChain_Map() {
-		return getClassifier().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__ValidateSpecializeType__DiagnosticChain_Map() {
-		return getClassifier().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__ValidateMapsToGeneralizationSet__DiagnosticChain_Map() {
-		return getClassifier().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__ValidateNonFinalParents__DiagnosticChain_Map() {
-		return getClassifier().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__GetAllAttributes() {
-		return getClassifier().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__GetOperations() {
-		return getClassifier().getEOperations().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__GetAllOperations() {
-		return getClassifier().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__GetOperation__String_EList_EList() {
-		return getClassifier().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__GetOperation__String_EList_EList_boolean() {
-		return getClassifier().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__GetUsedInterfaces() {
-		return getClassifier().getEOperations().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__GetAllUsedInterfaces() {
-		return getClassifier().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__AllFeatures() {
-		return getClassifier().getEOperations().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__Parents() {
-		return getClassifier().getEOperations().get(19);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__DirectlyRealizedInterfaces() {
-		return getClassifier().getEOperations().get(20);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__DirectlyUsedInterfaces() {
-		return getClassifier().getEOperations().get(21);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__AllRealizedInterfaces() {
-		return getClassifier().getEOperations().get(22);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__AllUsedInterfaces() {
-		return getClassifier().getEOperations().get(23);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__IsSubstitutableFor__Classifier() {
-		return getClassifier().getEOperations().get(24);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__AllAttributes() {
-		return getClassifier().getEOperations().get(25);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__AllSlottableFeatures() {
-		return getClassifier().getEOperations().get(26);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__InheritableMembers__Classifier() {
-		return getClassifier().getEOperations().get(16);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__GetInheritedMembers() {
-		return getClassifier().getEOperations().get(17);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__HasVisibilityOf__NamedElement() {
-		return getClassifier().getEOperations().get(14);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__GetGenerals() {
-		return getClassifier().getEOperations().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__Inherit__EList() {
-		return getClassifier().getEOperations().get(15);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__MaySpecializeType__Classifier() {
-		return getClassifier().getEOperations().get(18);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifier__AllParents() {
-		return getClassifier().getEOperations().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClassifier_Substitution() {
-		return (EReference) getClassifier().getEStructuralFeatures().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClassifier_Attribute() {
-		return (EReference) getClassifier().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClassifier_Representation() {
-		return (EReference) getClassifier().getEStructuralFeatures().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClassifier_CollaborationUse() {
-		return (EReference) getClassifier().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRedefinableElement() {
-		if (redefinableElementEClass == null) {
-			redefinableElementEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(48);
-		}
-		return redefinableElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRedefinableElement_IsLeaf() {
-		return (EAttribute) getRedefinableElement().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRedefinableElement_RedefinedElement() {
-		return (EReference) getRedefinableElement().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRedefinableElement_RedefinitionContext() {
-		return (EReference) getRedefinableElement().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRedefinableElement__ValidateRedefinitionContextValid__DiagnosticChain_Map() {
-		return getRedefinableElement().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRedefinableElement__ValidateRedefinitionConsistent__DiagnosticChain_Map() {
-		return getRedefinableElement().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRedefinableElement__ValidateNonLeafRedefinition__DiagnosticChain_Map() {
-		return getRedefinableElement().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRedefinableElement__IsConsistentWith__RedefinableElement() {
-		return getRedefinableElement().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRedefinableElement__IsRedefinitionContextValid__RedefinableElement() {
-		return getRedefinableElement().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGeneralization() {
-		if (generalizationEClass == null) {
-			generalizationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(93);
-		}
-		return generalizationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGeneralization_IsSubstitutable() {
-		return (EAttribute) getGeneralization().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGeneralization_General() {
-		return (EReference) getGeneralization().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGeneralization_GeneralizationSet() {
-		return (EReference) getGeneralization().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGeneralization_Specific() {
-		return (EReference) getGeneralization().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGeneralizationSet() {
-		if (generalizationSetEClass == null) {
-			generalizationSetEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(94);
-		}
-		return generalizationSetEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGeneralizationSet_IsCovering() {
-		return (EAttribute) getGeneralizationSet().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGeneralizationSet_IsDisjoint() {
-		return (EAttribute) getGeneralizationSet().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGeneralizationSet_Powertype() {
-		return (EReference) getGeneralizationSet().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGeneralizationSet_Generalization() {
-		return (EReference) getGeneralizationSet().getEStructuralFeatures()
-			.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGeneralizationSet__ValidateGeneralizationSameClassifier__DiagnosticChain_Map() {
-		return getGeneralizationSet().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGeneralizationSet__ValidateMapsToGeneralizationSet__DiagnosticChain_Map() {
-		return getGeneralizationSet().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFeature() {
-		if (featureEClass == null) {
-			featureEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(47);
-		}
-		return featureEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFeature_IsStatic() {
-		return (EAttribute) getFeature().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFeature_FeaturingClassifier() {
-		return (EReference) getFeature().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getUseCase() {
-		if (useCaseEClass == null) {
-			useCaseEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(96);
-		}
-		return useCaseEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getUseCase_Include() {
-		return (EReference) getUseCase().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getUseCase_Extend() {
-		return (EReference) getUseCase().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getUseCase_ExtensionPoint() {
-		return (EReference) getUseCase().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getUseCase_Subject() {
-		return (EReference) getUseCase().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getUseCase__ValidateMustHaveName__DiagnosticChain_Map() {
-		return getUseCase().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getUseCase__ValidateBinaryAssociations__DiagnosticChain_Map() {
-		return getUseCase().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getUseCase__ValidateNoAssociationToUseCase__DiagnosticChain_Map() {
-		return getUseCase().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getUseCase__ValidateCannotIncludeSelf__DiagnosticChain_Map() {
-		return getUseCase().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getUseCase__AllIncludedUseCases() {
-		return getUseCase().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInclude() {
-		if (includeEClass == null) {
-			includeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(99);
-		}
-		return includeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInclude_Addition() {
-		return (EReference) getInclude().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInclude_IncludingCase() {
-		return (EReference) getInclude().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExtend() {
-		if (extendEClass == null) {
-			extendEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(97);
-		}
-		return extendEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExtend_ExtendedCase() {
-		return (EReference) getExtend().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExtend_Condition() {
-		return (EReference) getExtend().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExtend_ExtensionLocation() {
-		return (EReference) getExtend().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExtend_Extension() {
-		return (EReference) getExtend().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExtend__ValidateExtensionPoints__DiagnosticChain_Map() {
-		return getExtend().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConstraint() {
-		if (constraintEClass == null) {
-			constraintEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(51);
-		}
-		return constraintEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConstraint_ConstrainedElement() {
-		return (EReference) getConstraint().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConstraint_Specification() {
-		return (EReference) getConstraint().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConstraint_Context() {
-		return (EReference) getConstraint().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConstraint__ValidateNotApplyToSelf__DiagnosticChain_Map() {
-		return getConstraint().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConstraint__ValidateBooleanValue__DiagnosticChain_Map() {
-		return getConstraint().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConstraint__ValidateNoSideEffects__DiagnosticChain_Map() {
-		return getConstraint().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExtensionPoint() {
-		if (extensionPointEClass == null) {
-			extensionPointEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(98);
-		}
-		return extensionPointEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExtensionPoint_UseCase() {
-		return (EReference) getExtensionPoint().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExtensionPoint__ValidateMustHaveName__DiagnosticChain_Map() {
-		return getExtensionPoint().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSubstitution() {
-		if (substitutionEClass == null) {
-			substitutionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(100);
-		}
-		return substitutionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSubstitution_Contract() {
-		return (EReference) getSubstitution().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSubstitution_SubstitutingClassifier() {
-		return (EReference) getSubstitution().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRealization() {
-		if (realizationEClass == null) {
-			realizationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(101);
-		}
-		return realizationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAbstraction() {
-		if (abstractionEClass == null) {
-			abstractionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(40);
-		}
-		return abstractionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAbstraction_Mapping() {
-		return (EReference) getAbstraction().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOpaqueExpression() {
-		if (opaqueExpressionEClass == null) {
-			opaqueExpressionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(41);
-		}
-		return opaqueExpressionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOpaqueExpression_Body() {
-		return (EAttribute) getOpaqueExpression().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOpaqueExpression_Language() {
-		return (EAttribute) getOpaqueExpression().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOpaqueExpression_Result() {
-		return (EReference) getOpaqueExpression().getEStructuralFeatures()
-			.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOpaqueExpression_Behavior() {
-		return (EReference) getOpaqueExpression().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOpaqueExpression__ValidateLanguageBodySize__DiagnosticChain_Map() {
-		return getOpaqueExpression().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOpaqueExpression__ValidateOnlyReturnResultParameters__DiagnosticChain_Map() {
-		return getOpaqueExpression().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOpaqueExpression__ValidateOneReturnResultParameter__DiagnosticChain_Map() {
-		return getOpaqueExpression().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOpaqueExpression__GetResult() {
-		return getOpaqueExpression().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOpaqueExpression__Value() {
-		return getOpaqueExpression().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOpaqueExpression__IsIntegral() {
-		return getOpaqueExpression().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOpaqueExpression__IsPositive() {
-		return getOpaqueExpression().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOpaqueExpression__IsNonNegative() {
-		return getOpaqueExpression().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getParameter() {
-		if (parameterEClass == null) {
-			parameterEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(42);
-		}
-		return parameterEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getParameter_ParameterSet() {
-		return (EReference) getParameter().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getParameter_Operation() {
-		return (EReference) getParameter().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getParameter_Direction() {
-		return (EAttribute) getParameter().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getParameter_Default() {
-		return (EAttribute) getParameter().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getParameter_DefaultValue() {
-		return (EReference) getParameter().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getParameter_IsException() {
-		return (EAttribute) getParameter().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getParameter_IsStream() {
-		return (EAttribute) getParameter().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getParameter_Effect() {
-		return (EAttribute) getParameter().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__ValidateConnectorEnd__DiagnosticChain_Map() {
-		return getParameter().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__ValidateStreamAndException__DiagnosticChain_Map() {
-		return getParameter().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__ValidateObjectEffect__DiagnosticChain_Map() {
-		return getParameter().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__ValidateNotException__DiagnosticChain_Map() {
-		return getParameter().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__ValidateReentrantBehaviors__DiagnosticChain_Map() {
-		return getParameter().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__ValidateInAndOut__DiagnosticChain_Map() {
-		return getParameter().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__GetDefault() {
-		return getParameter().getEOperations().get(15);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__IsSetDefault() {
-		return getParameter().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__SetDefault__String() {
-		return getParameter().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__UnsetDefault() {
-		return getParameter().getEOperations().get(14);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__SetBooleanDefaultValue__boolean() {
-		return getParameter().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__SetIntegerDefaultValue__int() {
-		return getParameter().getEOperations().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__SetStringDefaultValue__String() {
-		return getParameter().getEOperations().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__SetUnlimitedNaturalDefaultValue__int() {
-		return getParameter().getEOperations().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__SetNullDefaultValue() {
-		return getParameter().getEOperations().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameter__SetRealDefaultValue__double() {
-		return getParameter().getEOperations().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMultiplicityElement() {
-		if (multiplicityElementEClass == null) {
-			multiplicityElementEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(30);
-		}
-		return multiplicityElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMultiplicityElement_IsOrdered() {
-		return (EAttribute) getMultiplicityElement().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMultiplicityElement_IsUnique() {
-		return (EAttribute) getMultiplicityElement().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMultiplicityElement_Upper() {
-		return (EAttribute) getMultiplicityElement().getEStructuralFeatures()
-			.get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMultiplicityElement_Lower() {
-		return (EAttribute) getMultiplicityElement().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMultiplicityElement_UpperValue() {
-		return (EReference) getMultiplicityElement().getEStructuralFeatures()
-			.get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMultiplicityElement_LowerValue() {
-		return (EReference) getMultiplicityElement().getEStructuralFeatures()
-			.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__ValidateLowerGe0__DiagnosticChain_Map() {
-		return getMultiplicityElement().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__ValidateUpperGeLower__DiagnosticChain_Map() {
-		return getMultiplicityElement().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__ValidateValueSpecificationNoSideEffects__DiagnosticChain_Map() {
-		return getMultiplicityElement().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__ValidateValueSpecificationConstant__DiagnosticChain_Map() {
-		return getMultiplicityElement().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__ValidateLowerIsInteger__DiagnosticChain_Map() {
-		return getMultiplicityElement().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__ValidateUpperIsUnlimitedNatural__DiagnosticChain_Map() {
-		return getMultiplicityElement().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__SetLower__int() {
-		return getMultiplicityElement().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__SetUpper__int() {
-		return getMultiplicityElement().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__IsMultivalued() {
-		return getMultiplicityElement().getEOperations().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__GetLower() {
-		return getMultiplicityElement().getEOperations().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__IncludesMultiplicity__MultiplicityElement() {
-		return getMultiplicityElement().getEOperations().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__LowerBound() {
-		return getMultiplicityElement().getEOperations().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__GetUpper() {
-		return getMultiplicityElement().getEOperations().get(14);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__UpperBound() {
-		return getMultiplicityElement().getEOperations().get(15);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__CompatibleWith__MultiplicityElement() {
-		return getMultiplicityElement().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMultiplicityElement__Is__int_int() {
-		return getMultiplicityElement().getEOperations().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConnectableElement() {
-		if (connectableElementEClass == null) {
-			connectableElementEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(27);
-		}
-		return connectableElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConnectableElement_End() {
-		return (EReference) getConnectableElement().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConnectableElement__GetEnds() {
-		return getConnectableElement().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConnectorEnd() {
-		if (connectorEndEClass == null) {
-			connectorEndEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(29);
-		}
-		return connectorEndEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConnectorEnd_DefiningEnd() {
-		return (EReference) getConnectorEnd().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConnectorEnd_PartWithPort() {
-		return (EReference) getConnectorEnd().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConnectorEnd__ValidateMultiplicity__DiagnosticChain_Map() {
-		return getConnectorEnd().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConnectorEnd__ValidatePartWithPortEmpty__DiagnosticChain_Map() {
-		return getConnectorEnd().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConnectorEnd__ValidateRoleAndPartWithPort__DiagnosticChain_Map() {
-		return getConnectorEnd().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConnectorEnd__ValidateSelfPartWithPort__DiagnosticChain_Map() {
-		return getConnectorEnd().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConnectorEnd__GetDefiningEnd() {
-		return getConnectorEnd().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConnectorEnd_Role() {
-		return (EReference) getConnectorEnd().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProperty() {
-		if (propertyEClass == null) {
-			propertyEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(26);
-		}
-		return propertyEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProperty_Class() {
-		return (EReference) getProperty().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProperty_Datatype() {
-		return (EReference) getProperty().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProperty_Interface() {
-		return (EReference) getProperty().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProperty_Default() {
-		return (EAttribute) getProperty().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProperty_IsDerived() {
-		return (EAttribute) getProperty().getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProperty_IsDerivedUnion() {
-		return (EAttribute) getProperty().getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProperty_IsID() {
-		return (EAttribute) getProperty().getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProperty_Aggregation() {
-		return (EAttribute) getProperty().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProperty_IsComposite() {
-		return (EAttribute) getProperty().getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProperty_RedefinedProperty() {
-		return (EReference) getProperty().getEStructuralFeatures().get(14);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProperty_OwningAssociation() {
-		return (EReference) getProperty().getEStructuralFeatures().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProperty_Association() {
-		return (EReference) getProperty().getEStructuralFeatures().get(16);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProperty_DefaultValue() {
-		return (EReference) getProperty().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProperty_Opposite() {
-		return (EReference) getProperty().getEStructuralFeatures().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProperty_SubsettedProperty() {
-		return (EReference) getProperty().getEStructuralFeatures().get(15);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProperty_Qualifier() {
-		return (EReference) getProperty().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProperty_AssociationEnd() {
-		return (EReference) getProperty().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__ValidateMultiplicityOfComposite__DiagnosticChain_Map() {
-		return getProperty().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__ValidateSubsettingContextConforms__DiagnosticChain_Map() {
-		return getProperty().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__ValidateRedefinedPropertyInherited__DiagnosticChain_Map() {
-		return getProperty().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__ValidateSubsettingRules__DiagnosticChain_Map() {
-		return getProperty().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__ValidateDerivedUnionIsDerived__DiagnosticChain_Map() {
-		return getProperty().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__ValidateDerivedUnionIsReadOnly__DiagnosticChain_Map() {
-		return getProperty().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__ValidateSubsettedPropertyNames__DiagnosticChain_Map() {
-		return getProperty().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__ValidateTypeOfOppositeEnd__DiagnosticChain_Map() {
-		return getProperty().getEOperations().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__ValidateQualifiedIsAssociationEnd__DiagnosticChain_Map() {
-		return getProperty().getEOperations().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__ValidateDeploymentTarget__DiagnosticChain_Map() {
-		return getProperty().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__ValidateBindingToAttribute__DiagnosticChain_Map() {
-		return getProperty().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__GetDefault() {
-		return getProperty().getEOperations().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__SetDefault__String() {
-		return getProperty().getEOperations().get(15);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__SetIsComposite__boolean() {
-		return getProperty().getEOperations().get(17);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__SetOpposite__Property() {
-		return getProperty().getEOperations().get(20);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__SetRealDefaultValue__double() {
-		return getProperty().getEOperations().get(21);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__IsAttribute() {
-		return getProperty().getEOperations().get(25);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__SetIsNavigable__boolean() {
-		return getProperty().getEOperations().get(18);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__GetOtherEnd() {
-		return getProperty().getEOperations().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__IsSetDefault() {
-		return getProperty().getEOperations().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__SetBooleanDefaultValue__boolean() {
-		return getProperty().getEOperations().get(14);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__SetIntegerDefaultValue__int() {
-		return getProperty().getEOperations().get(16);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__SetStringDefaultValue__String() {
-		return getProperty().getEOperations().get(22);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__SetUnlimitedNaturalDefaultValue__int() {
-		return getProperty().getEOperations().get(23);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__UnsetDefault() {
-		return getProperty().getEOperations().get(24);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__SetNullDefaultValue() {
-		return getProperty().getEOperations().get(19);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__IsComposite() {
-		return getProperty().getEOperations().get(26);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__SubsettingContext() {
-		return getProperty().getEOperations().get(29);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__IsNavigable() {
-		return getProperty().getEOperations().get(27);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProperty__GetOpposite() {
-		return getProperty().getEOperations().get(28);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDeploymentTarget() {
-		if (deploymentTargetEClass == null) {
-			deploymentTargetEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(33);
-		}
-		return deploymentTargetEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDeploymentTarget_Deployment() {
-		return (EReference) getDeploymentTarget().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDeploymentTarget__GetDeployedElements() {
-		return getDeploymentTarget().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDeploymentTarget_DeployedElement() {
-		return (EReference) getDeploymentTarget().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDeployment() {
-		if (deploymentEClass == null) {
-			deploymentEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(34);
-		}
-		return deploymentEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDeployment_DeployedArtifact() {
-		return (EReference) getDeployment().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDeployment_Configuration() {
-		return (EReference) getDeployment().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDeployment_Location() {
-		return (EReference) getDeployment().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDeployedArtifact() {
-		if (deployedArtifactEClass == null) {
-			deployedArtifactEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(38);
-		}
-		return deployedArtifactEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDeploymentSpecification() {
-		if (deploymentSpecificationEClass == null) {
-			deploymentSpecificationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(36);
-		}
-		return deploymentSpecificationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeploymentSpecification_DeploymentLocation() {
-		return (EAttribute) getDeploymentSpecification()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeploymentSpecification_ExecutionLocation() {
-		return (EAttribute) getDeploymentSpecification()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDeploymentSpecification_Deployment() {
-		return (EReference) getDeploymentSpecification()
-			.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDeploymentSpecification__ValidateDeployedElements__DiagnosticChain_Map() {
-		return getDeploymentSpecification().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDeploymentSpecification__ValidateDeploymentTarget__DiagnosticChain_Map() {
-		return getDeploymentSpecification().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getArtifact() {
-		if (artifactEClass == null) {
-			artifactEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(37);
-		}
-		return artifactEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArtifact_FileName() {
-		return (EAttribute) getArtifact().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getArtifact_NestedArtifact() {
-		return (EReference) getArtifact().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getArtifact_Manifestation() {
-		return (EReference) getArtifact().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getArtifact_OwnedOperation() {
-		return (EReference) getArtifact().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getArtifact_OwnedAttribute() {
-		return (EReference) getArtifact().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getArtifact__CreateOwnedOperation__String_EList_EList_Type() {
-		return getArtifact().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getArtifact__CreateOwnedAttribute__String_Type_int_int() {
-		return getArtifact().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getManifestation() {
-		if (manifestationEClass == null) {
-			manifestationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(39);
-		}
-		return manifestationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManifestation_UtilizedElement() {
-		return (EReference) getManifestation().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOperation() {
-		if (operationEClass == null) {
-			operationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(45);
-		}
-		return operationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOperation_IsQuery() {
-		return (EAttribute) getOperation().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOperation_IsOrdered() {
-		return (EAttribute) getOperation().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOperation_IsUnique() {
-		return (EAttribute) getOperation().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOperation_Lower() {
-		return (EAttribute) getOperation().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOperation_Upper() {
-		return (EAttribute) getOperation().getEStructuralFeatures().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_Precondition() {
-		return (EReference) getOperation().getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_Postcondition() {
-		return (EReference) getOperation().getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_RedefinedOperation() {
-		return (EReference) getOperation().getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_Datatype() {
-		return (EReference) getOperation().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_BodyCondition() {
-		return (EReference) getOperation().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_Type() {
-		return (EReference) getOperation().getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOperation__ValidateAtMostOneReturn__DiagnosticChain_Map() {
-		return getOperation().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOperation__ValidateOnlyBodyForQuery__DiagnosticChain_Map() {
-		return getOperation().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOperation__GetLower() {
-		return getOperation().getEOperations().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOperation__GetUpper() {
-		return getOperation().getEOperations().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOperation__SetIsOrdered__boolean() {
-		return getOperation().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOperation__SetIsUnique__boolean() {
-		return getOperation().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOperation__SetLower__int() {
-		return getOperation().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOperation__SetType__Type() {
-		return getOperation().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOperation__SetUpper__int() {
-		return getOperation().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOperation__GetReturnResult() {
-		return getOperation().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOperation__IsOrdered() {
-		return getOperation().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOperation__IsUnique() {
-		return getOperation().getEOperations().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOperation__ReturnResult() {
-		return getOperation().getEOperations().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOperation__GetType() {
-		return getOperation().getEOperations().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_Interface() {
-		return (EReference) getOperation().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_Class() {
-		return (EReference) getOperation().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBehavioralFeature() {
-		if (behavioralFeatureEClass == null) {
-			behavioralFeatureEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(46);
-		}
-		return behavioralFeatureEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehavioralFeature_OwnedParameter() {
-		return (EReference) getBehavioralFeature().getEStructuralFeatures()
-			.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBehavioralFeature_IsAbstract() {
-		return (EAttribute) getBehavioralFeature().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehavioralFeature_Method() {
-		return (EReference) getBehavioralFeature().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBehavioralFeature_Concurrency() {
-		return (EAttribute) getBehavioralFeature().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehavioralFeature_RaisedException() {
-		return (EReference) getBehavioralFeature().getEStructuralFeatures()
-			.get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBehavioralFeature__ValidateAbstractNoMethod__DiagnosticChain_Map() {
-		return getBehavioralFeature().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehavioralFeature_OwnedParameterSet() {
-		return (EReference) getBehavioralFeature().getEStructuralFeatures()
-			.get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBehavioralFeature__CreateReturnResult__String_Type() {
-		return getBehavioralFeature().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBehavioralFeature__InputParameters() {
-		return getBehavioralFeature().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBehavioralFeature__OutputParameters() {
-		return getBehavioralFeature().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBehavior() {
-		if (behaviorEClass == null) {
-			behaviorEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(2);
-		}
-		return behaviorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBehavior_IsReentrant() {
-		return (EAttribute) getBehavior().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehavior_RedefinedBehavior() {
-		return (EReference) getBehavior().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBehavior__ValidateMostOneBehavior__DiagnosticChain_Map() {
-		return getBehavior().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehavior_OwnedParameter() {
-		return (EReference) getBehavior().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehavior_Context() {
-		return (EReference) getBehavior().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehavior_Precondition() {
-		return (EReference) getBehavior().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehavior_Postcondition() {
-		return (EReference) getBehavior().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehavior_OwnedParameterSet() {
-		return (EReference) getBehavior().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehavior_Specification() {
-		return (EReference) getBehavior().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBehavior__ValidateParametersMatch__DiagnosticChain_Map() {
-		return getBehavior().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBehavior__ValidateFeatureOfContextClassifier__DiagnosticChain_Map() {
-		return getBehavior().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBehavior__GetContext() {
-		return getBehavior().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBehavior__BehavioredClassifier__Element() {
-		return getBehavior().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBehavior__InputParameters() {
-		return getBehavior().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBehavior__OutputParameters() {
-		return getBehavior().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getParameterSet() {
-		if (parameterSetEClass == null) {
-			parameterSetEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(50);
-		}
-		return parameterSetEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getParameterSet_Parameter() {
-		return (EReference) getParameterSet().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getParameterSet_Condition() {
-		return (EReference) getParameterSet().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameterSet__ValidateSameParameterizedEntity__DiagnosticChain_Map() {
-		return getParameterSet().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameterSet__ValidateInput__DiagnosticChain_Map() {
-		return getParameterSet().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getParameterSet__ValidateTwoParameterSets__DiagnosticChain_Map() {
-		return getParameterSet().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDataType() {
-		if (dataTypeEClass == null) {
-			dataTypeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(52);
-		}
-		return dataTypeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDataType_OwnedAttribute() {
-		return (EReference) getDataType().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDataType_OwnedOperation() {
-		return (EReference) getDataType().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDataType__CreateOwnedOperation__String_EList_EList_Type() {
-		return getDataType().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDataType__CreateOwnedAttribute__String_Type_int_int() {
-		return getDataType().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInterface() {
-		if (interfaceEClass == null) {
-			interfaceEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(53);
-		}
-		return interfaceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInterface_OwnedAttribute() {
-		return (EReference) getInterface().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInterface_NestedClassifier() {
-		return (EReference) getInterface().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInterface_RedefinedInterface() {
-		return (EReference) getInterface().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInterface_OwnedReception() {
-		return (EReference) getInterface().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInterface_Protocol() {
-		return (EReference) getInterface().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInterface__ValidateVisibility__DiagnosticChain_Map() {
-		return getInterface().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInterface__CreateOwnedOperation__String_EList_EList_Type() {
-		return getInterface().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInterface__CreateOwnedAttribute__String_Type_int_int() {
-		return getInterface().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInterface_OwnedOperation() {
-		return (EReference) getInterface().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReception() {
-		if (receptionEClass == null) {
-			receptionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(54);
-		}
-		return receptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReception_Signal() {
-		return (EReference) getReception().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReception__ValidateSameNameAsSignal__DiagnosticChain_Map() {
-		return getReception().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReception__ValidateSameStructureAsSignal__DiagnosticChain_Map() {
-		return getReception().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSignal() {
-		if (signalEClass == null) {
-			signalEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(55);
-		}
-		return signalEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSignal_OwnedAttribute() {
-		return (EReference) getSignal().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getSignal__CreateOwnedAttribute__String_Type_int_int() {
-		return getSignal().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProtocolStateMachine() {
-		if (protocolStateMachineEClass == null) {
-			protocolStateMachineEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(56);
-		}
-		return protocolStateMachineEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProtocolStateMachine_Conformance() {
-		return (EReference) getProtocolStateMachine().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProtocolStateMachine__ValidateProtocolTransitions__DiagnosticChain_Map() {
-		return getProtocolStateMachine().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProtocolStateMachine__ValidateEntryExitDo__DiagnosticChain_Map() {
-		return getProtocolStateMachine().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProtocolStateMachine__ValidateDeepOrShallowHistory__DiagnosticChain_Map() {
-		return getProtocolStateMachine().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getStateMachine() {
-		if (stateMachineEClass == null) {
-			stateMachineEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(57);
-		}
-		return stateMachineEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStateMachine_Region() {
-		return (EReference) getStateMachine().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStateMachine_SubmachineState() {
-		return (EReference) getStateMachine().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStateMachine_ConnectionPoint() {
-		return (EReference) getStateMachine().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStateMachine_ExtendedStateMachine() {
-		return (EReference) getStateMachine().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStateMachine__ValidateClassifierContext__DiagnosticChain_Map() {
-		return getStateMachine().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStateMachine__ValidateContextClassifier__DiagnosticChain_Map() {
-		return getStateMachine().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStateMachine__LCA__Vertex_Vertex() {
-		return getStateMachine().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStateMachine__Ancestor__Vertex_Vertex() {
-		return getStateMachine().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStateMachine__LCAState__Vertex_Vertex() {
-		return getStateMachine().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStateMachine__ValidateConnectionPoints__DiagnosticChain_Map() {
-		return getStateMachine().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStateMachine__ValidateMethod__DiagnosticChain_Map() {
-		return getStateMachine().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRegion() {
-		if (regionEClass == null) {
-			regionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(60);
-		}
-		return regionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRegion_Subvertex() {
-		return (EReference) getRegion().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRegion_Transition() {
-		return (EReference) getRegion().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRegion_State() {
-		return (EReference) getRegion().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRegion_ExtendedRegion() {
-		return (EReference) getRegion().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRegion_StateMachine() {
-		return (EReference) getRegion().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRegion__ValidateInitialVertex__DiagnosticChain_Map() {
-		return getRegion().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRegion__ValidateDeepHistoryVertex__DiagnosticChain_Map() {
-		return getRegion().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRegion__ValidateShallowHistoryVertex__DiagnosticChain_Map() {
-		return getRegion().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRegion__ValidateOwned__DiagnosticChain_Map() {
-		return getRegion().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRegion__RedefinitionContext() {
-		return getRegion().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRegion__ContainingStateMachine() {
-		return getRegion().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRegion__BelongsToPSM() {
-		return getRegion().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getVertex() {
-		if (vertexEClass == null) {
-			vertexEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(59);
-		}
-		return vertexEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getVertex_Outgoing() {
-		return (EReference) getVertex().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getVertex_Incoming() {
-		return (EReference) getVertex().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getVertex_Container() {
-		return (EReference) getVertex().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getVertex__ContainingStateMachine() {
-		return getVertex().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getVertex__GetIncomings() {
-		return getVertex().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getVertex__GetOutgoings() {
-		return getVertex().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getVertex__IsContainedInState__State() {
-		return getVertex().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getVertex__IsContainedInRegion__Region() {
-		return getVertex().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTransition() {
-		if (transitionEClass == null) {
-			transitionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(66);
-		}
-		return transitionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTransition_Kind() {
-		return (EAttribute) getTransition().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTransition_Container() {
-		return (EReference) getTransition().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTransition__ValidateStateIsExternal__DiagnosticChain_Map() {
-		return getTransition().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTransition_Target() {
-		return (EReference) getTransition().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTransition_RedefinedTransition() {
-		return (EReference) getTransition().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTransition_Guard() {
-		return (EReference) getTransition().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTransition_Effect() {
-		return (EReference) getTransition().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTransition_Trigger() {
-		return (EReference) getTransition().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTransition__ValidateForkSegmentGuards__DiagnosticChain_Map() {
-		return getTransition().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTransition__ValidateJoinSegmentGuards__DiagnosticChain_Map() {
-		return getTransition().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTransition__ValidateStateIsInternal__DiagnosticChain_Map() {
-		return getTransition().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTransition__ValidateForkSegmentState__DiagnosticChain_Map() {
-		return getTransition().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTransition__ValidateJoinSegmentState__DiagnosticChain_Map() {
-		return getTransition().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTransition__ValidateOutgoingPseudostates__DiagnosticChain_Map() {
-		return getTransition().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTransition__ValidateInitialTransition__DiagnosticChain_Map() {
-		return getTransition().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTransition__ValidateStateIsLocal__DiagnosticChain_Map() {
-		return getTransition().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTransition__RedefinitionContext() {
-		return getTransition().getEOperations().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTransition__ContainingStateMachine() {
-		return getTransition().getEOperations().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTransition_Source() {
-		return (EReference) getTransition().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTrigger() {
-		if (triggerEClass == null) {
-			triggerEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(63);
-		}
-		return triggerEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTrigger_Event() {
-		return (EReference) getTrigger().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTrigger_Port() {
-		return (EReference) getTrigger().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTrigger__ValidateTriggerWithPorts__DiagnosticChain_Map() {
-		return getTrigger().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getEvent() {
-		if (eventEClass == null) {
-			eventEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(64);
-		}
-		return eventEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPort() {
-		if (portEClass == null) {
-			portEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(65);
-		}
-		return portEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPort_IsBehavior() {
-		return (EAttribute) getPort().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPort_IsConjugated() {
-		return (EAttribute) getPort().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPort_IsService() {
-		return (EAttribute) getPort().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPort_Required() {
-		return (EReference) getPort().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPort_RedefinedPort() {
-		return (EReference) getPort().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPort_Provided() {
-		return (EReference) getPort().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPort_Protocol() {
-		return (EReference) getPort().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPort__ValidatePortAggregation__DiagnosticChain_Map() {
-		return getPort().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPort__ValidateDefaultValue__DiagnosticChain_Map() {
-		return getPort().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPort__ValidateEncapsulatedOwner__DiagnosticChain_Map() {
-		return getPort().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPort__GetProvideds() {
-		return getPort().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPort__GetRequireds() {
-		return getPort().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPort__BasicProvided() {
-		return getPort().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPort__BasicRequired() {
-		return getPort().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getState() {
-		if (stateEClass == null) {
-			stateEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(61);
-		}
-		return stateEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getState_IsComposite() {
-		return (EAttribute) getState().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getState_IsOrthogonal() {
-		return (EAttribute) getState().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getState_IsSimple() {
-		return (EAttribute) getState().getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getState_IsSubmachineState() {
-		return (EAttribute) getState().getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getState_Submachine() {
-		return (EReference) getState().getEStructuralFeatures().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getState_Connection() {
-		return (EReference) getState().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getState_ConnectionPoint() {
-		return (EReference) getState().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getState_RedefinedState() {
-		return (EReference) getState().getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getState_StateInvariant() {
-		return (EReference) getState().getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getState_Entry() {
-		return (EReference) getState().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getState_Exit() {
-		return (EReference) getState().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getState_DoActivity() {
-		return (EReference) getState().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getState_DeferrableTrigger() {
-		return (EReference) getState().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getState_Region() {
-		return (EReference) getState().getEStructuralFeatures().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getState__ValidateSubmachineStates__DiagnosticChain_Map() {
-		return getState().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getState__ValidateDestinationsOrSourcesOfTransitions__DiagnosticChain_Map() {
-		return getState().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getState__ValidateSubmachineOrRegions__DiagnosticChain_Map() {
-		return getState().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getState__ValidateCompositeStates__DiagnosticChain_Map() {
-		return getState().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getState__ValidateEntryOrExit__DiagnosticChain_Map() {
-		return getState().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getState__IsSimple() {
-		return getState().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getState__IsComposite() {
-		return getState().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getState__IsOrthogonal() {
-		return getState().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getState__IsSubmachineState() {
-		return getState().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getState__RedefinitionContext() {
-		return getState().getEOperations().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConnectionPointReference() {
-		if (connectionPointReferenceEClass == null) {
-			connectionPointReferenceEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(62);
-		}
-		return connectionPointReferenceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConnectionPointReference_Entry() {
-		return (EReference) getConnectionPointReference()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConnectionPointReference_Exit() {
-		return (EReference) getConnectionPointReference()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConnectionPointReference_State() {
-		return (EReference) getConnectionPointReference()
-			.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConnectionPointReference__ValidateEntryPseudostates__DiagnosticChain_Map() {
-		return getConnectionPointReference().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConnectionPointReference__ValidateExitPseudostates__DiagnosticChain_Map() {
-		return getConnectionPointReference().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPseudostate() {
-		if (pseudostateEClass == null) {
-			pseudostateEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(58);
-		}
-		return pseudostateEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPseudostate_Kind() {
-		return (EAttribute) getPseudostate().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPseudostate_StateMachine() {
-		return (EReference) getPseudostate().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPseudostate_State() {
-		return (EReference) getPseudostate().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPseudostate__ValidateInitialVertex__DiagnosticChain_Map() {
-		return getPseudostate().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPseudostate__ValidateHistoryVertices__DiagnosticChain_Map() {
-		return getPseudostate().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPseudostate__ValidateJoinVertex__DiagnosticChain_Map() {
-		return getPseudostate().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPseudostate__ValidateTransitionsIncoming__DiagnosticChain_Map() {
-		return getPseudostate().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPseudostate__ValidateForkVertex__DiagnosticChain_Map() {
-		return getPseudostate().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPseudostate__ValidateTransitionsOutgoing__DiagnosticChain_Map() {
-		return getPseudostate().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPseudostate__ValidateJunctionVertex__DiagnosticChain_Map() {
-		return getPseudostate().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPseudostate__ValidateChoiceVertex__DiagnosticChain_Map() {
-		return getPseudostate().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPseudostate__ValidateOutgoingFromInitial__DiagnosticChain_Map() {
-		return getPseudostate().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProtocolConformance() {
-		if (protocolConformanceEClass == null) {
-			protocolConformanceEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(69);
-		}
-		return protocolConformanceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProtocolConformance_GeneralMachine() {
-		return (EReference) getProtocolConformance().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProtocolConformance_SpecificMachine() {
-		return (EReference) getProtocolConformance().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOperationTemplateParameter() {
-		if (operationTemplateParameterEClass == null) {
-			operationTemplateParameterEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(70);
-		}
-		return operationTemplateParameterEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOperationTemplateParameter__ValidateMatchDefaultSignature__DiagnosticChain_Map() {
-		return getOperationTemplateParameter().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getStructuralFeature() {
-		if (structuralFeatureEClass == null) {
-			structuralFeatureEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(71);
-		}
-		return structuralFeatureEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getStructuralFeature_IsReadOnly() {
-		return (EAttribute) getStructuralFeature().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAssociation() {
-		if (associationEClass == null) {
-			associationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(25);
-		}
-		return associationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssociation_IsDerived() {
-		return (EAttribute) getAssociation().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAssociation_EndType() {
-		return (EReference) getAssociation().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAssociation_MemberEnd() {
-		return (EReference) getAssociation().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAssociation_NavigableOwnedEnd() {
-		return (EReference) getAssociation().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAssociation__ValidateSpecializedEndNumber__DiagnosticChain_Map() {
-		return getAssociation().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAssociation__ValidateSpecializedEndTypes__DiagnosticChain_Map() {
-		return getAssociation().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAssociation__ValidateBinaryAssociations__DiagnosticChain_Map() {
-		return getAssociation().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAssociation__ValidateAssociationEnds__DiagnosticChain_Map() {
-		return getAssociation().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAssociation__ValidateEndsMustBeTyped__DiagnosticChain_Map() {
-		return getAssociation().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAssociation__IsBinary() {
-		return getAssociation().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAssociation__GetEndTypes() {
-		return getAssociation().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAssociation_OwnedEnd() {
-		return (EReference) getAssociation().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConnectableElementTemplateParameter() {
-		if (connectableElementTemplateParameterEClass == null) {
-			connectableElementTemplateParameterEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(32);
-		}
-		return connectableElementTemplateParameterEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCollaborationUse() {
-		if (collaborationUseEClass == null) {
-			collaborationUseEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(88);
-		}
-		return collaborationUseEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCollaborationUse_Type() {
-		return (EReference) getCollaborationUse().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCollaborationUse_RoleBinding() {
-		return (EReference) getCollaborationUse().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCollaborationUse__ValidateClientElements__DiagnosticChain_Map() {
-		return getCollaborationUse().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCollaborationUse__ValidateEveryRole__DiagnosticChain_Map() {
-		return getCollaborationUse().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCollaborationUse__ValidateConnectors__DiagnosticChain_Map() {
-		return getCollaborationUse().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCollaboration() {
-		if (collaborationEClass == null) {
-			collaborationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(89);
-		}
-		return collaborationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCollaboration_CollaborationRole() {
-		return (EReference) getCollaboration().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getStructuredClassifier() {
-		if (structuredClassifierEClass == null) {
-			structuredClassifierEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(90);
-		}
-		return structuredClassifierEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStructuredClassifier_OwnedAttribute() {
-		return (EReference) getStructuredClassifier().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStructuredClassifier_Part() {
-		return (EReference) getStructuredClassifier().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStructuredClassifier_Role() {
-		return (EReference) getStructuredClassifier().getEStructuralFeatures()
-			.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStructuredClassifier_OwnedConnector() {
-		return (EReference) getStructuredClassifier().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStructuredClassifier__CreateOwnedAttribute__String_Type_int_int() {
-		return getStructuredClassifier().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStructuredClassifier__GetParts() {
-		return getStructuredClassifier().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStructuredClassifier__AllRoles() {
-		return getStructuredClassifier().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConnector() {
-		if (connectorEClass == null) {
-			connectorEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(91);
-		}
-		return connectorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConnector_Type() {
-		return (EReference) getConnector().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConnector_RedefinedConnector() {
-		return (EReference) getConnector().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConnector_End() {
-		return (EReference) getConnector().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConnector_Kind() {
-		return (EAttribute) getConnector().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConnector_Contract() {
-		return (EReference) getConnector().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConnector__ValidateTypes__DiagnosticChain_Map() {
-		return getConnector().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConnector__GetKind() {
-		return getConnector().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConnector__ValidateRoles__DiagnosticChain_Map() {
-		return getConnector().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRedefinableTemplateSignature() {
-		if (redefinableTemplateSignatureEClass == null) {
-			redefinableTemplateSignatureEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(95);
-		}
-		return redefinableTemplateSignatureEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRedefinableTemplateSignature_ExtendedSignature() {
-		return (EReference) getRedefinableTemplateSignature()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRedefinableTemplateSignature_InheritedParameter() {
-		return (EReference) getRedefinableTemplateSignature()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRedefinableTemplateSignature_Classifier() {
-		return (EReference) getRedefinableTemplateSignature()
-			.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRedefinableTemplateSignature__ValidateRedefinesParents__DiagnosticChain_Map() {
-		return getRedefinableTemplateSignature().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRedefinableTemplateSignature__GetInheritedParameters() {
-		return getRedefinableTemplateSignature().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getClassifierTemplateParameter() {
-		if (classifierTemplateParameterEClass == null) {
-			classifierTemplateParameterEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(102);
-		}
-		return classifierTemplateParameterEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getClassifierTemplateParameter_AllowSubstitutable() {
-		return (EAttribute) getClassifierTemplateParameter()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClassifierTemplateParameter_ConstrainingClassifier() {
-		return (EReference) getClassifierTemplateParameter()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifierTemplateParameter__ValidateHasConstrainingClassifier__DiagnosticChain_Map() {
-		return getClassifierTemplateParameter().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifierTemplateParameter__ValidateParameteredElementNoFeatures__DiagnosticChain_Map() {
-		return getClassifierTemplateParameter().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifierTemplateParameter__ValidateMatchingAbstract__DiagnosticChain_Map() {
-		return getClassifierTemplateParameter().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifierTemplateParameter__ValidateActualIsClassifier__DiagnosticChain_Map() {
-		return getClassifierTemplateParameter().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifierTemplateParameter__ValidateConstrainingClassifiersConstrainArgs__DiagnosticChain_Map() {
-		return getClassifierTemplateParameter().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClassifierTemplateParameter__ValidateConstrainingClassifiersConstrainParameteredElement__DiagnosticChain_Map() {
-		return getClassifierTemplateParameter().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInterfaceRealization() {
-		if (interfaceRealizationEClass == null) {
-			interfaceRealizationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(103);
-		}
-		return interfaceRealizationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInterfaceRealization_Contract() {
-		return (EReference) getInterfaceRealization().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInterfaceRealization_ImplementingClassifier() {
-		return (EReference) getInterfaceRealization().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getEncapsulatedClassifier() {
-		if (encapsulatedClassifierEClass == null) {
-			encapsulatedClassifierEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(104);
-		}
-		return encapsulatedClassifierEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getEncapsulatedClassifier_OwnedPort() {
-		return (EReference) getEncapsulatedClassifier().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getEncapsulatedClassifier__GetOwnedPorts() {
-		return getEncapsulatedClassifier().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExtension() {
-		if (extensionEClass == null) {
-			extensionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(82);
-		}
-		return extensionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtension_IsRequired() {
-		return (EAttribute) getExtension().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExtension_Metaclass() {
-		return (EReference) getExtension().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExtension__ValidateNonOwnedEnd__DiagnosticChain_Map() {
-		return getExtension().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExtension__ValidateIsBinary__DiagnosticChain_Map() {
-		return getExtension().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExtension__GetStereotypeEnd() {
-		return getExtension().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExtension__GetStereotype() {
-		return getExtension().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExtension__MetaclassEnd() {
-		return getExtension().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExtension__IsRequired() {
-		return getExtension().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExtension__GetMetaclass() {
-		return getExtension().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExtensionEnd() {
-		if (extensionEndEClass == null) {
-			extensionEndEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(83);
-		}
-		return extensionEndEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExtensionEnd__ValidateMultiplicity__DiagnosticChain_Map() {
-		return getExtensionEnd().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExtensionEnd__ValidateAggregation__DiagnosticChain_Map() {
-		return getExtensionEnd().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getImage() {
-		if (imageEClass == null) {
-			imageEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(11);
-		}
-		return imageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getImage_Content() {
-		return (EAttribute) getImage().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getImage_Location() {
-		return (EAttribute) getImage().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getImage_Format() {
-		return (EAttribute) getImage().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getStringExpression() {
-		if (stringExpressionEClass == null) {
-			stringExpressionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(85);
-		}
-		return stringExpressionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStringExpression_SubExpression() {
-		return (EReference) getStringExpression().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStringExpression_OwningExpression() {
-		return (EReference) getStringExpression().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStringExpression__ValidateOperands__DiagnosticChain_Map() {
-		return getStringExpression().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStringExpression__ValidateSubexpressions__DiagnosticChain_Map() {
-		return getStringExpression().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExpression() {
-		if (expressionEClass == null) {
-			expressionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(86);
-		}
-		return expressionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExpression_Symbol() {
-		return (EAttribute) getExpression().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExpression_Operand() {
-		return (EReference) getExpression().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLiteralInteger() {
-		if (literalIntegerEClass == null) {
-			literalIntegerEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(248);
-		}
-		return literalIntegerEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLiteralInteger_Value() {
-		return (EAttribute) getLiteralInteger().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLiteralString() {
-		if (literalStringEClass == null) {
-			literalStringEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(251);
-		}
-		return literalStringEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLiteralString_Value() {
-		return (EAttribute) getLiteralString().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLiteralBoolean() {
-		if (literalBooleanEClass == null) {
-			literalBooleanEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(246);
-		}
-		return literalBooleanEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLiteralBoolean_Value() {
-		return (EAttribute) getLiteralBoolean().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLiteralNull() {
-		if (literalNullEClass == null) {
-			literalNullEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(249);
-		}
-		return literalNullEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLiteralReal() {
-		if (literalRealEClass == null) {
-			literalRealEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(250);
-		}
-		return literalRealEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLiteralReal_Value() {
-		return (EAttribute) getLiteralReal().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSlot() {
-		if (slotEClass == null) {
-			slotEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(78);
-		}
-		return slotEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSlot_OwningInstance() {
-		return (EReference) getSlot().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSlot_DefiningFeature() {
-		return (EReference) getSlot().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSlot_Value() {
-		return (EReference) getSlot().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInstanceSpecification() {
-		if (instanceSpecificationEClass == null) {
-			instanceSpecificationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(77);
-		}
-		return instanceSpecificationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInstanceSpecification_Classifier() {
-		return (EReference) getInstanceSpecification().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInstanceSpecification_Specification() {
-		return (EReference) getInstanceSpecification().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInstanceSpecification__ValidateDefiningFeature__DiagnosticChain_Map() {
-		return getInstanceSpecification().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInstanceSpecification__ValidateStructuralFeature__DiagnosticChain_Map() {
-		return getInstanceSpecification().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInstanceSpecification__ValidateDeploymentTarget__DiagnosticChain_Map() {
-		return getInstanceSpecification().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInstanceSpecification__ValidateDeploymentArtifact__DiagnosticChain_Map() {
-		return getInstanceSpecification().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInstanceSpecification_Slot() {
-		return (EReference) getInstanceSpecification().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getEnumeration() {
-		if (enumerationEClass == null) {
-			enumerationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(75);
-		}
-		return enumerationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getEnumeration_OwnedLiteral() {
-		return (EReference) getEnumeration().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getEnumeration__ValidateImmutable__DiagnosticChain_Map() {
-		return getEnumeration().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getEnumerationLiteral() {
-		if (enumerationLiteralEClass == null) {
-			enumerationLiteralEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(76);
-		}
-		return enumerationLiteralEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getEnumerationLiteral_Enumeration() {
-		return (EReference) getEnumerationLiteral().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getEnumerationLiteral__GetClassifiers() {
-		return getEnumerationLiteral().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getEnumerationLiteral__GetClassifier() {
-		return getEnumerationLiteral().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPrimitiveType() {
-		if (primitiveTypeEClass == null) {
-			primitiveTypeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(79);
-		}
-		return primitiveTypeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInstanceValue() {
-		if (instanceValueEClass == null) {
-			instanceValueEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(192);
-		}
-		return instanceValueEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInstanceValue_Instance() {
-		return (EReference) getInstanceValue().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLiteralUnlimitedNatural() {
-		if (literalUnlimitedNaturalEClass == null) {
-			literalUnlimitedNaturalEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(252);
-		}
-		return literalUnlimitedNaturalEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLiteralUnlimitedNatural_Value() {
-		return (EAttribute) getLiteralUnlimitedNatural()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOpaqueBehavior() {
-		if (opaqueBehaviorEClass == null) {
-			opaqueBehaviorEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(198);
-		}
-		return opaqueBehaviorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOpaqueBehavior_Body() {
-		return (EAttribute) getOpaqueBehavior().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOpaqueBehavior_Language() {
-		return (EAttribute) getOpaqueBehavior().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFunctionBehavior() {
-		if (functionBehaviorEClass == null) {
-			functionBehaviorEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(197);
-		}
-		return functionBehaviorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getFunctionBehavior__ValidateOneOutputParameter__DiagnosticChain_Map() {
-		return getFunctionBehavior().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getFunctionBehavior__ValidateTypesOfParameters__DiagnosticChain_Map() {
-		return getFunctionBehavior().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getFunctionBehavior__HasAllDataTypeAttributes__DataType() {
-		return getFunctionBehavior().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActor() {
-		if (actorEClass == null) {
-			actorEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(239);
-		}
-		return actorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActor__ValidateAssociations__DiagnosticChain_Map() {
-		return getActor().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActor__ValidateMustHaveName__DiagnosticChain_Map() {
-		return getActor().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getUsage() {
-		if (usageEClass == null) {
-			usageEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(87);
-		}
-		return usageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMessage() {
-		if (messageEClass == null) {
-			messageEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(208);
-		}
-		return messageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMessage_MessageKind() {
-		return (EAttribute) getMessage().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMessage_MessageSort() {
-		return (EAttribute) getMessage().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMessage_ReceiveEvent() {
-		return (EReference) getMessage().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMessage_SendEvent() {
-		return (EReference) getMessage().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMessage_Connector() {
-		return (EReference) getMessage().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMessage_Interaction() {
-		return (EReference) getMessage().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMessage_Argument() {
-		return (EReference) getMessage().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMessage_Signature() {
-		return (EReference) getMessage().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMessage__ValidateSendingReceivingMessageEvent__DiagnosticChain_Map() {
-		return getMessage().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMessage__ValidateSignatureReferTo__DiagnosticChain_Map() {
-		return getMessage().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMessage__ValidateSignatureIsOperationRequest__DiagnosticChain_Map() {
-		return getMessage().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMessage__ValidateSignatureIsOperationReply__DiagnosticChain_Map() {
-		return getMessage().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMessage__ValidateSignatureIsSignal__DiagnosticChain_Map() {
-		return getMessage().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMessage__ValidateArguments__DiagnosticChain_Map() {
-		return getMessage().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMessage__ValidateCannotCrossBoundaries__DiagnosticChain_Map() {
-		return getMessage().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMessage__ValidateOccurrenceSpecifications__DiagnosticChain_Map() {
-		return getMessage().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMessage__GetMessageKind() {
-		return getMessage().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMessageEnd() {
-		if (messageEndEClass == null) {
-			messageEndEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(215);
-		}
-		return messageEndEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMessageEnd_Message() {
-		return (EReference) getMessageEnd().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMessageEnd__OppositeEnd() {
-		return getMessageEnd().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMessageEnd__IsSend() {
-		return getMessageEnd().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMessageEnd__IsReceive() {
-		return getMessageEnd().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMessageEnd__EnclosingFragment() {
-		return getMessageEnd().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInteraction() {
-		if (interactionEClass == null) {
-			interactionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(209);
-		}
-		return interactionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteraction_Lifeline() {
-		return (EReference) getInteraction().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteraction_Fragment() {
-		return (EReference) getInteraction().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteraction_Action() {
-		return (EReference) getInteraction().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteraction_FormalGate() {
-		return (EReference) getInteraction().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteraction_Message() {
-		return (EReference) getInteraction().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInteraction__ValidateNotContained__DiagnosticChain_Map() {
-		return getInteraction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInteractionFragment() {
-		if (interactionFragmentEClass == null) {
-			interactionFragmentEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(210);
-		}
-		return interactionFragmentEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteractionFragment_Covered() {
-		return (EReference) getInteractionFragment().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteractionFragment_GeneralOrdering() {
-		return (EReference) getInteractionFragment().getEStructuralFeatures()
-			.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteractionFragment_EnclosingInteraction() {
-		return (EReference) getInteractionFragment().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteractionFragment_EnclosingOperand() {
-		return (EReference) getInteractionFragment().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLifeline() {
-		if (lifelineEClass == null) {
-			lifelineEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(211);
-		}
-		return lifelineEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLifeline_Represents() {
-		return (EReference) getLifeline().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLifeline_Interaction() {
-		return (EReference) getLifeline().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLifeline_Selector() {
-		return (EReference) getLifeline().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLifeline_DecomposedAs() {
-		return (EReference) getLifeline().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLifeline_CoveredBy() {
-		return (EReference) getLifeline().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLifeline__ValidateInteractionUsesShareLifeline__DiagnosticChain_Map() {
-		return getLifeline().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLifeline__ValidateSelectorSpecified__DiagnosticChain_Map() {
-		return getLifeline().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLifeline__ValidateSameClassifier__DiagnosticChain_Map() {
-		return getLifeline().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLifeline__ValidateSelectorIntOrString__DiagnosticChain_Map() {
-		return getLifeline().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPartDecomposition() {
-		if (partDecompositionEClass == null) {
-			partDecompositionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(212);
-		}
-		return partDecompositionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPartDecomposition__ValidatePartsOfInternalStructures__DiagnosticChain_Map() {
-		return getPartDecomposition().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPartDecomposition__ValidateAssume__DiagnosticChain_Map() {
-		return getPartDecomposition().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPartDecomposition__ValidateCommutativityOfDecomposition__DiagnosticChain_Map() {
-		return getPartDecomposition().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInteractionUse() {
-		if (interactionUseEClass == null) {
-			interactionUseEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(213);
-		}
-		return interactionUseEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteractionUse_RefersTo() {
-		return (EReference) getInteractionUse().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteractionUse_ReturnValue() {
-		return (EReference) getInteractionUse().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteractionUse_ReturnValueRecipient() {
-		return (EReference) getInteractionUse().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteractionUse_ActualGate() {
-		return (EReference) getInteractionUse().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteractionUse_Argument() {
-		return (EReference) getInteractionUse().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInteractionUse__ValidateGatesMatch__DiagnosticChain_Map() {
-		return getInteractionUse().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInteractionUse__ValidateAllLifelines__DiagnosticChain_Map() {
-		return getInteractionUse().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInteractionUse__ValidateArgumentsCorrespondToParameters__DiagnosticChain_Map() {
-		return getInteractionUse().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInteractionUse__ValidateReturnValueTypeRecipientCorrespondence__DiagnosticChain_Map() {
-		return getInteractionUse().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInteractionUse__ValidateArgumentsAreConstants__DiagnosticChain_Map() {
-		return getInteractionUse().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInteractionUse__ValidateReturnValueRecipientCoverage__DiagnosticChain_Map() {
-		return getInteractionUse().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGate() {
-		if (gateEClass == null) {
-			gateEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(214);
-		}
-		return gateEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGate__ValidateActualGateMatched__DiagnosticChain_Map() {
-		return getGate().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGate__ValidateInsideCfMatched__DiagnosticChain_Map() {
-		return getGate().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGate__ValidateOutsideCfMatched__DiagnosticChain_Map() {
-		return getGate().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGate__ValidateFormalGateDistinguishable__DiagnosticChain_Map() {
-		return getGate().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGate__ValidateActualGateDistinguishable__DiagnosticChain_Map() {
-		return getGate().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGate__ValidateOutsideCfGateDistinguishable__DiagnosticChain_Map() {
-		return getGate().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGate__ValidateInsideCfGateDistinguishable__DiagnosticChain_Map() {
-		return getGate().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGate__IsOutsideCF() {
-		return getGate().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGate__IsInsideCF() {
-		return getGate().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGate__IsActual() {
-		return getGate().getEOperations().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGate__IsFormal() {
-		return getGate().getEOperations().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGate__GetName() {
-		return getGate().getEOperations().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGate__Matches__Gate() {
-		return getGate().getEOperations().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGate__GetOperand() {
-		return getGate().getEOperations().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAction() {
-		if (actionEClass == null) {
-			actionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(111);
-		}
-		return actionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAction_Output() {
-		return (EReference) getAction().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAction__GetContext() {
-		return getAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAction__AllActions() {
-		return getAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAction__AllOwnedNodes() {
-		return getAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAction__ContainingBehavior() {
-		return getAction().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAction_Input() {
-		return (EReference) getAction().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAction_IsLocallyReentrant() {
-		return (EAttribute) getAction().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAction_Context() {
-		return (EReference) getAction().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAction_LocalPrecondition() {
-		return (EReference) getAction().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAction_LocalPostcondition() {
-		return (EReference) getAction().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExecutableNode() {
-		if (executableNodeEClass == null) {
-			executableNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(112);
-		}
-		return executableNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExecutableNode_Handler() {
-		return (EReference) getExecutableNode().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActivityNode() {
-		if (activityNodeEClass == null) {
-			activityNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(108);
-		}
-		return activityNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityNode_Outgoing() {
-		return (EReference) getActivityNode().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityNode_InGroup() {
-		return (EReference) getActivityNode().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityNode_InPartition() {
-		return (EReference) getActivityNode().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityNode_InStructuredNode() {
-		return (EReference) getActivityNode().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityNode_Activity() {
-		return (EReference) getActivityNode().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityNode_Incoming() {
-		return (EReference) getActivityNode().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityNode_InInterruptibleRegion() {
-		return (EReference) getActivityNode().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityNode_RedefinedNode() {
-		return (EReference) getActivityNode().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActivityEdge() {
-		if (activityEdgeEClass == null) {
-			activityEdgeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(106);
-		}
-		return activityEdgeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityEdge_Activity() {
-		return (EReference) getActivityEdge().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActivityEdge__ValidateSourceAndTarget__DiagnosticChain_Map() {
-		return getActivityEdge().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityEdge_InGroup() {
-		return (EReference) getActivityEdge().getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityEdge_InPartition() {
-		return (EReference) getActivityEdge().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityEdge_InStructuredNode() {
-		return (EReference) getActivityEdge().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityEdge_Target() {
-		return (EReference) getActivityEdge().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityEdge_RedefinedEdge() {
-		return (EReference) getActivityEdge().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityEdge_Guard() {
-		return (EReference) getActivityEdge().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityEdge_Weight() {
-		return (EReference) getActivityEdge().getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityEdge_Interrupts() {
-		return (EReference) getActivityEdge().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityEdge_Source() {
-		return (EReference) getActivityEdge().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActivity() {
-		if (activityEClass == null) {
-			activityEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(1);
-		}
-		return activityEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_OwnedGroup() {
-		return (EReference) getActivity().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_IsReadOnly() {
-		return (EAttribute) getActivity().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_Partition() {
-		return (EReference) getActivity().getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_Group() {
-		return (EReference) getActivity().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_OwnedNode() {
-		return (EReference) getActivity().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_IsSingleExecution() {
-		return (EAttribute) getActivity().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_StructuredNode() {
-		return (EReference) getActivity().getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActivity__ValidateMaximumOneParameterNode__DiagnosticChain_Map() {
-		return getActivity().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActivity__ValidateMaximumTwoParameterNodes__DiagnosticChain_Map() {
-		return getActivity().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_Variable() {
-		return (EReference) getActivity().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_Node() {
-		return (EReference) getActivity().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_Edge() {
-		return (EReference) getActivity().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActivityPartition() {
-		if (activityPartitionEClass == null) {
-			activityPartitionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(107);
-		}
-		return activityPartitionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivityPartition_IsDimension() {
-		return (EAttribute) getActivityPartition().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivityPartition_IsExternal() {
-		return (EAttribute) getActivityPartition().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityPartition_Edge() {
-		return (EReference) getActivityPartition().getEStructuralFeatures()
-			.get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActivityPartition__ValidateDimensionNotContained__DiagnosticChain_Map() {
-		return getActivityPartition().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActivityPartition__ValidateRepresentsClassifier__DiagnosticChain_Map() {
-		return getActivityPartition().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActivityPartition__ValidateRepresentsPropertyAndIsContained__DiagnosticChain_Map() {
-		return getActivityPartition().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActivityPartition__ValidateRepresentsProperty__DiagnosticChain_Map() {
-		return getActivityPartition().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityPartition_Node() {
-		return (EReference) getActivityPartition().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityPartition_Subpartition() {
-		return (EReference) getActivityPartition().getEStructuralFeatures()
-			.get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityPartition_SuperPartition() {
-		return (EReference) getActivityPartition().getEStructuralFeatures()
-			.get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityPartition_Represents() {
-		return (EReference) getActivityPartition().getEStructuralFeatures()
-			.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActivityGroup() {
-		if (activityGroupEClass == null) {
-			activityGroupEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(105);
-		}
-		return activityGroupEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityGroup_Subgroup() {
-		return (EReference) getActivityGroup().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityGroup_SuperGroup() {
-		return (EReference) getActivityGroup().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityGroup_ContainedNode() {
-		return (EReference) getActivityGroup().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActivityGroup__ValidateNodesAndEdges__DiagnosticChain_Map() {
-		return getActivityGroup().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActivityGroup__ValidateNotContained__DiagnosticChain_Map() {
-		return getActivityGroup().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityGroup_InActivity() {
-		return (EReference) getActivityGroup().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityGroup_ContainedEdge() {
-		return (EReference) getActivityGroup().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getStructuredActivityNode() {
-		if (structuredActivityNodeEClass == null) {
-			structuredActivityNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(110);
-		}
-		return structuredActivityNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStructuredActivityNode_Variable() {
-		return (EReference) getStructuredActivityNode().getEStructuralFeatures()
-			.get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStructuredActivityNode_Node() {
-		return (EReference) getStructuredActivityNode().getEStructuralFeatures()
-			.get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStructuredActivityNode_StructuredNodeInput() {
-		return (EReference) getStructuredActivityNode().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStructuredActivityNode_StructuredNodeOutput() {
-		return (EReference) getStructuredActivityNode().getEStructuralFeatures()
-			.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStructuredActivityNode__ValidateEdges__DiagnosticChain_Map() {
-		return getStructuredActivityNode().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStructuredActivityNode__ValidateInputPinEdges__DiagnosticChain_Map() {
-		return getStructuredActivityNode().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStructuredActivityNode__SourceNodes() {
-		return getStructuredActivityNode().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStructuredActivityNode__TargetNodes() {
-		return getStructuredActivityNode().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getStructuredActivityNode_MustIsolate() {
-		return (EAttribute) getStructuredActivityNode().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStructuredActivityNode_Edge() {
-		return (EReference) getStructuredActivityNode().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStructuredActivityNode__ValidateOutputPinEdges__DiagnosticChain_Map() {
-		return getStructuredActivityNode().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getVariable() {
-		if (variableEClass == null) {
-			variableEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(119);
-		}
-		return variableEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getVariable_ActivityScope() {
-		return (EReference) getVariable().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getVariable__IsAccessibleBy__Action() {
-		return getVariable().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getVariable_Scope() {
-		return (EReference) getVariable().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInterruptibleActivityRegion() {
-		if (interruptibleActivityRegionEClass == null) {
-			interruptibleActivityRegionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(109);
-		}
-		return interruptibleActivityRegionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInterruptibleActivityRegion_Node() {
-		return (EReference) getInterruptibleActivityRegion()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInterruptibleActivityRegion_InterruptingEdge() {
-		return (EReference) getInterruptibleActivityRegion()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInterruptibleActivityRegion__ValidateInterruptingEdges__DiagnosticChain_Map() {
-		return getInterruptibleActivityRegion().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExceptionHandler() {
-		if (exceptionHandlerEClass == null) {
-			exceptionHandlerEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(113);
-		}
-		return exceptionHandlerEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExceptionHandler_HandlerBody() {
-		return (EReference) getExceptionHandler().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExceptionHandler_ExceptionInput() {
-		return (EReference) getExceptionHandler().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExceptionHandler_ExceptionType() {
-		return (EReference) getExceptionHandler().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExceptionHandler_ProtectedNode() {
-		return (EReference) getExceptionHandler().getEStructuralFeatures()
-			.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExceptionHandler__ValidateHandlerBodyEdges__DiagnosticChain_Map() {
-		return getExceptionHandler().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExceptionHandler__ValidateOutputPins__DiagnosticChain_Map() {
-		return getExceptionHandler().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExceptionHandler__ValidateOneInput__DiagnosticChain_Map() {
-		return getExceptionHandler().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExceptionHandler__ValidateEdgeSourceTarget__DiagnosticChain_Map() {
-		return getExceptionHandler().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExceptionHandler__ValidateHandlerBodyOwner__DiagnosticChain_Map() {
-		return getExceptionHandler().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExceptionHandler__ValidateExceptionInputType__DiagnosticChain_Map() {
-		return getExceptionHandler().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getObjectNode() {
-		if (objectNodeEClass == null) {
-			objectNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(114);
-		}
-		return objectNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getObjectNode_Ordering() {
-		return (EAttribute) getObjectNode().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getObjectNode_IsControlType() {
-		return (EAttribute) getObjectNode().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getObjectNode_UpperBound() {
-		return (EReference) getObjectNode().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getObjectNode_InState() {
-		return (EReference) getObjectNode().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getObjectNode_Selection() {
-		return (EReference) getObjectNode().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getObjectNode__ValidateObjectFlowEdges__DiagnosticChain_Map() {
-		return getObjectNode().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getObjectNode__ValidateSelectionBehavior__DiagnosticChain_Map() {
-		return getObjectNode().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getObjectNode__ValidateInputOutputParameter__DiagnosticChain_Map() {
-		return getObjectNode().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOutputPin() {
-		if (outputPinEClass == null) {
-			outputPinEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(118);
-		}
-		return outputPinEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOutputPin__ValidateIncomingEdgesStructuredOnly__DiagnosticChain_Map() {
-		return getOutputPin().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPin() {
-		if (pinEClass == null) {
-			pinEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(117);
-		}
-		return pinEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPin_IsControl() {
-		return (EAttribute) getPin().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPin__ValidateControlPins__DiagnosticChain_Map() {
-		return getPin().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getPin__ValidateNotUnique__DiagnosticChain_Map() {
-		return getPin().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInputPin() {
-		if (inputPinEClass == null) {
-			inputPinEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(116);
-		}
-		return inputPinEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInputPin__ValidateOutgoingEdgesStructuredOnly__DiagnosticChain_Map() {
-		return getInputPin().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGeneralOrdering() {
-		if (generalOrderingEClass == null) {
-			generalOrderingEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(218);
-		}
-		return generalOrderingEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGeneralOrdering_Before() {
-		return (EReference) getGeneralOrdering().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getGeneralOrdering__ValidateIrreflexiveTransitiveClosure__DiagnosticChain_Map() {
-		return getGeneralOrdering().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGeneralOrdering_After() {
-		return (EReference) getGeneralOrdering().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOccurrenceSpecification() {
-		if (occurrenceSpecificationEClass == null) {
-			occurrenceSpecificationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(219);
-		}
-		return occurrenceSpecificationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOccurrenceSpecification_ToBefore() {
-		return (EReference) getOccurrenceSpecification()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOccurrenceSpecification__GetCovered() {
-		return getOccurrenceSpecification().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOccurrenceSpecification__SetCovered__Lifeline() {
-		return getOccurrenceSpecification().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOccurrenceSpecification_ToAfter() {
-		return (EReference) getOccurrenceSpecification()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInteractionOperand() {
-		if (interactionOperandEClass == null) {
-			interactionOperandEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(216);
-		}
-		return interactionOperandEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteractionOperand_Guard() {
-		return (EReference) getInteractionOperand().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteractionOperand_Fragment() {
-		return (EReference) getInteractionOperand().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInteractionOperand__ValidateGuardDirectlyPrior__DiagnosticChain_Map() {
-		return getInteractionOperand().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInteractionOperand__ValidateGuardContainReferences__DiagnosticChain_Map() {
-		return getInteractionOperand().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInteractionConstraint() {
-		if (interactionConstraintEClass == null) {
-			interactionConstraintEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(217);
-		}
-		return interactionConstraintEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteractionConstraint_Minint() {
-		return (EReference) getInteractionConstraint().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInteractionConstraint_Maxint() {
-		return (EReference) getInteractionConstraint().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInteractionConstraint__ValidateDynamicVariables__DiagnosticChain_Map() {
-		return getInteractionConstraint().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInteractionConstraint__ValidateGlobalData__DiagnosticChain_Map() {
-		return getInteractionConstraint().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInteractionConstraint__ValidateMinintMaxint__DiagnosticChain_Map() {
-		return getInteractionConstraint().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInteractionConstraint__ValidateMinintNonNegative__DiagnosticChain_Map() {
-		return getInteractionConstraint().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInteractionConstraint__ValidateMaxintPositive__DiagnosticChain_Map() {
-		return getInteractionConstraint().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInteractionConstraint__ValidateMaxintGreaterEqualMinint__DiagnosticChain_Map() {
-		return getInteractionConstraint().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExecutionSpecification() {
-		if (executionSpecificationEClass == null) {
-			executionSpecificationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(224);
-		}
-		return executionSpecificationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExecutionSpecification_Start() {
-		return (EReference) getExecutionSpecification().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExecutionSpecification_Finish() {
-		return (EReference) getExecutionSpecification().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExecutionSpecification__ValidateSameLifeline__DiagnosticChain_Map() {
-		return getExecutionSpecification().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExecutionOccurrenceSpecification() {
-		if (executionOccurrenceSpecificationEClass == null) {
-			executionOccurrenceSpecificationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(232);
-		}
-		return executionOccurrenceSpecificationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExecutionOccurrenceSpecification_Execution() {
-		return (EReference) getExecutionOccurrenceSpecification()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getStateInvariant() {
-		if (stateInvariantEClass == null) {
-			stateInvariantEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(233);
-		}
-		return stateInvariantEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStateInvariant_Invariant() {
-		return (EReference) getStateInvariant().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActionExecutionSpecification() {
-		if (actionExecutionSpecificationEClass == null) {
-			actionExecutionSpecificationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(223);
-		}
-		return actionExecutionSpecificationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActionExecutionSpecification_Action() {
-		return (EReference) getActionExecutionSpecification()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActionExecutionSpecification__ValidateActionReferenced__DiagnosticChain_Map() {
-		return getActionExecutionSpecification().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBehaviorExecutionSpecification() {
-		if (behaviorExecutionSpecificationEClass == null) {
-			behaviorExecutionSpecificationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(225);
-		}
-		return behaviorExecutionSpecificationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorExecutionSpecification_Behavior() {
-		return (EReference) getBehaviorExecutionSpecification()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMessageEvent() {
-		if (messageEventEClass == null) {
-			messageEventEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(194);
-		}
-		return messageEventEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMessageOccurrenceSpecification() {
-		if (messageOccurrenceSpecificationEClass == null) {
-			messageOccurrenceSpecificationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(231);
-		}
-		return messageOccurrenceSpecificationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCombinedFragment() {
-		if (combinedFragmentEClass == null) {
-			combinedFragmentEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(226);
-		}
-		return combinedFragmentEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getCombinedFragment_InteractionOperator() {
-		return (EAttribute) getCombinedFragment().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCombinedFragment_Operand() {
-		return (EReference) getCombinedFragment().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCombinedFragment_CfragmentGate() {
-		return (EReference) getCombinedFragment().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCombinedFragment__ValidateOptLoopBreakNeg__DiagnosticChain_Map() {
-		return getCombinedFragment().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCombinedFragment__ValidateBreak__DiagnosticChain_Map() {
-		return getCombinedFragment().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCombinedFragment__ValidateConsiderAndIgnore__DiagnosticChain_Map() {
-		return getCombinedFragment().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getContinuation() {
-		if (continuationEClass == null) {
-			continuationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(229);
-		}
-		return continuationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContinuation_Setting() {
-		return (EAttribute) getContinuation().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getContinuation__ValidateSameName__DiagnosticChain_Map() {
-		return getContinuation().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getContinuation__ValidateGlobal__DiagnosticChain_Map() {
-		return getContinuation().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getContinuation__ValidateFirstOrLastInteractionFragment__DiagnosticChain_Map() {
-		return getContinuation().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConsiderIgnoreFragment() {
-		if (considerIgnoreFragmentEClass == null) {
-			considerIgnoreFragmentEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(228);
-		}
-		return considerIgnoreFragmentEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConsiderIgnoreFragment_Message() {
-		return (EReference) getConsiderIgnoreFragment().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConsiderIgnoreFragment__ValidateConsiderOrIgnore__DiagnosticChain_Map() {
-		return getConsiderIgnoreFragment().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConsiderIgnoreFragment__ValidateType__DiagnosticChain_Map() {
-		return getConsiderIgnoreFragment().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCallEvent() {
-		if (callEventEClass == null) {
-			callEventEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(195);
-		}
-		return callEventEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCallEvent_Operation() {
-		return (EReference) getCallEvent().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getChangeEvent() {
-		if (changeEventEClass == null) {
-			changeEventEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(196);
-		}
-		return changeEventEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getChangeEvent_ChangeExpression() {
-		return (EReference) getChangeEvent().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSignalEvent() {
-		if (signalEventEClass == null) {
-			signalEventEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(199);
-		}
-		return signalEventEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSignalEvent_Signal() {
-		return (EReference) getSignalEvent().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAnyReceiveEvent() {
-		if (anyReceiveEventEClass == null) {
-			anyReceiveEventEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(193);
-		}
-		return anyReceiveEventEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCreateObjectAction() {
-		if (createObjectActionEClass == null) {
-			createObjectActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(148);
-		}
-		return createObjectActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCreateObjectAction_Classifier() {
-		return (EReference) getCreateObjectAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCreateObjectAction_Result() {
-		return (EReference) getCreateObjectAction().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCreateObjectAction__ValidateClassifierNotAbstract__DiagnosticChain_Map() {
-		return getCreateObjectAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCreateObjectAction__ValidateClassifierNotAssociationClass__DiagnosticChain_Map() {
-		return getCreateObjectAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCreateObjectAction__ValidateSameType__DiagnosticChain_Map() {
-		return getCreateObjectAction().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCreateObjectAction__ValidateMultiplicity__DiagnosticChain_Map() {
-		return getCreateObjectAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDestroyObjectAction() {
-		if (destroyObjectActionEClass == null) {
-			destroyObjectActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(151);
-		}
-		return destroyObjectActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDestroyObjectAction_IsDestroyLinks() {
-		return (EAttribute) getDestroyObjectAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDestroyObjectAction_IsDestroyOwnedObjects() {
-		return (EAttribute) getDestroyObjectAction().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDestroyObjectAction_Target() {
-		return (EReference) getDestroyObjectAction().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDestroyObjectAction__ValidateMultiplicity__DiagnosticChain_Map() {
-		return getDestroyObjectAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDestroyObjectAction__ValidateNoType__DiagnosticChain_Map() {
-		return getDestroyObjectAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDestructionOccurrenceSpecification() {
-		if (destructionOccurrenceSpecificationEClass == null) {
-			destructionOccurrenceSpecificationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(230);
-		}
-		return destructionOccurrenceSpecificationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDestructionOccurrenceSpecification__ValidateNoOccurrenceSpecificationsBelow__DiagnosticChain_Map() {
-		return getDestructionOccurrenceSpecification().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTestIdentityAction() {
-		if (testIdentityActionEClass == null) {
-			testIdentityActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(175);
-		}
-		return testIdentityActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTestIdentityAction_First() {
-		return (EReference) getTestIdentityAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTestIdentityAction_Second() {
-		return (EReference) getTestIdentityAction().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTestIdentityAction_Result() {
-		return (EReference) getTestIdentityAction().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTestIdentityAction__ValidateNoType__DiagnosticChain_Map() {
-		return getTestIdentityAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTestIdentityAction__ValidateMultiplicity__DiagnosticChain_Map() {
-		return getTestIdentityAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTestIdentityAction__ValidateResultIsBoolean__DiagnosticChain_Map() {
-		return getTestIdentityAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReadSelfAction() {
-		if (readSelfActionEClass == null) {
-			readSelfActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(162);
-		}
-		return readSelfActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReadSelfAction_Result() {
-		return (EReference) getReadSelfAction().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadSelfAction__ValidateContained__DiagnosticChain_Map() {
-		return getReadSelfAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadSelfAction__ValidateNotStatic__DiagnosticChain_Map() {
-		return getReadSelfAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadSelfAction__ValidateType__DiagnosticChain_Map() {
-		return getReadSelfAction().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadSelfAction__ValidateMultiplicity__DiagnosticChain_Map() {
-		return getReadSelfAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getStructuralFeatureAction() {
-		if (structuralFeatureActionEClass == null) {
-			structuralFeatureActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(127);
-		}
-		return structuralFeatureActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStructuralFeatureAction_StructuralFeature() {
-		return (EReference) getStructuralFeatureAction()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStructuralFeatureAction_Object() {
-		return (EReference) getStructuralFeatureAction()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStructuralFeatureAction__ValidateNotStatic__DiagnosticChain_Map() {
-		return getStructuralFeatureAction().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStructuralFeatureAction__ValidateMultiplicity__DiagnosticChain_Map() {
-		return getStructuralFeatureAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStructuralFeatureAction__ValidateObjectType__DiagnosticChain_Map() {
-		return getStructuralFeatureAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStructuralFeatureAction__ValidateVisibility__DiagnosticChain_Map() {
-		return getStructuralFeatureAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStructuralFeatureAction__ValidateOneFeaturingClassifier__DiagnosticChain_Map() {
-		return getStructuralFeatureAction().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReadStructuralFeatureAction() {
-		if (readStructuralFeatureActionEClass == null) {
-			readStructuralFeatureActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(163);
-		}
-		return readStructuralFeatureActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReadStructuralFeatureAction_Result() {
-		return (EReference) getReadStructuralFeatureAction()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadStructuralFeatureAction__ValidateTypeAndOrdering__DiagnosticChain_Map() {
-		return getReadStructuralFeatureAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWriteStructuralFeatureAction() {
-		if (writeStructuralFeatureActionEClass == null) {
-			writeStructuralFeatureActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(126);
-		}
-		return writeStructuralFeatureActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWriteStructuralFeatureAction_Value() {
-		return (EReference) getWriteStructuralFeatureAction()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWriteStructuralFeatureAction_Result() {
-		return (EReference) getWriteStructuralFeatureAction()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getWriteStructuralFeatureAction__ValidateTypeOfResult__DiagnosticChain_Map() {
-		return getWriteStructuralFeatureAction().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getWriteStructuralFeatureAction__ValidateMultiplicityOfResult__DiagnosticChain_Map() {
-		return getWriteStructuralFeatureAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getWriteStructuralFeatureAction__ValidateTypeOfValue__DiagnosticChain_Map() {
-		return getWriteStructuralFeatureAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getWriteStructuralFeatureAction__ValidateMultiplicityOfValue__DiagnosticChain_Map() {
-		return getWriteStructuralFeatureAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getClearStructuralFeatureAction() {
-		if (clearStructuralFeatureActionEClass == null) {
-			clearStructuralFeatureActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(142);
-		}
-		return clearStructuralFeatureActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClearStructuralFeatureAction_Result() {
-		return (EReference) getClearStructuralFeatureAction()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClearStructuralFeatureAction__ValidateTypeOfResult__DiagnosticChain_Map() {
-		return getClearStructuralFeatureAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClearStructuralFeatureAction__ValidateMultiplicityOfResult__DiagnosticChain_Map() {
-		return getClearStructuralFeatureAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRemoveStructuralFeatureValueAction() {
-		if (removeStructuralFeatureValueActionEClass == null) {
-			removeStructuralFeatureValueActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(167);
-		}
-		return removeStructuralFeatureValueActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRemoveStructuralFeatureValueAction_IsRemoveDuplicates() {
-		return (EAttribute) getRemoveStructuralFeatureValueAction()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRemoveStructuralFeatureValueAction_RemoveAt() {
-		return (EReference) getRemoveStructuralFeatureValueAction()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRemoveStructuralFeatureValueAction__ValidateRemoveAtAndValue__DiagnosticChain_Map() {
-		return getRemoveStructuralFeatureValueAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAddStructuralFeatureValueAction() {
-		if (addStructuralFeatureValueActionEClass == null) {
-			addStructuralFeatureValueActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(133);
-		}
-		return addStructuralFeatureValueActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAddStructuralFeatureValueAction_IsReplaceAll() {
-		return (EAttribute) getAddStructuralFeatureValueAction()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAddStructuralFeatureValueAction__ValidateRequiredValue__DiagnosticChain_Map() {
-		return getAddStructuralFeatureValueAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAddStructuralFeatureValueAction__ValidateInsertAtPin__DiagnosticChain_Map() {
-		return getAddStructuralFeatureValueAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAddStructuralFeatureValueAction_InsertAt() {
-		return (EReference) getAddStructuralFeatureValueAction()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLinkAction() {
-		if (linkActionEClass == null) {
-			linkActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(123);
-		}
-		return linkActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLinkAction_EndData() {
-		return (EReference) getLinkAction().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLinkAction_InputValue() {
-		return (EReference) getLinkAction().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLinkAction__ValidateSameAssociation__DiagnosticChain_Map() {
-		return getLinkAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLinkAction__ValidateNotStatic__DiagnosticChain_Map() {
-		return getLinkAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLinkAction__ValidateSamePins__DiagnosticChain_Map() {
-		return getLinkAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLinkAction__Association() {
-		return getLinkAction().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLinkEndData() {
-		if (linkEndDataEClass == null) {
-			linkEndDataEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(124);
-		}
-		return linkEndDataEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLinkEndData_Value() {
-		return (EReference) getLinkEndData().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLinkEndData_End() {
-		return (EReference) getLinkEndData().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLinkEndData_Qualifier() {
-		return (EReference) getLinkEndData().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLinkEndData__ValidatePropertyIsAssociationEnd__DiagnosticChain_Map() {
-		return getLinkEndData().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLinkEndData__ValidateSameType__DiagnosticChain_Map() {
-		return getLinkEndData().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLinkEndData__ValidateMultiplicity__DiagnosticChain_Map() {
-		return getLinkEndData().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLinkEndData__ValidateQualifiers__DiagnosticChain_Map() {
-		return getLinkEndData().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLinkEndData__AllPins() {
-		return getLinkEndData().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLinkEndData__ValidateEndObjectInputPin__DiagnosticChain_Map() {
-		return getLinkEndData().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getQualifierValue() {
-		if (qualifierValueEClass == null) {
-			qualifierValueEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(125);
-		}
-		return qualifierValueEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getQualifierValue_Qualifier() {
-		return (EReference) getQualifierValue().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getQualifierValue_Value() {
-		return (EReference) getQualifierValue().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getQualifierValue__ValidateQualifierAttribute__DiagnosticChain_Map() {
-		return getQualifierValue().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getQualifierValue__ValidateTypeOfQualifier__DiagnosticChain_Map() {
-		return getQualifierValue().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getQualifierValue__ValidateMultiplicityOfQualifier__DiagnosticChain_Map() {
-		return getQualifierValue().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReadLinkAction() {
-		if (readLinkActionEClass == null) {
-			readLinkActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(159);
-		}
-		return readLinkActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReadLinkAction_Result() {
-		return (EReference) getReadLinkAction().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkAction__ValidateOneOpenEnd__DiagnosticChain_Map() {
-		return getReadLinkAction().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkAction__ValidateTypeAndOrdering__DiagnosticChain_Map() {
-		return getReadLinkAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkAction__ValidateCompatibleMultiplicity__DiagnosticChain_Map() {
-		return getReadLinkAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkAction__ValidateNavigableOpenEnd__DiagnosticChain_Map() {
-		return getReadLinkAction().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkAction__OpenEnd() {
-		return getReadLinkAction().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkAction__ValidateVisibility__DiagnosticChain_Map() {
-		return getReadLinkAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLinkEndCreationData() {
-		if (linkEndCreationDataEClass == null) {
-			linkEndCreationDataEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(146);
-		}
-		return linkEndCreationDataEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLinkEndCreationData_IsReplaceAll() {
-		return (EAttribute) getLinkEndCreationData().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLinkEndCreationData__ValidateInsertAtPin__DiagnosticChain_Map() {
-		return getLinkEndCreationData().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLinkEndCreationData_InsertAt() {
-		return (EReference) getLinkEndCreationData().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCreateLinkAction() {
-		if (createLinkActionEClass == null) {
-			createLinkActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(145);
-		}
-		return createLinkActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCreateLinkAction__ValidateAssociationNotAbstract__DiagnosticChain_Map() {
-		return getCreateLinkAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWriteLinkAction() {
-		if (writeLinkActionEClass == null) {
-			writeLinkActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(122);
-		}
-		return writeLinkActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getWriteLinkAction__ValidateAllowAccess__DiagnosticChain_Map() {
-		return getWriteLinkAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDestroyLinkAction() {
-		if (destroyLinkActionEClass == null) {
-			destroyLinkActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(149);
-		}
-		return destroyLinkActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLinkEndDestructionData() {
-		if (linkEndDestructionDataEClass == null) {
-			linkEndDestructionDataEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(150);
-		}
-		return linkEndDestructionDataEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLinkEndDestructionData_IsDestroyDuplicates() {
-		return (EAttribute) getLinkEndDestructionData().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLinkEndDestructionData__ValidateDestroyAtPin__DiagnosticChain_Map() {
-		return getLinkEndDestructionData().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLinkEndDestructionData_DestroyAt() {
-		return (EReference) getLinkEndDestructionData().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getClearAssociationAction() {
-		if (clearAssociationActionEClass == null) {
-			clearAssociationActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(141);
-		}
-		return clearAssociationActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClearAssociationAction_Object() {
-		return (EReference) getClearAssociationAction().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClearAssociationAction_Association() {
-		return (EReference) getClearAssociationAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClearAssociationAction__ValidateSameType__DiagnosticChain_Map() {
-		return getClearAssociationAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClearAssociationAction__ValidateMultiplicity__DiagnosticChain_Map() {
-		return getClearAssociationAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBroadcastSignalAction() {
-		if (broadcastSignalActionEClass == null) {
-			broadcastSignalActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(135);
-		}
-		return broadcastSignalActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBroadcastSignalAction_Signal() {
-		return (EReference) getBroadcastSignalAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBroadcastSignalAction__ValidateNumberOfArguments__DiagnosticChain_Map() {
-		return getBroadcastSignalAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBroadcastSignalAction__ValidateTypeOrderingMultiplicity__DiagnosticChain_Map() {
-		return getBroadcastSignalAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getBroadcastSignalAction__ValidateNoOnport__DiagnosticChain_Map() {
-		return getBroadcastSignalAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInvocationAction() {
-		if (invocationActionEClass == null) {
-			invocationActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(136);
-		}
-		return invocationActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInvocationAction_Argument() {
-		return (EReference) getInvocationAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInvocationAction_OnPort() {
-		return (EReference) getInvocationAction().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSendObjectAction() {
-		if (sendObjectActionEClass == null) {
-			sendObjectActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(170);
-		}
-		return sendObjectActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSendObjectAction_Target() {
-		return (EReference) getSendObjectAction().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getSendObjectAction__ValidateTypeTargetPin__DiagnosticChain_Map() {
-		return getSendObjectAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSendObjectAction_Request() {
-		return (EReference) getSendObjectAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValueSpecificationAction() {
-		if (valueSpecificationActionEClass == null) {
-			valueSpecificationActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(120);
-		}
-		return valueSpecificationActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValueSpecificationAction_Value() {
-		return (EReference) getValueSpecificationAction()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValueSpecificationAction_Result() {
-		return (EReference) getValueSpecificationAction()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getValueSpecificationAction__ValidateCompatibleType__DiagnosticChain_Map() {
-		return getValueSpecificationAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getValueSpecificationAction__ValidateMultiplicity__DiagnosticChain_Map() {
-		return getValueSpecificationAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTimeExpression() {
-		if (timeExpressionEClass == null) {
-			timeExpressionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(201);
-		}
-		return timeExpressionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTimeExpression_Expr() {
-		return (EReference) getTimeExpression().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTimeExpression_Observation() {
-		return (EReference) getTimeExpression().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTimeExpression__ValidateNoExprRequiresObservation__DiagnosticChain_Map() {
-		return getTimeExpression().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getObservation() {
-		if (observationEClass == null) {
-			observationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(202);
-		}
-		return observationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDuration() {
-		if (durationEClass == null) {
-			durationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(240);
-		}
-		return durationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDuration_Expr() {
-		return (EReference) getDuration().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDuration_Observation() {
-		return (EReference) getDuration().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDuration__ValidateNoExprRequiresObservation__DiagnosticChain_Map() {
-		return getDuration().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValuePin() {
-		if (valuePinEClass == null) {
-			valuePinEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(177);
-		}
-		return valuePinEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValuePin_Value() {
-		return (EReference) getValuePin().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getValuePin__ValidateCompatibleType__DiagnosticChain_Map() {
-		return getValuePin().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getValuePin__ValidateNoIncomingEdges__DiagnosticChain_Map() {
-		return getValuePin().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDurationInterval() {
-		if (durationIntervalEClass == null) {
-			durationIntervalEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(244);
-		}
-		return durationIntervalEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInterval() {
-		if (intervalEClass == null) {
-			intervalEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(243);
-		}
-		return intervalEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInterval_Min() {
-		return (EReference) getInterval().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInterval_Max() {
-		return (EReference) getInterval().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTimeConstraint() {
-		if (timeConstraintEClass == null) {
-			timeConstraintEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(253);
-		}
-		return timeConstraintEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTimeConstraint_FirstEvent() {
-		return (EAttribute) getTimeConstraint().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTimeConstraint__ValidateHasOneConstrainedElement__DiagnosticChain_Map() {
-		return getTimeConstraint().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getIntervalConstraint() {
-		if (intervalConstraintEClass == null) {
-			intervalConstraintEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(242);
-		}
-		return intervalConstraintEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTimeInterval() {
-		if (timeIntervalEClass == null) {
-			timeIntervalEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(254);
-		}
-		return timeIntervalEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDurationConstraint() {
-		if (durationConstraintEClass == null) {
-			durationConstraintEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(241);
-		}
-		return durationConstraintEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDurationConstraint_FirstEvent() {
-		return (EAttribute) getDurationConstraint().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDurationConstraint__ValidateFirstEventMultiplicity__DiagnosticChain_Map() {
-		return getDurationConstraint().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDurationConstraint__ValidateHasOneOrTwoConstrainedElements__DiagnosticChain_Map() {
-		return getDurationConstraint().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTimeObservation() {
-		if (timeObservationEClass == null) {
-			timeObservationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(255);
-		}
-		return timeObservationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTimeObservation_Event() {
-		return (EReference) getTimeObservation().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTimeObservation_FirstEvent() {
-		return (EAttribute) getTimeObservation().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDurationObservation() {
-		if (durationObservationEClass == null) {
-			durationObservationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(245);
-		}
-		return durationObservationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDurationObservation_Event() {
-		return (EReference) getDurationObservation().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDurationObservation_FirstEvent() {
-		return (EAttribute) getDurationObservation().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDurationObservation__ValidateFirstEventMultiplicity__DiagnosticChain_Map() {
-		return getDurationObservation().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOpaqueAction() {
-		if (opaqueActionEClass == null) {
-			opaqueActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(155);
-		}
-		return opaqueActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOpaqueAction_Body() {
-		return (EAttribute) getOpaqueAction().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOpaqueAction_Language() {
-		return (EAttribute) getOpaqueAction().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOpaqueAction_InputValue() {
-		return (EReference) getOpaqueAction().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOpaqueAction_OutputValue() {
-		return (EReference) getOpaqueAction().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getOpaqueAction__ValidateLanguageBodySize__DiagnosticChain_Map() {
-		return getOpaqueAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCallAction() {
-		if (callActionEClass == null) {
-			callActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(137);
-		}
-		return callActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getCallAction_IsSynchronous() {
-		return (EAttribute) getCallAction().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCallAction_Result() {
-		return (EReference) getCallAction().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCallAction__ValidateArgumentPins__DiagnosticChain_Map() {
-		return getCallAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCallAction__ValidateResultPins__DiagnosticChain_Map() {
-		return getCallAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCallAction__ValidateSynchronousCall__DiagnosticChain_Map() {
-		return getCallAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCallAction__InputParameters() {
-		return getCallAction().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCallAction__OutputParameters() {
-		return getCallAction().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSendSignalAction() {
-		if (sendSignalActionEClass == null) {
-			sendSignalActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(171);
-		}
-		return sendSignalActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSendSignalAction_Target() {
-		return (EReference) getSendSignalAction().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSendSignalAction_Signal() {
-		return (EReference) getSendSignalAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getSendSignalAction__ValidateNumberOrder__DiagnosticChain_Map() {
-		return getSendSignalAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getSendSignalAction__ValidateTypeTargetPin__DiagnosticChain_Map() {
-		return getSendSignalAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getSendSignalAction__ValidateTypeOrderingMultiplicity__DiagnosticChain_Map() {
-		return getSendSignalAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCallOperationAction() {
-		if (callOperationActionEClass == null) {
-			callOperationActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(139);
-		}
-		return callOperationActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCallOperationAction_Operation() {
-		return (EReference) getCallOperationAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCallOperationAction_Target() {
-		return (EReference) getCallOperationAction().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCallOperationAction__ValidateTypeTargetPin__DiagnosticChain_Map() {
-		return getCallOperationAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCallBehaviorAction() {
-		if (callBehaviorActionEClass == null) {
-			callBehaviorActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(138);
-		}
-		return callBehaviorActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCallBehaviorAction_Behavior() {
-		return (EReference) getCallBehaviorAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCallBehaviorAction__ValidateNoOnport__DiagnosticChain_Map() {
-		return getCallBehaviorAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInformationItem() {
-		if (informationItemEClass == null) {
-			informationItemEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(222);
-		}
-		return informationItemEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInformationItem_Represented() {
-		return (EReference) getInformationItem().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInformationItem__ValidateSourcesAndTargets__DiagnosticChain_Map() {
-		return getInformationItem().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInformationItem__ValidateHasNo__DiagnosticChain_Map() {
-		return getInformationItem().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInformationItem__ValidateNotInstantiable__DiagnosticChain_Map() {
-		return getInformationItem().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInformationFlow() {
-		if (informationFlowEClass == null) {
-			informationFlowEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(207);
-		}
-		return informationFlowEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInformationFlow_Realization() {
-		return (EReference) getInformationFlow().getEStructuralFeatures()
-			.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInformationFlow_Conveyed() {
-		return (EReference) getInformationFlow().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInformationFlow_InformationSource() {
-		return (EReference) getInformationFlow().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInformationFlow_InformationTarget() {
-		return (EReference) getInformationFlow().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInformationFlow_RealizingActivityEdge() {
-		return (EReference) getInformationFlow().getEStructuralFeatures()
-			.get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInformationFlow_RealizingConnector() {
-		return (EReference) getInformationFlow().getEStructuralFeatures()
-			.get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getInformationFlow_RealizingMessage() {
-		return (EReference) getInformationFlow().getEStructuralFeatures()
-			.get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInformationFlow__ValidateSourcesAndTargetsKind__DiagnosticChain_Map() {
-		return getInformationFlow().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInformationFlow__ValidateMustConform__DiagnosticChain_Map() {
-		return getInformationFlow().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInformationFlow__ValidateConveyClassifiers__DiagnosticChain_Map() {
-		return getInformationFlow().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getModel() {
-		if (modelEClass == null) {
-			modelEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(84);
-		}
-		return modelEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getModel_Viewpoint() {
-		return (EAttribute) getModel().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getModel__IsMetamodel() {
-		return getModel().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getVariableAction() {
-		if (variableActionEClass == null) {
-			variableActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(121);
-		}
-		return variableActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getVariableAction_Variable() {
-		return (EReference) getVariableAction().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getVariableAction__ValidateScopeOfVariable__DiagnosticChain_Map() {
-		return getVariableAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReadVariableAction() {
-		if (readVariableActionEClass == null) {
-			readVariableActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(164);
-		}
-		return readVariableActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReadVariableAction_Result() {
-		return (EReference) getReadVariableAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadVariableAction__ValidateTypeAndOrdering__DiagnosticChain_Map() {
-		return getReadVariableAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadVariableAction__ValidateCompatibleMultiplicity__DiagnosticChain_Map() {
-		return getReadVariableAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWriteVariableAction() {
-		if (writeVariableActionEClass == null) {
-			writeVariableActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(128);
-		}
-		return writeVariableActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWriteVariableAction_Value() {
-		return (EReference) getWriteVariableAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getWriteVariableAction__ValidateValueType__DiagnosticChain_Map() {
-		return getWriteVariableAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getWriteVariableAction__ValidateMultiplicity__DiagnosticChain_Map() {
-		return getWriteVariableAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getClearVariableAction() {
-		if (clearVariableActionEClass == null) {
-			clearVariableActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(143);
-		}
-		return clearVariableActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAddVariableValueAction() {
-		if (addVariableValueActionEClass == null) {
-			addVariableValueActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(134);
-		}
-		return addVariableValueActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAddVariableValueAction_IsReplaceAll() {
-		return (EAttribute) getAddVariableValueAction().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAddVariableValueAction__ValidateRequiredValue__DiagnosticChain_Map() {
-		return getAddVariableValueAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAddVariableValueAction__ValidateInsertAtPin__DiagnosticChain_Map() {
-		return getAddVariableValueAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAddVariableValueAction_InsertAt() {
-		return (EReference) getAddVariableValueAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRemoveVariableValueAction() {
-		if (removeVariableValueActionEClass == null) {
-			removeVariableValueActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(168);
-		}
-		return removeVariableValueActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRemoveVariableValueAction_IsRemoveDuplicates() {
-		return (EAttribute) getRemoveVariableValueAction()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRemoveVariableValueAction_RemoveAt() {
-		return (EReference) getRemoveVariableValueAction()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getRemoveVariableValueAction__ValidateRemoveAtAndValue__DiagnosticChain_Map() {
-		return getRemoveVariableValueAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRaiseExceptionAction() {
-		if (raiseExceptionActionEClass == null) {
-			raiseExceptionActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(156);
-		}
-		return raiseExceptionActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRaiseExceptionAction_Exception() {
-		return (EReference) getRaiseExceptionAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActionInputPin() {
-		if (actionInputPinEClass == null) {
-			actionInputPinEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(132);
-		}
-		return actionInputPinEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActionInputPin_FromAction() {
-		return (EReference) getActionInputPin().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActionInputPin__ValidateOneOutputPin__DiagnosticChain_Map() {
-		return getActionInputPin().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActionInputPin__ValidateNoControlOrObjectFlow__DiagnosticChain_Map() {
-		return getActionInputPin().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActionInputPin__ValidateInputPin__DiagnosticChain_Map() {
-		return getActionInputPin().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReadExtentAction() {
-		if (readExtentActionEClass == null) {
-			readExtentActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(157);
-		}
-		return readExtentActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReadExtentAction_Result() {
-		return (EReference) getReadExtentAction().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReadExtentAction_Classifier() {
-		return (EReference) getReadExtentAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadExtentAction__ValidateTypeIsClassifier__DiagnosticChain_Map() {
-		return getReadExtentAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadExtentAction__ValidateMultiplicityOfResult__DiagnosticChain_Map() {
-		return getReadExtentAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReclassifyObjectAction() {
-		if (reclassifyObjectActionEClass == null) {
-			reclassifyObjectActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(165);
-		}
-		return reclassifyObjectActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReclassifyObjectAction_IsReplaceAll() {
-		return (EAttribute) getReclassifyObjectAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReclassifyObjectAction_OldClassifier() {
-		return (EReference) getReclassifyObjectAction().getEStructuralFeatures()
-			.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReclassifyObjectAction_NewClassifier() {
-		return (EReference) getReclassifyObjectAction().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReclassifyObjectAction_Object() {
-		return (EReference) getReclassifyObjectAction().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReclassifyObjectAction__ValidateClassifierNotAbstract__DiagnosticChain_Map() {
-		return getReclassifyObjectAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReclassifyObjectAction__ValidateMultiplicity__DiagnosticChain_Map() {
-		return getReclassifyObjectAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReclassifyObjectAction__ValidateInputPin__DiagnosticChain_Map() {
-		return getReclassifyObjectAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReadIsClassifiedObjectAction() {
-		if (readIsClassifiedObjectActionEClass == null) {
-			readIsClassifiedObjectActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(158);
-		}
-		return readIsClassifiedObjectActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReadIsClassifiedObjectAction_IsDirect() {
-		return (EAttribute) getReadIsClassifiedObjectAction()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReadIsClassifiedObjectAction_Classifier() {
-		return (EReference) getReadIsClassifiedObjectAction()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReadIsClassifiedObjectAction_Result() {
-		return (EReference) getReadIsClassifiedObjectAction()
-			.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReadIsClassifiedObjectAction_Object() {
-		return (EReference) getReadIsClassifiedObjectAction()
-			.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadIsClassifiedObjectAction__ValidateMultiplicityOfInput__DiagnosticChain_Map() {
-		return getReadIsClassifiedObjectAction().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadIsClassifiedObjectAction__ValidateNoType__DiagnosticChain_Map() {
-		return getReadIsClassifiedObjectAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadIsClassifiedObjectAction__ValidateMultiplicityOfOutput__DiagnosticChain_Map() {
-		return getReadIsClassifiedObjectAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadIsClassifiedObjectAction__ValidateBooleanResult__DiagnosticChain_Map() {
-		return getReadIsClassifiedObjectAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getStartClassifierBehaviorAction() {
-		if (startClassifierBehaviorActionEClass == null) {
-			startClassifierBehaviorActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(173);
-		}
-		return startClassifierBehaviorActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStartClassifierBehaviorAction_Object() {
-		return (EReference) getStartClassifierBehaviorAction()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStartClassifierBehaviorAction__ValidateMultiplicity__DiagnosticChain_Map() {
-		return getStartClassifierBehaviorAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStartClassifierBehaviorAction__ValidateTypeHasClassifier__DiagnosticChain_Map() {
-		return getStartClassifierBehaviorAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReadLinkObjectEndAction() {
-		if (readLinkObjectEndActionEClass == null) {
-			readLinkObjectEndActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(160);
-		}
-		return readLinkObjectEndActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReadLinkObjectEndAction_Object() {
-		return (EReference) getReadLinkObjectEndAction()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReadLinkObjectEndAction_End() {
-		return (EReference) getReadLinkObjectEndAction()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReadLinkObjectEndAction_Result() {
-		return (EReference) getReadLinkObjectEndAction()
-			.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkObjectEndAction__ValidateProperty__DiagnosticChain_Map() {
-		return getReadLinkObjectEndAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkObjectEndAction__ValidateAssociationOfAssociation__DiagnosticChain_Map() {
-		return getReadLinkObjectEndAction().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkObjectEndAction__ValidateEndsOfAssociation__DiagnosticChain_Map() {
-		return getReadLinkObjectEndAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkObjectEndAction__ValidateTypeOfObject__DiagnosticChain_Map() {
-		return getReadLinkObjectEndAction().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkObjectEndAction__ValidateMultiplicityOfObject__DiagnosticChain_Map() {
-		return getReadLinkObjectEndAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkObjectEndAction__ValidateTypeOfResult__DiagnosticChain_Map() {
-		return getReadLinkObjectEndAction().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkObjectEndAction__ValidateMultiplicityOfResult__DiagnosticChain_Map() {
-		return getReadLinkObjectEndAction().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReadLinkObjectEndQualifierAction() {
-		if (readLinkObjectEndQualifierActionEClass == null) {
-			readLinkObjectEndQualifierActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(161);
-		}
-		return readLinkObjectEndQualifierActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReadLinkObjectEndQualifierAction_Object() {
-		return (EReference) getReadLinkObjectEndQualifierAction()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReadLinkObjectEndQualifierAction_Result() {
-		return (EReference) getReadLinkObjectEndQualifierAction()
-			.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReadLinkObjectEndQualifierAction_Qualifier() {
-		return (EReference) getReadLinkObjectEndQualifierAction()
-			.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkObjectEndQualifierAction__ValidateQualifierAttribute__DiagnosticChain_Map() {
-		return getReadLinkObjectEndQualifierAction().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkObjectEndQualifierAction__ValidateAssociationOfAssociation__DiagnosticChain_Map() {
-		return getReadLinkObjectEndQualifierAction().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkObjectEndQualifierAction__ValidateEndsOfAssociation__DiagnosticChain_Map() {
-		return getReadLinkObjectEndQualifierAction().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkObjectEndQualifierAction__ValidateTypeOfObject__DiagnosticChain_Map() {
-		return getReadLinkObjectEndQualifierAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkObjectEndQualifierAction__ValidateMultiplicityOfQualifier__DiagnosticChain_Map() {
-		return getReadLinkObjectEndQualifierAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkObjectEndQualifierAction__ValidateMultiplicityOfObject__DiagnosticChain_Map() {
-		return getReadLinkObjectEndQualifierAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkObjectEndQualifierAction__ValidateSameType__DiagnosticChain_Map() {
-		return getReadLinkObjectEndQualifierAction().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReadLinkObjectEndQualifierAction__ValidateMultiplicityOfResult__DiagnosticChain_Map() {
-		return getReadLinkObjectEndQualifierAction().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCreateLinkObjectAction() {
-		if (createLinkObjectActionEClass == null) {
-			createLinkObjectActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(147);
-		}
-		return createLinkObjectActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCreateLinkObjectAction_Result() {
-		return (EReference) getCreateLinkObjectAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCreateLinkObjectAction__ValidateAssociationClass__DiagnosticChain_Map() {
-		return getCreateLinkObjectAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCreateLinkObjectAction__ValidateTypeOfResult__DiagnosticChain_Map() {
-		return getCreateLinkObjectAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getCreateLinkObjectAction__ValidateMultiplicity__DiagnosticChain_Map() {
-		return getCreateLinkObjectAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAcceptEventAction() {
-		if (acceptEventActionEClass == null) {
-			acceptEventActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(131);
-		}
-		return acceptEventActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAcceptEventAction_IsUnmarshall() {
-		return (EAttribute) getAcceptEventAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAcceptEventAction_Result() {
-		return (EReference) getAcceptEventAction().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAcceptEventAction_Trigger() {
-		return (EReference) getAcceptEventAction().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAcceptEventAction__ValidateOneOutputPin__DiagnosticChain_Map() {
-		return getAcceptEventAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAcceptEventAction__ValidateNoInputPins__DiagnosticChain_Map() {
-		return getAcceptEventAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAcceptEventAction__ValidateNoOutputPins__DiagnosticChain_Map() {
-		return getAcceptEventAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAcceptEventAction__ValidateUnmarshallSignalEvents__DiagnosticChain_Map() {
-		return getAcceptEventAction().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAcceptEventAction__ValidateConformingType__DiagnosticChain_Map() {
-		return getAcceptEventAction().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAcceptCallAction() {
-		if (acceptCallActionEClass == null) {
-			acceptCallActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(130);
-		}
-		return acceptCallActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAcceptCallAction_ReturnInformation() {
-		return (EReference) getAcceptCallAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAcceptCallAction__ValidateResultPins__DiagnosticChain_Map() {
-		return getAcceptCallAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAcceptCallAction__ValidateTriggerCallEvent__DiagnosticChain_Map() {
-		return getAcceptCallAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAcceptCallAction__ValidateUnmarshall__DiagnosticChain_Map() {
-		return getAcceptCallAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReplyAction() {
-		if (replyActionEClass == null) {
-			replyActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(169);
-		}
-		return replyActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReplyAction_ReplyToCall() {
-		return (EReference) getReplyAction().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReplyAction_ReturnInformation() {
-		return (EReference) getReplyAction().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReplyAction_ReplyValue() {
-		return (EReference) getReplyAction().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReplyAction__ValidatePinsMatchParameter__DiagnosticChain_Map() {
-		return getReplyAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReplyAction__ValidateEventOnReplyToCallTrigger__DiagnosticChain_Map() {
-		return getReplyAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getUnmarshallAction() {
-		if (unmarshallActionEClass == null) {
-			unmarshallActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(176);
-		}
-		return unmarshallActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getUnmarshallAction_Result() {
-		return (EReference) getUnmarshallAction().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getUnmarshallAction_UnmarshallType() {
-		return (EReference) getUnmarshallAction().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getUnmarshallAction_Object() {
-		return (EReference) getUnmarshallAction().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getUnmarshallAction__ValidateMultiplicityOfObject__DiagnosticChain_Map() {
-		return getUnmarshallAction().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getUnmarshallAction__ValidateObjectType__DiagnosticChain_Map() {
-		return getUnmarshallAction().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getUnmarshallAction__ValidateNumberOfResult__DiagnosticChain_Map() {
-		return getUnmarshallAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getUnmarshallAction__ValidateTypeOrderingAndMultiplicity__DiagnosticChain_Map() {
-		return getUnmarshallAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getUnmarshallAction__ValidateStructuralFeature__DiagnosticChain_Map() {
-		return getUnmarshallAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReduceAction() {
-		if (reduceActionEClass == null) {
-			reduceActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(166);
-		}
-		return reduceActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReduceAction_Reducer() {
-		return (EReference) getReduceAction().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReduceAction_Result() {
-		return (EReference) getReduceAction().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReduceAction_Collection() {
-		return (EReference) getReduceAction().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReduceAction_IsOrdered() {
-		return (EAttribute) getReduceAction().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReduceAction__ValidateInputTypeIsCollection__DiagnosticChain_Map() {
-		return getReduceAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReduceAction__ValidateOutputTypesAreCompatible__DiagnosticChain_Map() {
-		return getReduceAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getReduceAction__ValidateReducerInputsOutput__DiagnosticChain_Map() {
-		return getReduceAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getStartObjectBehaviorAction() {
-		if (startObjectBehaviorActionEClass == null) {
-			startObjectBehaviorActionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(174);
-		}
-		return startObjectBehaviorActionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStartObjectBehaviorAction_Object() {
-		return (EReference) getStartObjectBehaviorAction()
-			.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStartObjectBehaviorAction__ValidateTypeOfObject__DiagnosticChain_Map() {
-		return getStartObjectBehaviorAction().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStartObjectBehaviorAction__ValidateNoOnport__DiagnosticChain_Map() {
-		return getStartObjectBehaviorAction().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStartObjectBehaviorAction__Behavior() {
-		return getStartObjectBehaviorAction().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getStartObjectBehaviorAction__ValidateMultiplicityOfObject__DiagnosticChain_Map() {
-		return getStartObjectBehaviorAction().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getControlNode() {
-		if (controlNodeEClass == null) {
-			controlNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(180);
-		}
-		return controlNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getControlFlow() {
-		if (controlFlowEClass == null) {
-			controlFlowEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(183);
-		}
-		return controlFlowEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getControlFlow__ValidateObjectNodes__DiagnosticChain_Map() {
-		return getControlFlow().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getInitialNode() {
-		if (initialNodeEClass == null) {
-			initialNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(189);
-		}
-		return initialNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInitialNode__ValidateNoIncomingEdges__DiagnosticChain_Map() {
-		return getInitialNode().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getInitialNode__ValidateControlEdges__DiagnosticChain_Map() {
-		return getInitialNode().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActivityParameterNode() {
-		if (activityParameterNodeEClass == null) {
-			activityParameterNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(181);
-		}
-		return activityParameterNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivityParameterNode_Parameter() {
-		return (EReference) getActivityParameterNode().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActivityParameterNode__ValidateHasParameters__DiagnosticChain_Map() {
-		return getActivityParameterNode().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActivityParameterNode__ValidateSameType__DiagnosticChain_Map() {
-		return getActivityParameterNode().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActivityParameterNode__ValidateNoEdges__DiagnosticChain_Map() {
-		return getActivityParameterNode().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActivityParameterNode__ValidateNoIncomingEdges__DiagnosticChain_Map() {
-		return getActivityParameterNode().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getActivityParameterNode__ValidateNoOutgoingEdges__DiagnosticChain_Map() {
-		return getActivityParameterNode().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getForkNode() {
-		if (forkNodeEClass == null) {
-			forkNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(188);
-		}
-		return forkNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getForkNode__ValidateOneIncomingEdge__DiagnosticChain_Map() {
-		return getForkNode().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getForkNode__ValidateEdges__DiagnosticChain_Map() {
-		return getForkNode().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFlowFinalNode() {
-		if (flowFinalNodeEClass == null) {
-			flowFinalNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(187);
-		}
-		return flowFinalNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFinalNode() {
-		if (finalNodeEClass == null) {
-			finalNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(179);
-		}
-		return finalNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getFinalNode__ValidateNoOutgoingEdges__DiagnosticChain_Map() {
-		return getFinalNode().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCentralBufferNode() {
-		if (centralBufferNodeEClass == null) {
-			centralBufferNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(182);
-		}
-		return centralBufferNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMergeNode() {
-		if (mergeNodeEClass == null) {
-			mergeNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(191);
-		}
-		return mergeNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMergeNode__ValidateOneOutgoingEdge__DiagnosticChain_Map() {
-		return getMergeNode().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getMergeNode__ValidateEdges__DiagnosticChain_Map() {
-		return getMergeNode().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDecisionNode() {
-		if (decisionNodeEClass == null) {
-			decisionNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(185);
-		}
-		return decisionNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDecisionNode_DecisionInput() {
-		return (EReference) getDecisionNode().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDecisionNode_DecisionInputFlow() {
-		return (EReference) getDecisionNode().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDecisionNode__ValidateIncomingOutgoingEdges__DiagnosticChain_Map() {
-		return getDecisionNode().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDecisionNode__ValidateEdges__DiagnosticChain_Map() {
-		return getDecisionNode().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDecisionNode__ValidateDecisionInputFlowIncoming__DiagnosticChain_Map() {
-		return getDecisionNode().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDecisionNode__ValidateParameters__DiagnosticChain_Map() {
-		return getDecisionNode().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDecisionNode__ValidateZeroInputParameters__DiagnosticChain_Map() {
-		return getDecisionNode().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDecisionNode__ValidateIncomingObjectOneInputParameter__DiagnosticChain_Map() {
-		return getDecisionNode().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDecisionNode__ValidateIncomingControlOneInputParameter__DiagnosticChain_Map() {
-		return getDecisionNode().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getDecisionNode__ValidateTwoInputParameters__DiagnosticChain_Map() {
-		return getDecisionNode().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActivityFinalNode() {
-		if (activityFinalNodeEClass == null) {
-			activityFinalNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(178);
-		}
-		return activityFinalNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getJoinNode() {
-		if (joinNodeEClass == null) {
-			joinNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(190);
-		}
-		return joinNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJoinNode_IsCombineDuplicate() {
-		return (EAttribute) getJoinNode().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getJoinNode_JoinSpec() {
-		return (EReference) getJoinNode().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getJoinNode__ValidateOneOutgoingEdge__DiagnosticChain_Map() {
-		return getJoinNode().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getJoinNode__ValidateIncomingObjectFlow__DiagnosticChain_Map() {
-		return getJoinNode().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDataStoreNode() {
-		if (dataStoreNodeEClass == null) {
-			dataStoreNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(184);
-		}
-		return dataStoreNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getObjectFlow() {
-		if (objectFlowEClass == null) {
-			objectFlowEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(186);
-		}
-		return objectFlowEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getObjectFlow_IsMulticast() {
-		return (EAttribute) getObjectFlow().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getObjectFlow_IsMultireceive() {
-		return (EAttribute) getObjectFlow().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getObjectFlow_Transformation() {
-		return (EReference) getObjectFlow().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getObjectFlow_Selection() {
-		return (EReference) getObjectFlow().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getObjectFlow__ValidateCompatibleTypes__DiagnosticChain_Map() {
-		return getObjectFlow().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getObjectFlow__ValidateSameUpperBounds__DiagnosticChain_Map() {
-		return getObjectFlow().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getObjectFlow__ValidateTarget__DiagnosticChain_Map() {
-		return getObjectFlow().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getObjectFlow__ValidateInputAndOutputParameter__DiagnosticChain_Map() {
-		return getObjectFlow().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getObjectFlow__ValidateNoExecutableNodes__DiagnosticChain_Map() {
-		return getObjectFlow().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getObjectFlow__ValidateTransformationBehavior__DiagnosticChain_Map() {
-		return getObjectFlow().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getObjectFlow__ValidateSelectionBehavior__DiagnosticChain_Map() {
-		return getObjectFlow().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getObjectFlow__ValidateIsMulticastOrIsMultireceive__DiagnosticChain_Map() {
-		return getObjectFlow().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSequenceNode() {
-		if (sequenceNodeEClass == null) {
-			sequenceNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(172);
-		}
-		return sequenceNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSequenceNode_ExecutableNode() {
-		return (EReference) getSequenceNode().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConditionalNode() {
-		if (conditionalNodeEClass == null) {
-			conditionalNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(144);
-		}
-		return conditionalNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConditionalNode_IsDeterminate() {
-		return (EAttribute) getConditionalNode().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConditionalNode_IsAssured() {
-		return (EAttribute) getConditionalNode().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConditionalNode_Clause() {
-		return (EReference) getConditionalNode().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConditionalNode_Result() {
-		return (EReference) getConditionalNode().getEStructuralFeatures()
-			.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConditionalNode__ValidateResultNoIncoming__DiagnosticChain_Map() {
-		return getConditionalNode().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConditionalNode__ValidateNoInputPins__DiagnosticChain_Map() {
-		return getConditionalNode().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConditionalNode__ValidateOneClauseWithExecutableNode__DiagnosticChain_Map() {
-		return getConditionalNode().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConditionalNode__ValidateMatchingOutputPins__DiagnosticChain_Map() {
-		return getConditionalNode().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConditionalNode__ValidateExecutableNodes__DiagnosticChain_Map() {
-		return getConditionalNode().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getConditionalNode__ValidateClauseNoPredecessor__DiagnosticChain_Map() {
-		return getConditionalNode().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getClause() {
-		if (clauseEClass == null) {
-			clauseEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(140);
-		}
-		return clauseEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClause_Test() {
-		return (EReference) getClause().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClause_Body() {
-		return (EReference) getClause().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClause_PredecessorClause() {
-		return (EReference) getClause().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClause_SuccessorClause() {
-		return (EReference) getClause().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClause_Decider() {
-		return (EReference) getClause().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClause_BodyOutput() {
-		return (EReference) getClause().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClause__ValidateDeciderOutput__DiagnosticChain_Map() {
-		return getClause().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClause__ValidateTestAndBody__DiagnosticChain_Map() {
-		return getClause().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getClause__ValidateBodyOutputPins__DiagnosticChain_Map() {
-		return getClause().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLoopNode() {
-		if (loopNodeEClass == null) {
-			loopNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(154);
-		}
-		return loopNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLoopNode_IsTestedFirst() {
-		return (EAttribute) getLoopNode().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLoopNode_BodyPart() {
-		return (EReference) getLoopNode().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLoopNode_SetupPart() {
-		return (EReference) getLoopNode().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLoopNode_Decider() {
-		return (EReference) getLoopNode().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLoopNode_Test() {
-		return (EReference) getLoopNode().getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLoopNode_Result() {
-		return (EReference) getLoopNode().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLoopNode_LoopVariable() {
-		return (EReference) getLoopNode().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLoopNode_BodyOutput() {
-		return (EReference) getLoopNode().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLoopNode_LoopVariableInput() {
-		return (EReference) getLoopNode().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLoopNode__ValidateInputEdges__DiagnosticChain_Map() {
-		return getLoopNode().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLoopNode__ValidateExecutableNodes__DiagnosticChain_Map() {
-		return getLoopNode().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLoopNode__ValidateBodyOutputPins__DiagnosticChain_Map() {
-		return getLoopNode().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLoopNode__ValidateSetupTestAndBody__DiagnosticChain_Map() {
-		return getLoopNode().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLoopNode__ValidateMatchingOutputPins__DiagnosticChain_Map() {
-		return getLoopNode().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLoopNode__ValidateMatchingLoopVariables__DiagnosticChain_Map() {
-		return getLoopNode().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLoopNode__ValidateMatchingResultPins__DiagnosticChain_Map() {
-		return getLoopNode().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLoopNode__ValidateLoopVariableOutgoing__DiagnosticChain_Map() {
-		return getLoopNode().getEOperations().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getLoopNode__ValidateResultNoIncoming__DiagnosticChain_Map() {
-		return getLoopNode().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExpansionNode() {
-		if (expansionNodeEClass == null) {
-			expansionNodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(152);
-		}
-		return expansionNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExpansionNode_RegionAsOutput() {
-		return (EReference) getExpansionNode().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getExpansionNode__ValidateRegionAsInputOrOutput__DiagnosticChain_Map() {
-		return getExpansionNode().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExpansionNode_RegionAsInput() {
-		return (EReference) getExpansionNode().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExpansionRegion() {
-		if (expansionRegionEClass == null) {
-			expansionRegionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(153);
-		}
-		return expansionRegionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExpansionRegion_Mode() {
-		return (EAttribute) getExpansionRegion().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExpansionRegion_InputElement() {
-		return (EReference) getExpansionRegion().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExpansionRegion_OutputElement() {
-		return (EReference) getExpansionRegion().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getComponentRealization() {
-		if (componentRealizationEClass == null) {
-			componentRealizationEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(238);
-		}
-		return componentRealizationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentRealization_Abstraction() {
-		return (EReference) getComponentRealization().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentRealization_RealizingClassifier() {
-		return (EReference) getComponentRealization().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getComponent() {
-		if (componentEClass == null) {
-			componentEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(237);
-		}
-		return componentEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponent_IsIndirectlyInstantiated() {
-		return (EAttribute) getComponent().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponent_Required() {
-		return (EReference) getComponent().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getComponent__ValidateNoNestedClassifiers__DiagnosticChain_Map() {
-		return getComponent().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getComponent__ValidateNoPackagedElements__DiagnosticChain_Map() {
-		return getComponent().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponent_Provided() {
-		return (EReference) getComponent().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponent_PackagedElement() {
-		return (EReference) getComponent().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponent_Realization() {
-		return (EReference) getComponent().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getComponent__CreateOwnedClass__String_boolean() {
-		return getComponent().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getComponent__CreateOwnedEnumeration__String() {
-		return getComponent().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getComponent__CreateOwnedPrimitiveType__String() {
-		return getComponent().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getComponent__GetProvideds() {
-		return getComponent().getEOperations().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getComponent__CreateOwnedInterface__String() {
-		return getComponent().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getComponent__GetRequireds() {
-		return getComponent().getEOperations().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNode() {
-		if (nodeEClass == null) {
-			nodeEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(205);
-		}
-		return nodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNode_NestedNode() {
-		return (EReference) getNode().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNode__ValidateInternalStructure__DiagnosticChain_Map() {
-		return getNode().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNode__CreateCommunicationPath__boolean_AggregationKind_String_int_int_Node_boolean_AggregationKind_String_int_int() {
-		return getNode().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getNode__GetCommunicationPaths() {
-		return getNode().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDevice() {
-		if (deviceEClass == null) {
-			deviceEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(204);
-		}
-		return deviceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExecutionEnvironment() {
-		if (executionEnvironmentEClass == null) {
-			executionEnvironmentEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(206);
-		}
-		return executionEnvironmentEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCommunicationPath() {
-		if (communicationPathEClass == null) {
-			communicationPathEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(203);
-		}
-		return communicationPathEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFinalState() {
-		if (finalStateEClass == null) {
-			finalStateEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(234);
-		}
-		return finalStateEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getFinalState__ValidateNoOutgoingTransitions__DiagnosticChain_Map() {
-		return getFinalState().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getFinalState__ValidateNoRegions__DiagnosticChain_Map() {
-		return getFinalState().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getFinalState__ValidateCannotReferenceSubmachine__DiagnosticChain_Map() {
-		return getFinalState().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getFinalState__ValidateNoEntryBehavior__DiagnosticChain_Map() {
-		return getFinalState().getEOperations().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getFinalState__ValidateNoExitBehavior__DiagnosticChain_Map() {
-		return getFinalState().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getFinalState__ValidateNoStateBehavior__DiagnosticChain_Map() {
-		return getFinalState().getEOperations().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTimeEvent() {
-		if (timeEventEClass == null) {
-			timeEventEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(200);
-		}
-		return timeEventEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTimeEvent_IsRelative() {
-		return (EAttribute) getTimeEvent().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTimeEvent_When() {
-		return (EReference) getTimeEvent().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getTimeEvent__ValidateWhenNonNegative__DiagnosticChain_Map() {
-		return getTimeEvent().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProtocolTransition() {
-		if (protocolTransitionEClass == null) {
-			protocolTransitionEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(235);
-		}
-		return protocolTransitionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProtocolTransition_PostCondition() {
-		return (EReference) getProtocolTransition().getEStructuralFeatures()
-			.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProtocolTransition_Referred() {
-		return (EReference) getProtocolTransition().getEStructuralFeatures()
-			.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProtocolTransition_PreCondition() {
-		return (EReference) getProtocolTransition().getEStructuralFeatures()
-			.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProtocolTransition__ValidateBelongsToPsm__DiagnosticChain_Map() {
-		return getProtocolTransition().getEOperations().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProtocolTransition__GetReferreds() {
-		return getProtocolTransition().getEOperations().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProtocolTransition__ValidateAssociatedActions__DiagnosticChain_Map() {
-		return getProtocolTransition().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getProtocolTransition__ValidateRefersToOperation__DiagnosticChain_Map() {
-		return getProtocolTransition().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAssociationClass() {
-		if (associationClassEClass == null) {
-			associationClassEClass = (EClass) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(236);
-		}
-		return associationClassEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAssociationClass__ValidateCannotBeDefined__DiagnosticChain_Map() {
-		return getAssociationClass().getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getAssociationClass__ValidateDisjointAttributesEnds__DiagnosticChain_Map() {
-		return getAssociationClass().getEOperations().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getVisibilityKind() {
-		if (visibilityKindEEnum == null) {
-			visibilityKindEEnum = (EEnum) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(23);
-		}
-		return visibilityKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getCallConcurrencyKind() {
-		if (callConcurrencyKindEEnum == null) {
-			callConcurrencyKindEEnum = (EEnum) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(49);
-		}
-		return callConcurrencyKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getTransitionKind() {
-		if (transitionKindEEnum == null) {
-			transitionKindEEnum = (EEnum) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(67);
-		}
-		return transitionKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getPseudostateKind() {
-		if (pseudostateKindEEnum == null) {
-			pseudostateKindEEnum = (EEnum) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(68);
-		}
-		return pseudostateKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getAggregationKind() {
-		if (aggregationKindEEnum == null) {
-			aggregationKindEEnum = (EEnum) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(72);
-		}
-		return aggregationKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getParameterDirectionKind() {
-		if (parameterDirectionKindEEnum == null) {
-			parameterDirectionKindEEnum = (EEnum) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(43);
-		}
-		return parameterDirectionKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getParameterEffectKind() {
-		if (parameterEffectKindEEnum == null) {
-			parameterEffectKindEEnum = (EEnum) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(44);
-		}
-		return parameterEffectKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getConnectorKind() {
-		if (connectorKindEEnum == null) {
-			connectorKindEEnum = (EEnum) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(92);
-		}
-		return connectorKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getMessageKind() {
-		if (messageKindEEnum == null) {
-			messageKindEEnum = (EEnum) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(220);
-		}
-		return messageKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getMessageSort() {
-		if (messageSortEEnum == null) {
-			messageSortEEnum = (EEnum) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(221);
-		}
-		return messageSortEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getObjectNodeOrderingKind() {
-		if (objectNodeOrderingKindEEnum == null) {
-			objectNodeOrderingKindEEnum = (EEnum) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(115);
-		}
-		return objectNodeOrderingKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getInteractionOperatorKind() {
-		if (interactionOperatorKindEEnum == null) {
-			interactionOperatorKindEEnum = (EEnum) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(227);
-		}
-		return interactionOperatorKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getExpansionKind() {
-		if (expansionKindEEnum == null) {
-			expansionKindEEnum = (EEnum) EPackage.Registry.INSTANCE
-				.getEPackage(UMLPackage.eNS_URI).getEClassifiers().get(129);
-		}
-		return expansionKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UMLFactory getUMLFactory() {
-		return (UMLFactory) getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isLoaded = false;
-
-	/**
-	 * Laods the package and any sub-packages from their serialized form.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void loadPackage() {
-		if (isLoaded)
-			return;
-		isLoaded = true;
-
-		URL url = getClass().getResource(packageFilename);
-		if (url == null) {
-			throw new RuntimeException(
-				"Missing serialized package: " + packageFilename); //$NON-NLS-1$
-		}
-		URI uri = URI.createURI(url.toString());
-		Resource resource = new EcoreResourceFactoryImpl().createResource(uri);
-		try {
-			resource.load(null);
-		} catch (IOException exception) {
-			throw new WrappedException(exception);
-		}
-		initializeFromLoadedEPackage(this,
-			(EPackage) resource.getContents().get(0));
-		createResource(eNS_URI);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isFixed = false;
-
-	/**
-	 * Fixes up the loaded package, to make it appear as if it had been programmatically built.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void fixPackageContents() {
-		if (isFixed)
-			return;
-		isFixed = true;
-		fixEClassifiers();
-	}
-
-	/**
-	 * Sets the instance class on the given classifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected void fixInstanceClass(EClassifier eClassifier) {
-		if (eClassifier.getInstanceClassName() == null) {
-			eClassifier.setInstanceClassName(
-				"org.eclipse.uml2.uml." + eClassifier.getName()); //$NON-NLS-1$
-			setGeneratedClassName(eClassifier);
-		}
-	}
-
-} //UMLPackageImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UnmarshallActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UnmarshallActionImpl.java
index 65f4c57..3561497 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UnmarshallActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UnmarshallActionImpl.java
@@ -1,13 +1,13 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,8 +28,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -109,18 +113,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this,
-						UMLPackage.UNMARSHALL_ACTION__OUTPUT, OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.UNMARSHALL_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.UNMARSHALL_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.UNMARSHALL_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -134,18 +133,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.UNMARSHALL_ACTION__INPUT, INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.UNMARSHALL_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.UNMARSHALL_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.UNMARSHALL_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -155,9 +149,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<OutputPin> getResults() {
-		return (EList<OutputPin>) eDynamicGet(
-			UMLPackage.UNMARSHALL_ACTION__RESULT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.UNMARSHALL_ACTION__RESULT, true, true);
+		return (EList<OutputPin>) eDynamicGet(UMLPackage.UNMARSHALL_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.UNMARSHALL_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -166,8 +158,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		getResults().add(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -192,18 +183,14 @@
 	 */
 	public OutputPin getResult(String name, Type type, boolean ignoreCase,
 			boolean createOnDemand) {
-		resultLoop : for (OutputPin result : getResults()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(result.getName())
-				: name.equals(result.getName())))
+		resultLoop: for (OutputPin result : getResults()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(result.getName()) : name.equals(result.getName())))
 				continue resultLoop;
 			if (type != null && !type.equals(result.getType()))
 				continue resultLoop;
 			return result;
 		}
-		return createOnDemand
-			? createResult(name, type)
-			: null;
+		return createOnDemand ? createResult(name, type) : null;
 	}
 
 	/**
@@ -221,10 +208,7 @@
 	 * @generated
 	 */
 	public Classifier getUnmarshallType() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.UNMARSHALL_ACTION__UNMARSHALL_TYPE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.UNMARSHALL_ACTION__UNMARSHALL_TYPE, true, true);
+		return (Classifier) eDynamicGet(UMLPackage.UNMARSHALL_ACTION__UNMARSHALL_TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.UNMARSHALL_ACTION__UNMARSHALL_TYPE, true, true);
 	}
 
 	/**
@@ -233,11 +217,7 @@
 	 * @generated
 	 */
 	public Classifier basicGetUnmarshallType() {
-		return (Classifier) eDynamicGet(
-			UMLPackage.UNMARSHALL_ACTION__UNMARSHALL_TYPE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.UNMARSHALL_ACTION__UNMARSHALL_TYPE, false,
-			true);
+		return (Classifier) eDynamicGet(UMLPackage.UNMARSHALL_ACTION__UNMARSHALL_TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.UNMARSHALL_ACTION__UNMARSHALL_TYPE, false, true);
 	}
 
 	/**
@@ -246,11 +226,7 @@
 	 * @generated
 	 */
 	public void setUnmarshallType(Classifier newUnmarshallType) {
-		eDynamicSet(
-			UMLPackage.UNMARSHALL_ACTION__UNMARSHALL_TYPE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.UNMARSHALL_ACTION__UNMARSHALL_TYPE,
-			newUnmarshallType);
+		eDynamicSet(UMLPackage.UNMARSHALL_ACTION__UNMARSHALL_TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.UNMARSHALL_ACTION__UNMARSHALL_TYPE, newUnmarshallType);
 	}
 
 	/**
@@ -259,9 +235,7 @@
 	 * @generated
 	 */
 	public InputPin getObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.UNMARSHALL_ACTION__OBJECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.UNMARSHALL_ACTION__OBJECT, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.UNMARSHALL_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.UNMARSHALL_ACTION__OBJECT, true, true);
 	}
 
 	/**
@@ -270,9 +244,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetObject() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.UNMARSHALL_ACTION__OBJECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.UNMARSHALL_ACTION__OBJECT, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.UNMARSHALL_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.UNMARSHALL_ACTION__OBJECT, false, true);
 	}
 
 	/**
@@ -282,8 +254,7 @@
 	 */
 	public NotificationChain basicSetObject(InputPin newObject,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newObject,
-			UMLPackage.UNMARSHALL_ACTION__OBJECT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newObject, UMLPackage.UNMARSHALL_ACTION__OBJECT, msgs);
 		return msgs;
 	}
 
@@ -293,9 +264,7 @@
 	 * @generated
 	 */
 	public void setObject(InputPin newObject) {
-		eDynamicSet(
-			UMLPackage.UNMARSHALL_ACTION__OBJECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.UNMARSHALL_ACTION__OBJECT, newObject);
+		eDynamicSet(UMLPackage.UNMARSHALL_ACTION__OBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.UNMARSHALL_ACTION__OBJECT, newObject);
 	}
 
 	/**
@@ -329,8 +298,7 @@
 	 */
 	public boolean validateMultiplicityOfObject(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return UnmarshallActionOperations.validateMultiplicityOfObject(this,
-			diagnostics, context);
+		return UnmarshallActionOperations.validateMultiplicityOfObject(this, diagnostics, context);
 	}
 
 	/**
@@ -340,8 +308,7 @@
 	 */
 	public boolean validateObjectType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return UnmarshallActionOperations.validateObjectType(this, diagnostics,
-			context);
+		return UnmarshallActionOperations.validateObjectType(this, diagnostics, context);
 	}
 
 	/**
@@ -351,8 +318,7 @@
 	 */
 	public boolean validateNumberOfResult(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return UnmarshallActionOperations.validateNumberOfResult(this,
-			diagnostics, context);
+		return UnmarshallActionOperations.validateNumberOfResult(this, diagnostics, context);
 	}
 
 	/**
@@ -362,8 +328,7 @@
 	 */
 	public boolean validateTypeOrderingAndMultiplicity(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return UnmarshallActionOperations
-			.validateTypeOrderingAndMultiplicity(this, diagnostics, context);
+		return UnmarshallActionOperations.validateTypeOrderingAndMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -373,8 +338,7 @@
 	 */
 	public boolean validateStructuralFeature(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return UnmarshallActionOperations.validateStructuralFeature(this,
-			diagnostics, context);
+		return UnmarshallActionOperations.validateStructuralFeature(this, diagnostics, context);
 	}
 
 	/**
@@ -386,42 +350,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.UNMARSHALL_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.UNMARSHALL_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.UNMARSHALL_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.UNMARSHALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.UNMARSHALL_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.UNMARSHALL_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.UNMARSHALL_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.UNMARSHALL_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.UNMARSHALL_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.UNMARSHALL_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.UNMARSHALL_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.UNMARSHALL_ACTION__OBJECT :
-				return basicSetObject(null, msgs);
-			case UMLPackage.UNMARSHALL_ACTION__RESULT :
-				return ((InternalEList<?>) getResults()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.UNMARSHALL_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.UNMARSHALL_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.UNMARSHALL_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.UNMARSHALL_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.UNMARSHALL_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.UNMARSHALL_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.UNMARSHALL_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.UNMARSHALL_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.UNMARSHALL_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.UNMARSHALL_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.UNMARSHALL_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.UNMARSHALL_ACTION__OBJECT:
+			return basicSetObject(null, msgs);
+		case UMLPackage.UNMARSHALL_ACTION__RESULT:
+			return ((InternalEList<?>) getResults()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -434,84 +388,84 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.UNMARSHALL_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.UNMARSHALL_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.UNMARSHALL_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.UNMARSHALL_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.UNMARSHALL_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.UNMARSHALL_ACTION__NAME :
-				return getName();
-			case UMLPackage.UNMARSHALL_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.UNMARSHALL_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.UNMARSHALL_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.UNMARSHALL_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.UNMARSHALL_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.UNMARSHALL_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.UNMARSHALL_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.UNMARSHALL_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.UNMARSHALL_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.UNMARSHALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.UNMARSHALL_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.UNMARSHALL_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.UNMARSHALL_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.UNMARSHALL_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.UNMARSHALL_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.UNMARSHALL_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.UNMARSHALL_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.UNMARSHALL_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.UNMARSHALL_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.UNMARSHALL_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.UNMARSHALL_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.UNMARSHALL_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.UNMARSHALL_ACTION__OBJECT :
-				if (resolve)
-					return getObject();
-				return basicGetObject();
-			case UMLPackage.UNMARSHALL_ACTION__RESULT :
-				return getResults();
-			case UMLPackage.UNMARSHALL_ACTION__UNMARSHALL_TYPE :
-				if (resolve)
-					return getUnmarshallType();
-				return basicGetUnmarshallType();
+		case UMLPackage.UNMARSHALL_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.UNMARSHALL_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.UNMARSHALL_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.UNMARSHALL_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.UNMARSHALL_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.UNMARSHALL_ACTION__NAME:
+			return getName();
+		case UMLPackage.UNMARSHALL_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.UNMARSHALL_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.UNMARSHALL_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.UNMARSHALL_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.UNMARSHALL_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.UNMARSHALL_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.UNMARSHALL_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.UNMARSHALL_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.UNMARSHALL_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.UNMARSHALL_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.UNMARSHALL_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.UNMARSHALL_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.UNMARSHALL_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.UNMARSHALL_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.UNMARSHALL_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.UNMARSHALL_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.UNMARSHALL_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.UNMARSHALL_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.UNMARSHALL_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.UNMARSHALL_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.UNMARSHALL_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.UNMARSHALL_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.UNMARSHALL_ACTION__OBJECT:
+			if (resolve)
+				return getObject();
+			return basicGetObject();
+		case UMLPackage.UNMARSHALL_ACTION__RESULT:
+			return getResults();
+		case UMLPackage.UNMARSHALL_ACTION__UNMARSHALL_TYPE:
+			if (resolve)
+				return getUnmarshallType();
+			return basicGetUnmarshallType();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -525,87 +479,77 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.UNMARSHALL_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__OBJECT :
-				setObject((InputPin) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__RESULT :
-				getResults().clear();
-				getResults().addAll((Collection<? extends OutputPin>) newValue);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__UNMARSHALL_TYPE :
-				setUnmarshallType((Classifier) newValue);
-				return;
+		case UMLPackage.UNMARSHALL_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__OBJECT:
+			setObject((InputPin) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__RESULT:
+			getResults().clear();
+			getResults().addAll((Collection<? extends OutputPin>) newValue);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__UNMARSHALL_TYPE:
+			setUnmarshallType((Classifier) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -618,66 +562,66 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.UNMARSHALL_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__OBJECT :
-				setObject((InputPin) null);
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__RESULT :
-				getResults().clear();
-				return;
-			case UMLPackage.UNMARSHALL_ACTION__UNMARSHALL_TYPE :
-				setUnmarshallType((Classifier) null);
-				return;
+		case UMLPackage.UNMARSHALL_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__OBJECT:
+			setObject((InputPin) null);
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__RESULT:
+			getResults().clear();
+			return;
+		case UMLPackage.UNMARSHALL_ACTION__UNMARSHALL_TYPE:
+			setUnmarshallType((Classifier) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -690,70 +634,68 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.UNMARSHALL_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.UNMARSHALL_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.UNMARSHALL_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.UNMARSHALL_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.UNMARSHALL_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.UNMARSHALL_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.UNMARSHALL_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.UNMARSHALL_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.UNMARSHALL_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.UNMARSHALL_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.UNMARSHALL_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.UNMARSHALL_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.UNMARSHALL_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.UNMARSHALL_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.UNMARSHALL_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.UNMARSHALL_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.UNMARSHALL_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.UNMARSHALL_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.UNMARSHALL_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.UNMARSHALL_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.UNMARSHALL_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.UNMARSHALL_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.UNMARSHALL_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.UNMARSHALL_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.UNMARSHALL_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.UNMARSHALL_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.UNMARSHALL_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.UNMARSHALL_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.UNMARSHALL_ACTION__OBJECT :
-				return basicGetObject() != null;
-			case UMLPackage.UNMARSHALL_ACTION__RESULT :
-				return !getResults().isEmpty();
-			case UMLPackage.UNMARSHALL_ACTION__UNMARSHALL_TYPE :
-				return basicGetUnmarshallType() != null;
+		case UMLPackage.UNMARSHALL_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.UNMARSHALL_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.UNMARSHALL_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.UNMARSHALL_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.UNMARSHALL_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.UNMARSHALL_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.UNMARSHALL_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.UNMARSHALL_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.UNMARSHALL_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.UNMARSHALL_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.UNMARSHALL_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.UNMARSHALL_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.UNMARSHALL_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.UNMARSHALL_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.UNMARSHALL_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.UNMARSHALL_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.UNMARSHALL_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.UNMARSHALL_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.UNMARSHALL_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.UNMARSHALL_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.UNMARSHALL_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.UNMARSHALL_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.UNMARSHALL_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.UNMARSHALL_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.UNMARSHALL_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.UNMARSHALL_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.UNMARSHALL_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.UNMARSHALL_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.UNMARSHALL_ACTION__OBJECT:
+			return basicGetObject() != null;
+		case UMLPackage.UNMARSHALL_ACTION__RESULT:
+			return !getResults().isEmpty();
+		case UMLPackage.UNMARSHALL_ACTION__UNMARSHALL_TYPE:
+			return basicGetUnmarshallType() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -768,171 +710,140 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.UNMARSHALL_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.UNMARSHALL_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.UNMARSHALL_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.UNMARSHALL_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.UNMARSHALL_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.UNMARSHALL_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.UNMARSHALL_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.UNMARSHALL_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.UNMARSHALL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.UNMARSHALL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.UNMARSHALL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.UNMARSHALL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.UNMARSHALL_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.UNMARSHALL_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.UNMARSHALL_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.UNMARSHALL_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.UNMARSHALL_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.UNMARSHALL_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.UNMARSHALL_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.UNMARSHALL_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.UNMARSHALL_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.UNMARSHALL_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.UNMARSHALL_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.UNMARSHALL_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.UNMARSHALL_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.UNMARSHALL_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.UNMARSHALL_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.UNMARSHALL_ACTION___VALIDATE_STRUCTURAL_FEATURE__DIAGNOSTICCHAIN_MAP :
-				return validateStructuralFeature(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___VALIDATE_NUMBER_OF_RESULT__DIAGNOSTICCHAIN_MAP :
-				return validateNumberOfResult(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___VALIDATE_TYPE_ORDERING_AND_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOrderingAndMultiplicity(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___VALIDATE_MULTIPLICITY_OF_OBJECT__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfObject(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.UNMARSHALL_ACTION___VALIDATE_OBJECT_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateObjectType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.UNMARSHALL_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.UNMARSHALL_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.UNMARSHALL_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.UNMARSHALL_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.UNMARSHALL_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.UNMARSHALL_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.UNMARSHALL_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.UNMARSHALL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.UNMARSHALL_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.UNMARSHALL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.UNMARSHALL_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.UNMARSHALL_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.UNMARSHALL_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.UNMARSHALL_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.UNMARSHALL_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.UNMARSHALL_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.UNMARSHALL_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.UNMARSHALL_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.UNMARSHALL_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.UNMARSHALL_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.UNMARSHALL_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.UNMARSHALL_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.UNMARSHALL_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.UNMARSHALL_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.UNMARSHALL_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.UNMARSHALL_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.UNMARSHALL_ACTION___VALIDATE_STRUCTURAL_FEATURE__DIAGNOSTICCHAIN_MAP:
+			return validateStructuralFeature((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___VALIDATE_NUMBER_OF_RESULT__DIAGNOSTICCHAIN_MAP:
+			return validateNumberOfResult((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___VALIDATE_TYPE_ORDERING_AND_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOrderingAndMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___VALIDATE_MULTIPLICITY_OF_OBJECT__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfObject((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.UNMARSHALL_ACTION___VALIDATE_OBJECT_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateObjectType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -945,7 +856,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.UNMARSHALL_ACTION__RESULT);
+				|| eIsSet(UMLPackage.UNMARSHALL_ACTION__RESULT);
 	}
 
 	/**
@@ -956,8 +867,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.UNMARSHALL_ACTION__OBJECT};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.UNMARSHALL_ACTION__OBJECT };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getOutputs() <em>Output</em>}' reference list.
@@ -967,8 +877,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.UNMARSHALL_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.UNMARSHALL_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -978,7 +887,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.UNMARSHALL_ACTION__OBJECT);
+				|| eIsSet(UMLPackage.UNMARSHALL_ACTION__OBJECT);
 	}
 
 } //UnmarshallActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UsageImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UsageImpl.java
index 237e5d8..b495c6d 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UsageImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UsageImpl.java
@@ -1,13 +1,14 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (CEA) - 451350
+ *   Kenn Hussey - 535301
  *
  */
 package org.eclipse.uml2.uml.cdo.internal.impl;
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UseCaseImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UseCaseImpl.java
index 14f2fcb..9ddb36b 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UseCaseImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/UseCaseImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -29,6 +29,8 @@
 
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -117,20 +119,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<NamedElement> ownedMembers = (EList<NamedElement>) cache.get(
-				eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER);
+			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<NamedElement>(
-						NamedElement.class, this,
-						UMLPackage.USE_CASE__OWNED_MEMBER,
-						OWNED_MEMBER_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.NAMESPACE__OWNED_MEMBER, ownedMembers = new DerivedUnionEObjectEList<NamedElement>(NamedElement.class, this, UMLPackage.USE_CASE__OWNED_MEMBER, OWNED_MEMBER_ESUBSETS));
 			}
 			return ownedMembers;
 		}
-		return new DerivedUnionEObjectEList<NamedElement>(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);
 	}
 
 	/**
@@ -140,9 +135,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Include> getIncludes() {
-		return (EList<Include>) eDynamicGet(
-			UMLPackage.USE_CASE__INCLUDE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.USE_CASE__INCLUDE, true, true);
+		return (EList<Include>) eDynamicGet(UMLPackage.USE_CASE__INCLUDE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.USE_CASE__INCLUDE, true, true);
 	}
 
 	/**
@@ -176,18 +169,14 @@
 	 */
 	public Include getInclude(String name, UseCase addition, boolean ignoreCase,
 			boolean createOnDemand) {
-		includeLoop : for (Include include : getIncludes()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(include.getName())
-				: name.equals(include.getName())))
+		includeLoop: for (Include include : getIncludes()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(include.getName()) : name.equals(include.getName())))
 				continue includeLoop;
 			if (addition != null && !addition.equals(include.getAddition()))
 				continue includeLoop;
 			return include;
 		}
-		return createOnDemand
-			? createInclude(name, addition)
-			: null;
+		return createOnDemand ? createInclude(name, addition) : null;
 	}
 
 	/**
@@ -197,9 +186,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Extend> getExtends() {
-		return (EList<Extend>) eDynamicGet(
-			UMLPackage.USE_CASE__EXTEND - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.USE_CASE__EXTEND, true, true);
+		return (EList<Extend>) eDynamicGet(UMLPackage.USE_CASE__EXTEND - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.USE_CASE__EXTEND, true, true);
 	}
 
 	/**
@@ -233,19 +220,14 @@
 	 */
 	public Extend getExtend(String name, UseCase extendedCase,
 			boolean ignoreCase, boolean createOnDemand) {
-		extendLoop : for (Extend extend : getExtends()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(extend.getName())
-				: name.equals(extend.getName())))
+		extendLoop: for (Extend extend : getExtends()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(extend.getName()) : name.equals(extend.getName())))
 				continue extendLoop;
-			if (extendedCase != null
-				&& !extendedCase.equals(extend.getExtendedCase()))
+			if (extendedCase != null && !extendedCase.equals(extend.getExtendedCase()))
 				continue extendLoop;
 			return extend;
 		}
-		return createOnDemand
-			? createExtend(name, extendedCase)
-			: null;
+		return createOnDemand ? createExtend(name, extendedCase) : null;
 	}
 
 	/**
@@ -255,9 +237,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<ExtensionPoint> getExtensionPoints() {
-		return (EList<ExtensionPoint>) eDynamicGet(
-			UMLPackage.USE_CASE__EXTENSION_POINT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.USE_CASE__EXTENSION_POINT, true, true);
+		return (EList<ExtensionPoint>) eDynamicGet(UMLPackage.USE_CASE__EXTENSION_POINT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.USE_CASE__EXTENSION_POINT, true, true);
 	}
 
 	/**
@@ -266,8 +246,7 @@
 	 * @generated
 	 */
 	public ExtensionPoint createExtensionPoint(String name) {
-		ExtensionPoint newExtensionPoint = (ExtensionPoint) create(
-			UMLPackage.Literals.EXTENSION_POINT);
+		ExtensionPoint newExtensionPoint = (ExtensionPoint) create(UMLPackage.Literals.EXTENSION_POINT);
 		getExtensionPoints().add(newExtensionPoint);
 		if (name != null)
 			newExtensionPoint.setName(name);
@@ -290,16 +269,12 @@
 	 */
 	public ExtensionPoint getExtensionPoint(String name, boolean ignoreCase,
 			boolean createOnDemand) {
-		extensionPointLoop : for (ExtensionPoint extensionPoint : getExtensionPoints()) {
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(extensionPoint.getName())
-				: name.equals(extensionPoint.getName())))
+		extensionPointLoop: for (ExtensionPoint extensionPoint : getExtensionPoints()) {
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(extensionPoint.getName()) : name.equals(extensionPoint.getName())))
 				continue extensionPointLoop;
 			return extensionPoint;
 		}
-		return createOnDemand
-			? createExtensionPoint(name)
-			: null;
+		return createOnDemand ? createExtensionPoint(name) : null;
 	}
 
 	/**
@@ -309,9 +284,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public EList<Classifier> getSubjects() {
-		return (EList<Classifier>) eDynamicGet(
-			UMLPackage.USE_CASE__SUBJECT - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.USE_CASE__SUBJECT, true, true);
+		return (EList<Classifier>) eDynamicGet(UMLPackage.USE_CASE__SUBJECT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.USE_CASE__SUBJECT, true, true);
 	}
 
 	/**
@@ -330,12 +303,10 @@
 	 */
 	public Classifier getSubject(String name, boolean ignoreCase,
 			EClass eClass) {
-		subjectLoop : for (Classifier subject : getSubjects()) {
+		subjectLoop: for (Classifier subject : getSubjects()) {
 			if (eClass != null && !eClass.isInstance(subject))
 				continue subjectLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(subject.getName())
-				: name.equals(subject.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(subject.getName()) : name.equals(subject.getName())))
 				continue subjectLoop;
 			return subject;
 		}
@@ -349,8 +320,7 @@
 	 */
 	public boolean validateMustHaveName(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return UseCaseOperations.validateMustHaveName(this, diagnostics,
-			context);
+		return UseCaseOperations.validateMustHaveName(this, diagnostics, context);
 	}
 
 	/**
@@ -360,8 +330,7 @@
 	 */
 	public boolean validateBinaryAssociations(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return UseCaseOperations.validateBinaryAssociations(this, diagnostics,
-			context);
+		return UseCaseOperations.validateBinaryAssociations(this, diagnostics, context);
 	}
 
 	/**
@@ -371,8 +340,7 @@
 	 */
 	public boolean validateNoAssociationToUseCase(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return UseCaseOperations.validateNoAssociationToUseCase(this,
-			diagnostics, context);
+		return UseCaseOperations.validateNoAssociationToUseCase(this, diagnostics, context);
 	}
 
 	/**
@@ -382,8 +350,7 @@
 	 */
 	public boolean validateCannotIncludeSelf(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return UseCaseOperations.validateCannotIncludeSelf(this, diagnostics,
-			context);
+		return UseCaseOperations.validateCannotIncludeSelf(this, diagnostics, context);
 	}
 
 	/**
@@ -395,12 +362,9 @@
 		CacheAdapter cache = getCacheAdapter();
 		if (cache != null) {
 			@SuppressWarnings("unchecked")
-			EList<UseCase> result = (EList<UseCase>) cache.get(this,
-				UMLPackage.Literals.USE_CASE___ALL_INCLUDED_USE_CASES);
+			EList<UseCase> result = (EList<UseCase>) cache.get(this, UMLPackage.Literals.USE_CASE___ALL_INCLUDED_USE_CASES);
 			if (result == null) {
-				cache.put(this,
-					UMLPackage.Literals.USE_CASE___ALL_INCLUDED_USE_CASES,
-					result = UseCaseOperations.allIncludedUseCases(this));
+				cache.put(this, UMLPackage.Literals.USE_CASE___ALL_INCLUDED_USE_CASES, result = UseCaseOperations.allIncludedUseCases(this));
 			}
 			return result;
 		}
@@ -417,72 +381,48 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.USE_CASE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.USE_CASE__OWNED_RULE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.USE_CASE__ELEMENT_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.USE_CASE__PACKAGE_IMPORT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.USE_CASE__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.USE_CASE__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.USE_CASE__TEMPLATE_BINDING :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE :
-				TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
-				if (ownedTemplateSignature != null)
-					msgs = ((InternalEObject) ownedTemplateSignature)
-						.eInverseRemove(this,
-							EOPPOSITE_FEATURE_BASE
-								- UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE,
-							null, msgs);
-				return basicSetOwnedTemplateSignature(
-					(TemplateSignature) otherEnd, msgs);
-			case UMLPackage.USE_CASE__GENERALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.USE_CASE__POWERTYPE_EXTENT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.USE_CASE__USE_CASE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.USE_CASE__SUBSTITUTION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.USE_CASE__INTERFACE_REALIZATION :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.USE_CASE__EXTEND :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getExtends())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.USE_CASE__EXTENSION_POINT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getExtensionPoints())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.USE_CASE__INCLUDE :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncludes())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.USE_CASE__SUBJECT :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubjects())
-					.basicAdd(otherEnd, msgs);
+		case UMLPackage.USE_CASE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.USE_CASE__OWNED_RULE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getOwnedRules()).basicAdd(otherEnd, msgs);
+		case UMLPackage.USE_CASE__ELEMENT_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getElementImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.USE_CASE__PACKAGE_IMPORT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPackageImports()).basicAdd(otherEnd, msgs);
+		case UMLPackage.USE_CASE__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.USE_CASE__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.USE_CASE__TEMPLATE_BINDING:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getTemplateBindings()).basicAdd(otherEnd, msgs);
+		case UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE:
+			TemplateSignature ownedTemplateSignature = basicGetOwnedTemplateSignature();
+			if (ownedTemplateSignature != null)
+				msgs = ((InternalEObject) ownedTemplateSignature).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE, null, msgs);
+			return basicSetOwnedTemplateSignature((TemplateSignature) otherEnd, msgs);
+		case UMLPackage.USE_CASE__GENERALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getGeneralizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.USE_CASE__POWERTYPE_EXTENT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getPowertypeExtents()).basicAdd(otherEnd, msgs);
+		case UMLPackage.USE_CASE__USE_CASE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getUseCases()).basicAdd(otherEnd, msgs);
+		case UMLPackage.USE_CASE__SUBSTITUTION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubstitutions()).basicAdd(otherEnd, msgs);
+		case UMLPackage.USE_CASE__INTERFACE_REALIZATION:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getInterfaceRealizations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.USE_CASE__EXTEND:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getExtends()).basicAdd(otherEnd, msgs);
+		case UMLPackage.USE_CASE__EXTENSION_POINT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getExtensionPoints()).basicAdd(otherEnd, msgs);
+		case UMLPackage.USE_CASE__INCLUDE:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncludes()).basicAdd(otherEnd, msgs);
+		case UMLPackage.USE_CASE__SUBJECT:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubjects()).basicAdd(otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -496,68 +436,50 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.USE_CASE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.USE_CASE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.USE_CASE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.USE_CASE__OWNED_RULE :
-				return ((InternalEList<?>) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.USE_CASE__ELEMENT_IMPORT :
-				return ((InternalEList<?>) getElementImports())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.USE_CASE__PACKAGE_IMPORT :
-				return ((InternalEList<?>) getPackageImports())
-					.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(otherEnd, msgs);
-			case UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE :
-				return basicSetOwnedTemplateSignature(null, msgs);
-			case UMLPackage.USE_CASE__COLLABORATION_USE :
-				return ((InternalEList<?>) getCollaborationUses())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.USE_CASE__GENERALIZATION :
-				return ((InternalEList<?>) getGeneralizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.USE_CASE__POWERTYPE_EXTENT :
-				return ((InternalEList<?>) getPowertypeExtents())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.USE_CASE__OWNED_USE_CASE :
-				return ((InternalEList<?>) getOwnedUseCases())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.USE_CASE__USE_CASE :
-				return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.USE_CASE__SUBSTITUTION :
-				return ((InternalEList<?>) getSubstitutions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.USE_CASE__INTERFACE_REALIZATION :
-				return ((InternalEList<?>) getInterfaceRealizations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.USE_CASE__OWNED_BEHAVIOR :
-				return ((InternalEList<?>) getOwnedBehaviors())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.USE_CASE__EXTEND :
-				return ((InternalEList<?>) getExtends()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.USE_CASE__EXTENSION_POINT :
-				return ((InternalEList<?>) getExtensionPoints())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.USE_CASE__INCLUDE :
-				return ((InternalEList<?>) getIncludes()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.USE_CASE__SUBJECT :
-				return ((InternalEList<?>) getSubjects()).basicRemove(otherEnd,
-					msgs);
+		case UMLPackage.USE_CASE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.USE_CASE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.USE_CASE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.USE_CASE__OWNED_RULE:
+			return ((InternalEList<?>) getOwnedRules()).basicRemove(otherEnd, msgs);
+		case UMLPackage.USE_CASE__ELEMENT_IMPORT:
+			return ((InternalEList<?>) getElementImports()).basicRemove(otherEnd, msgs);
+		case UMLPackage.USE_CASE__PACKAGE_IMPORT:
+			return ((InternalEList<?>) getPackageImports()).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(otherEnd, msgs);
+		case UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE:
+			return basicSetOwnedTemplateSignature(null, msgs);
+		case UMLPackage.USE_CASE__COLLABORATION_USE:
+			return ((InternalEList<?>) getCollaborationUses()).basicRemove(otherEnd, msgs);
+		case UMLPackage.USE_CASE__GENERALIZATION:
+			return ((InternalEList<?>) getGeneralizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.USE_CASE__POWERTYPE_EXTENT:
+			return ((InternalEList<?>) getPowertypeExtents()).basicRemove(otherEnd, msgs);
+		case UMLPackage.USE_CASE__OWNED_USE_CASE:
+			return ((InternalEList<?>) getOwnedUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.USE_CASE__USE_CASE:
+			return ((InternalEList<?>) getUseCases()).basicRemove(otherEnd, msgs);
+		case UMLPackage.USE_CASE__SUBSTITUTION:
+			return ((InternalEList<?>) getSubstitutions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.USE_CASE__INTERFACE_REALIZATION:
+			return ((InternalEList<?>) getInterfaceRealizations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.USE_CASE__OWNED_BEHAVIOR:
+			return ((InternalEList<?>) getOwnedBehaviors()).basicRemove(otherEnd, msgs);
+		case UMLPackage.USE_CASE__EXTEND:
+			return ((InternalEList<?>) getExtends()).basicRemove(otherEnd, msgs);
+		case UMLPackage.USE_CASE__EXTENSION_POINT:
+			return ((InternalEList<?>) getExtensionPoints()).basicRemove(otherEnd, msgs);
+		case UMLPackage.USE_CASE__INCLUDE:
+			return ((InternalEList<?>) getIncludes()).basicRemove(otherEnd, msgs);
+		case UMLPackage.USE_CASE__SUBJECT:
+			return ((InternalEList<?>) getSubjects()).basicRemove(otherEnd, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -570,114 +492,114 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.USE_CASE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.USE_CASE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.USE_CASE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.USE_CASE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.USE_CASE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.USE_CASE__NAME :
-				return getName();
-			case UMLPackage.USE_CASE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.USE_CASE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.USE_CASE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.USE_CASE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.USE_CASE__OWNED_RULE :
-				return getOwnedRules();
-			case UMLPackage.USE_CASE__ELEMENT_IMPORT :
-				return getElementImports();
-			case UMLPackage.USE_CASE__PACKAGE_IMPORT :
-				return getPackageImports();
-			case UMLPackage.USE_CASE__OWNED_MEMBER :
-				return getOwnedMembers();
-			case UMLPackage.USE_CASE__IMPORTED_MEMBER :
-				return getImportedMembers();
-			case UMLPackage.USE_CASE__MEMBER :
-				return getMembers();
-			case UMLPackage.USE_CASE__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.USE_CASE__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.USE_CASE__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.USE_CASE__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.USE_CASE__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.USE_CASE__PACKAGE :
-				if (resolve)
-					return getPackage();
-				return basicGetPackage();
-			case UMLPackage.USE_CASE__TEMPLATE_BINDING :
-				return getTemplateBindings();
-			case UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE :
-				if (resolve)
-					return getOwnedTemplateSignature();
-				return basicGetOwnedTemplateSignature();
-			case UMLPackage.USE_CASE__FEATURE :
-				return getFeatures();
-			case UMLPackage.USE_CASE__ATTRIBUTE :
-				return getAttributes();
-			case UMLPackage.USE_CASE__COLLABORATION_USE :
-				return getCollaborationUses();
-			case UMLPackage.USE_CASE__GENERAL :
-				return getGenerals();
-			case UMLPackage.USE_CASE__GENERALIZATION :
-				return getGeneralizations();
-			case UMLPackage.USE_CASE__POWERTYPE_EXTENT :
-				return getPowertypeExtents();
-			case UMLPackage.USE_CASE__INHERITED_MEMBER :
-				return getInheritedMembers();
-			case UMLPackage.USE_CASE__IS_ABSTRACT :
-				return isAbstract();
-			case UMLPackage.USE_CASE__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization();
-			case UMLPackage.USE_CASE__OWNED_USE_CASE :
-				return getOwnedUseCases();
-			case UMLPackage.USE_CASE__USE_CASE :
-				return getUseCases();
-			case UMLPackage.USE_CASE__REDEFINED_CLASSIFIER :
-				return getRedefinedClassifiers();
-			case UMLPackage.USE_CASE__REPRESENTATION :
-				if (resolve)
-					return getRepresentation();
-				return basicGetRepresentation();
-			case UMLPackage.USE_CASE__SUBSTITUTION :
-				return getSubstitutions();
-			case UMLPackage.USE_CASE__CLASSIFIER_BEHAVIOR :
-				if (resolve)
-					return getClassifierBehavior();
-				return basicGetClassifierBehavior();
-			case UMLPackage.USE_CASE__INTERFACE_REALIZATION :
-				return getInterfaceRealizations();
-			case UMLPackage.USE_CASE__OWNED_BEHAVIOR :
-				return getOwnedBehaviors();
-			case UMLPackage.USE_CASE__EXTEND :
-				return getExtends();
-			case UMLPackage.USE_CASE__EXTENSION_POINT :
-				return getExtensionPoints();
-			case UMLPackage.USE_CASE__INCLUDE :
-				return getIncludes();
-			case UMLPackage.USE_CASE__SUBJECT :
-				return getSubjects();
+		case UMLPackage.USE_CASE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.USE_CASE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.USE_CASE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.USE_CASE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.USE_CASE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.USE_CASE__NAME:
+			return getName();
+		case UMLPackage.USE_CASE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.USE_CASE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.USE_CASE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.USE_CASE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.USE_CASE__OWNED_RULE:
+			return getOwnedRules();
+		case UMLPackage.USE_CASE__ELEMENT_IMPORT:
+			return getElementImports();
+		case UMLPackage.USE_CASE__PACKAGE_IMPORT:
+			return getPackageImports();
+		case UMLPackage.USE_CASE__OWNED_MEMBER:
+			return getOwnedMembers();
+		case UMLPackage.USE_CASE__IMPORTED_MEMBER:
+			return getImportedMembers();
+		case UMLPackage.USE_CASE__MEMBER:
+			return getMembers();
+		case UMLPackage.USE_CASE__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.USE_CASE__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.USE_CASE__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.USE_CASE__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.USE_CASE__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.USE_CASE__PACKAGE:
+			if (resolve)
+				return getPackage();
+			return basicGetPackage();
+		case UMLPackage.USE_CASE__TEMPLATE_BINDING:
+			return getTemplateBindings();
+		case UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE:
+			if (resolve)
+				return getOwnedTemplateSignature();
+			return basicGetOwnedTemplateSignature();
+		case UMLPackage.USE_CASE__FEATURE:
+			return getFeatures();
+		case UMLPackage.USE_CASE__ATTRIBUTE:
+			return getAttributes();
+		case UMLPackage.USE_CASE__COLLABORATION_USE:
+			return getCollaborationUses();
+		case UMLPackage.USE_CASE__GENERAL:
+			return getGenerals();
+		case UMLPackage.USE_CASE__GENERALIZATION:
+			return getGeneralizations();
+		case UMLPackage.USE_CASE__POWERTYPE_EXTENT:
+			return getPowertypeExtents();
+		case UMLPackage.USE_CASE__INHERITED_MEMBER:
+			return getInheritedMembers();
+		case UMLPackage.USE_CASE__IS_ABSTRACT:
+			return isAbstract();
+		case UMLPackage.USE_CASE__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization();
+		case UMLPackage.USE_CASE__OWNED_USE_CASE:
+			return getOwnedUseCases();
+		case UMLPackage.USE_CASE__USE_CASE:
+			return getUseCases();
+		case UMLPackage.USE_CASE__REDEFINED_CLASSIFIER:
+			return getRedefinedClassifiers();
+		case UMLPackage.USE_CASE__REPRESENTATION:
+			if (resolve)
+				return getRepresentation();
+			return basicGetRepresentation();
+		case UMLPackage.USE_CASE__SUBSTITUTION:
+			return getSubstitutions();
+		case UMLPackage.USE_CASE__CLASSIFIER_BEHAVIOR:
+			if (resolve)
+				return getClassifierBehavior();
+			return basicGetClassifierBehavior();
+		case UMLPackage.USE_CASE__INTERFACE_REALIZATION:
+			return getInterfaceRealizations();
+		case UMLPackage.USE_CASE__OWNED_BEHAVIOR:
+			return getOwnedBehaviors();
+		case UMLPackage.USE_CASE__EXTEND:
+			return getExtends();
+		case UMLPackage.USE_CASE__EXTENSION_POINT:
+			return getExtensionPoints();
+		case UMLPackage.USE_CASE__INCLUDE:
+			return getIncludes();
+		case UMLPackage.USE_CASE__SUBJECT:
+			return getSubjects();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -691,139 +613,122 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.USE_CASE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.USE_CASE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.USE_CASE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.USE_CASE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.USE_CASE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.USE_CASE__OWNED_RULE :
-				getOwnedRules().clear();
-				getOwnedRules()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.USE_CASE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				getElementImports()
-					.addAll((Collection<? extends ElementImport>) newValue);
-				return;
-			case UMLPackage.USE_CASE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				getPackageImports()
-					.addAll((Collection<? extends PackageImport>) newValue);
-				return;
-			case UMLPackage.USE_CASE__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.USE_CASE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.USE_CASE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.USE_CASE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) newValue);
-				return;
-			case UMLPackage.USE_CASE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				getTemplateBindings()
-					.addAll((Collection<? extends TemplateBinding>) newValue);
-				return;
-			case UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) newValue);
-				return;
-			case UMLPackage.USE_CASE__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				getCollaborationUses()
-					.addAll((Collection<? extends CollaborationUse>) newValue);
-				return;
-			case UMLPackage.USE_CASE__GENERAL :
-				getGenerals().clear();
-				getGenerals()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.USE_CASE__GENERALIZATION :
-				getGeneralizations().clear();
-				getGeneralizations()
-					.addAll((Collection<? extends Generalization>) newValue);
-				return;
-			case UMLPackage.USE_CASE__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				getPowertypeExtents()
-					.addAll((Collection<? extends GeneralizationSet>) newValue);
-				return;
-			case UMLPackage.USE_CASE__IS_ABSTRACT :
-				setIsAbstract((Boolean) newValue);
-				return;
-			case UMLPackage.USE_CASE__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization((Boolean) newValue);
-				return;
-			case UMLPackage.USE_CASE__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				getOwnedUseCases()
-					.addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.USE_CASE__USE_CASE :
-				getUseCases().clear();
-				getUseCases().addAll((Collection<? extends UseCase>) newValue);
-				return;
-			case UMLPackage.USE_CASE__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				getRedefinedClassifiers()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
-			case UMLPackage.USE_CASE__REPRESENTATION :
-				setRepresentation((CollaborationUse) newValue);
-				return;
-			case UMLPackage.USE_CASE__SUBSTITUTION :
-				getSubstitutions().clear();
-				getSubstitutions()
-					.addAll((Collection<? extends Substitution>) newValue);
-				return;
-			case UMLPackage.USE_CASE__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) newValue);
-				return;
-			case UMLPackage.USE_CASE__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				getInterfaceRealizations().addAll(
-					(Collection<? extends InterfaceRealization>) newValue);
-				return;
-			case UMLPackage.USE_CASE__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				getOwnedBehaviors()
-					.addAll((Collection<? extends Behavior>) newValue);
-				return;
-			case UMLPackage.USE_CASE__EXTEND :
-				getExtends().clear();
-				getExtends().addAll((Collection<? extends Extend>) newValue);
-				return;
-			case UMLPackage.USE_CASE__EXTENSION_POINT :
-				getExtensionPoints().clear();
-				getExtensionPoints()
-					.addAll((Collection<? extends ExtensionPoint>) newValue);
-				return;
-			case UMLPackage.USE_CASE__INCLUDE :
-				getIncludes().clear();
-				getIncludes().addAll((Collection<? extends Include>) newValue);
-				return;
-			case UMLPackage.USE_CASE__SUBJECT :
-				getSubjects().clear();
-				getSubjects()
-					.addAll((Collection<? extends Classifier>) newValue);
-				return;
+		case UMLPackage.USE_CASE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.USE_CASE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.USE_CASE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.USE_CASE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.USE_CASE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.USE_CASE__OWNED_RULE:
+			getOwnedRules().clear();
+			getOwnedRules().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.USE_CASE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			getElementImports().addAll((Collection<? extends ElementImport>) newValue);
+			return;
+		case UMLPackage.USE_CASE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			getPackageImports().addAll((Collection<? extends PackageImport>) newValue);
+			return;
+		case UMLPackage.USE_CASE__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.USE_CASE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.USE_CASE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.USE_CASE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) newValue);
+			return;
+		case UMLPackage.USE_CASE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			getTemplateBindings().addAll((Collection<? extends TemplateBinding>) newValue);
+			return;
+		case UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) newValue);
+			return;
+		case UMLPackage.USE_CASE__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			getCollaborationUses().addAll((Collection<? extends CollaborationUse>) newValue);
+			return;
+		case UMLPackage.USE_CASE__GENERAL:
+			getGenerals().clear();
+			getGenerals().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.USE_CASE__GENERALIZATION:
+			getGeneralizations().clear();
+			getGeneralizations().addAll((Collection<? extends Generalization>) newValue);
+			return;
+		case UMLPackage.USE_CASE__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			getPowertypeExtents().addAll((Collection<? extends GeneralizationSet>) newValue);
+			return;
+		case UMLPackage.USE_CASE__IS_ABSTRACT:
+			setIsAbstract((Boolean) newValue);
+			return;
+		case UMLPackage.USE_CASE__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization((Boolean) newValue);
+			return;
+		case UMLPackage.USE_CASE__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			getOwnedUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.USE_CASE__USE_CASE:
+			getUseCases().clear();
+			getUseCases().addAll((Collection<? extends UseCase>) newValue);
+			return;
+		case UMLPackage.USE_CASE__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			getRedefinedClassifiers().addAll((Collection<? extends Classifier>) newValue);
+			return;
+		case UMLPackage.USE_CASE__REPRESENTATION:
+			setRepresentation((CollaborationUse) newValue);
+			return;
+		case UMLPackage.USE_CASE__SUBSTITUTION:
+			getSubstitutions().clear();
+			getSubstitutions().addAll((Collection<? extends Substitution>) newValue);
+			return;
+		case UMLPackage.USE_CASE__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) newValue);
+			return;
+		case UMLPackage.USE_CASE__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			getInterfaceRealizations().addAll((Collection<? extends InterfaceRealization>) newValue);
+			return;
+		case UMLPackage.USE_CASE__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			getOwnedBehaviors().addAll((Collection<? extends Behavior>) newValue);
+			return;
+		case UMLPackage.USE_CASE__EXTEND:
+			getExtends().clear();
+			getExtends().addAll((Collection<? extends Extend>) newValue);
+			return;
+		case UMLPackage.USE_CASE__EXTENSION_POINT:
+			getExtensionPoints().clear();
+			getExtensionPoints().addAll((Collection<? extends ExtensionPoint>) newValue);
+			return;
+		case UMLPackage.USE_CASE__INCLUDE:
+			getIncludes().clear();
+			getIncludes().addAll((Collection<? extends Include>) newValue);
+			return;
+		case UMLPackage.USE_CASE__SUBJECT:
+			getSubjects().clear();
+			getSubjects().addAll((Collection<? extends Classifier>) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -836,102 +741,102 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.USE_CASE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.USE_CASE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.USE_CASE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.USE_CASE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.USE_CASE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.USE_CASE__OWNED_RULE :
-				getOwnedRules().clear();
-				return;
-			case UMLPackage.USE_CASE__ELEMENT_IMPORT :
-				getElementImports().clear();
-				return;
-			case UMLPackage.USE_CASE__PACKAGE_IMPORT :
-				getPackageImports().clear();
-				return;
-			case UMLPackage.USE_CASE__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.USE_CASE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.USE_CASE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.USE_CASE__PACKAGE :
-				setPackage((org.eclipse.uml2.uml.Package) null);
-				return;
-			case UMLPackage.USE_CASE__TEMPLATE_BINDING :
-				getTemplateBindings().clear();
-				return;
-			case UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE :
-				setOwnedTemplateSignature((TemplateSignature) null);
-				return;
-			case UMLPackage.USE_CASE__COLLABORATION_USE :
-				getCollaborationUses().clear();
-				return;
-			case UMLPackage.USE_CASE__GENERAL :
-				getGenerals().clear();
-				return;
-			case UMLPackage.USE_CASE__GENERALIZATION :
-				getGeneralizations().clear();
-				return;
-			case UMLPackage.USE_CASE__POWERTYPE_EXTENT :
-				getPowertypeExtents().clear();
-				return;
-			case UMLPackage.USE_CASE__IS_ABSTRACT :
-				setIsAbstract(IS_ABSTRACT_EDEFAULT);
-				return;
-			case UMLPackage.USE_CASE__IS_FINAL_SPECIALIZATION :
-				setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
-				return;
-			case UMLPackage.USE_CASE__OWNED_USE_CASE :
-				getOwnedUseCases().clear();
-				return;
-			case UMLPackage.USE_CASE__USE_CASE :
-				getUseCases().clear();
-				return;
-			case UMLPackage.USE_CASE__REDEFINED_CLASSIFIER :
-				getRedefinedClassifiers().clear();
-				return;
-			case UMLPackage.USE_CASE__REPRESENTATION :
-				setRepresentation((CollaborationUse) null);
-				return;
-			case UMLPackage.USE_CASE__SUBSTITUTION :
-				getSubstitutions().clear();
-				return;
-			case UMLPackage.USE_CASE__CLASSIFIER_BEHAVIOR :
-				setClassifierBehavior((Behavior) null);
-				return;
-			case UMLPackage.USE_CASE__INTERFACE_REALIZATION :
-				getInterfaceRealizations().clear();
-				return;
-			case UMLPackage.USE_CASE__OWNED_BEHAVIOR :
-				getOwnedBehaviors().clear();
-				return;
-			case UMLPackage.USE_CASE__EXTEND :
-				getExtends().clear();
-				return;
-			case UMLPackage.USE_CASE__EXTENSION_POINT :
-				getExtensionPoints().clear();
-				return;
-			case UMLPackage.USE_CASE__INCLUDE :
-				getIncludes().clear();
-				return;
-			case UMLPackage.USE_CASE__SUBJECT :
-				getSubjects().clear();
-				return;
+		case UMLPackage.USE_CASE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.USE_CASE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.USE_CASE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.USE_CASE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.USE_CASE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.USE_CASE__OWNED_RULE:
+			getOwnedRules().clear();
+			return;
+		case UMLPackage.USE_CASE__ELEMENT_IMPORT:
+			getElementImports().clear();
+			return;
+		case UMLPackage.USE_CASE__PACKAGE_IMPORT:
+			getPackageImports().clear();
+			return;
+		case UMLPackage.USE_CASE__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.USE_CASE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.USE_CASE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.USE_CASE__PACKAGE:
+			setPackage((org.eclipse.uml2.uml.Package) null);
+			return;
+		case UMLPackage.USE_CASE__TEMPLATE_BINDING:
+			getTemplateBindings().clear();
+			return;
+		case UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE:
+			setOwnedTemplateSignature((TemplateSignature) null);
+			return;
+		case UMLPackage.USE_CASE__COLLABORATION_USE:
+			getCollaborationUses().clear();
+			return;
+		case UMLPackage.USE_CASE__GENERAL:
+			getGenerals().clear();
+			return;
+		case UMLPackage.USE_CASE__GENERALIZATION:
+			getGeneralizations().clear();
+			return;
+		case UMLPackage.USE_CASE__POWERTYPE_EXTENT:
+			getPowertypeExtents().clear();
+			return;
+		case UMLPackage.USE_CASE__IS_ABSTRACT:
+			setIsAbstract(IS_ABSTRACT_EDEFAULT);
+			return;
+		case UMLPackage.USE_CASE__IS_FINAL_SPECIALIZATION:
+			setIsFinalSpecialization(IS_FINAL_SPECIALIZATION_EDEFAULT);
+			return;
+		case UMLPackage.USE_CASE__OWNED_USE_CASE:
+			getOwnedUseCases().clear();
+			return;
+		case UMLPackage.USE_CASE__USE_CASE:
+			getUseCases().clear();
+			return;
+		case UMLPackage.USE_CASE__REDEFINED_CLASSIFIER:
+			getRedefinedClassifiers().clear();
+			return;
+		case UMLPackage.USE_CASE__REPRESENTATION:
+			setRepresentation((CollaborationUse) null);
+			return;
+		case UMLPackage.USE_CASE__SUBSTITUTION:
+			getSubstitutions().clear();
+			return;
+		case UMLPackage.USE_CASE__CLASSIFIER_BEHAVIOR:
+			setClassifierBehavior((Behavior) null);
+			return;
+		case UMLPackage.USE_CASE__INTERFACE_REALIZATION:
+			getInterfaceRealizations().clear();
+			return;
+		case UMLPackage.USE_CASE__OWNED_BEHAVIOR:
+			getOwnedBehaviors().clear();
+			return;
+		case UMLPackage.USE_CASE__EXTEND:
+			getExtends().clear();
+			return;
+		case UMLPackage.USE_CASE__EXTENSION_POINT:
+			getExtensionPoints().clear();
+			return;
+		case UMLPackage.USE_CASE__INCLUDE:
+			getIncludes().clear();
+			return;
+		case UMLPackage.USE_CASE__SUBJECT:
+			getSubjects().clear();
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -944,98 +849,96 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.USE_CASE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.USE_CASE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.USE_CASE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.USE_CASE__OWNER :
-				return isSetOwner();
-			case UMLPackage.USE_CASE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.USE_CASE__NAME :
-				return isSetName();
-			case UMLPackage.USE_CASE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.USE_CASE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.USE_CASE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.USE_CASE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.USE_CASE__OWNED_RULE :
-				return !getOwnedRules().isEmpty();
-			case UMLPackage.USE_CASE__ELEMENT_IMPORT :
-				return !getElementImports().isEmpty();
-			case UMLPackage.USE_CASE__PACKAGE_IMPORT :
-				return !getPackageImports().isEmpty();
-			case UMLPackage.USE_CASE__OWNED_MEMBER :
-				return isSetOwnedMembers();
-			case UMLPackage.USE_CASE__IMPORTED_MEMBER :
-				return !getImportedMembers().isEmpty();
-			case UMLPackage.USE_CASE__MEMBER :
-				return isSetMembers();
-			case UMLPackage.USE_CASE__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.USE_CASE__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.USE_CASE__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.USE_CASE__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.USE_CASE__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.USE_CASE__PACKAGE :
-				return basicGetPackage() != null;
-			case UMLPackage.USE_CASE__TEMPLATE_BINDING :
-				return !getTemplateBindings().isEmpty();
-			case UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE :
-				return isSetOwnedTemplateSignature();
-			case UMLPackage.USE_CASE__FEATURE :
-				return isSetFeatures();
-			case UMLPackage.USE_CASE__ATTRIBUTE :
-				return isSetAttributes();
-			case UMLPackage.USE_CASE__COLLABORATION_USE :
-				return !getCollaborationUses().isEmpty();
-			case UMLPackage.USE_CASE__GENERAL :
-				return !getGenerals().isEmpty();
-			case UMLPackage.USE_CASE__GENERALIZATION :
-				return !getGeneralizations().isEmpty();
-			case UMLPackage.USE_CASE__POWERTYPE_EXTENT :
-				return !getPowertypeExtents().isEmpty();
-			case UMLPackage.USE_CASE__INHERITED_MEMBER :
-				return !getInheritedMembers().isEmpty();
-			case UMLPackage.USE_CASE__IS_ABSTRACT :
-				return isAbstract() != IS_ABSTRACT_EDEFAULT;
-			case UMLPackage.USE_CASE__IS_FINAL_SPECIALIZATION :
-				return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
-			case UMLPackage.USE_CASE__OWNED_USE_CASE :
-				return !getOwnedUseCases().isEmpty();
-			case UMLPackage.USE_CASE__USE_CASE :
-				return !getUseCases().isEmpty();
-			case UMLPackage.USE_CASE__REDEFINED_CLASSIFIER :
-				return !getRedefinedClassifiers().isEmpty();
-			case UMLPackage.USE_CASE__REPRESENTATION :
-				return basicGetRepresentation() != null;
-			case UMLPackage.USE_CASE__SUBSTITUTION :
-				return !getSubstitutions().isEmpty();
-			case UMLPackage.USE_CASE__CLASSIFIER_BEHAVIOR :
-				return basicGetClassifierBehavior() != null;
-			case UMLPackage.USE_CASE__INTERFACE_REALIZATION :
-				return !getInterfaceRealizations().isEmpty();
-			case UMLPackage.USE_CASE__OWNED_BEHAVIOR :
-				return !getOwnedBehaviors().isEmpty();
-			case UMLPackage.USE_CASE__EXTEND :
-				return !getExtends().isEmpty();
-			case UMLPackage.USE_CASE__EXTENSION_POINT :
-				return !getExtensionPoints().isEmpty();
-			case UMLPackage.USE_CASE__INCLUDE :
-				return !getIncludes().isEmpty();
-			case UMLPackage.USE_CASE__SUBJECT :
-				return !getSubjects().isEmpty();
+		case UMLPackage.USE_CASE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.USE_CASE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.USE_CASE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.USE_CASE__OWNER:
+			return isSetOwner();
+		case UMLPackage.USE_CASE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.USE_CASE__NAME:
+			return isSetName();
+		case UMLPackage.USE_CASE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.USE_CASE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.USE_CASE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.USE_CASE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.USE_CASE__OWNED_RULE:
+			return !getOwnedRules().isEmpty();
+		case UMLPackage.USE_CASE__ELEMENT_IMPORT:
+			return !getElementImports().isEmpty();
+		case UMLPackage.USE_CASE__PACKAGE_IMPORT:
+			return !getPackageImports().isEmpty();
+		case UMLPackage.USE_CASE__OWNED_MEMBER:
+			return isSetOwnedMembers();
+		case UMLPackage.USE_CASE__IMPORTED_MEMBER:
+			return !getImportedMembers().isEmpty();
+		case UMLPackage.USE_CASE__MEMBER:
+			return isSetMembers();
+		case UMLPackage.USE_CASE__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.USE_CASE__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.USE_CASE__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.USE_CASE__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.USE_CASE__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.USE_CASE__PACKAGE:
+			return basicGetPackage() != null;
+		case UMLPackage.USE_CASE__TEMPLATE_BINDING:
+			return !getTemplateBindings().isEmpty();
+		case UMLPackage.USE_CASE__OWNED_TEMPLATE_SIGNATURE:
+			return isSetOwnedTemplateSignature();
+		case UMLPackage.USE_CASE__FEATURE:
+			return isSetFeatures();
+		case UMLPackage.USE_CASE__ATTRIBUTE:
+			return isSetAttributes();
+		case UMLPackage.USE_CASE__COLLABORATION_USE:
+			return !getCollaborationUses().isEmpty();
+		case UMLPackage.USE_CASE__GENERAL:
+			return !getGenerals().isEmpty();
+		case UMLPackage.USE_CASE__GENERALIZATION:
+			return !getGeneralizations().isEmpty();
+		case UMLPackage.USE_CASE__POWERTYPE_EXTENT:
+			return !getPowertypeExtents().isEmpty();
+		case UMLPackage.USE_CASE__INHERITED_MEMBER:
+			return !getInheritedMembers().isEmpty();
+		case UMLPackage.USE_CASE__IS_ABSTRACT:
+			return isAbstract() != IS_ABSTRACT_EDEFAULT;
+		case UMLPackage.USE_CASE__IS_FINAL_SPECIALIZATION:
+			return isFinalSpecialization() != IS_FINAL_SPECIALIZATION_EDEFAULT;
+		case UMLPackage.USE_CASE__OWNED_USE_CASE:
+			return !getOwnedUseCases().isEmpty();
+		case UMLPackage.USE_CASE__USE_CASE:
+			return !getUseCases().isEmpty();
+		case UMLPackage.USE_CASE__REDEFINED_CLASSIFIER:
+			return !getRedefinedClassifiers().isEmpty();
+		case UMLPackage.USE_CASE__REPRESENTATION:
+			return basicGetRepresentation() != null;
+		case UMLPackage.USE_CASE__SUBSTITUTION:
+			return !getSubstitutions().isEmpty();
+		case UMLPackage.USE_CASE__CLASSIFIER_BEHAVIOR:
+			return basicGetClassifierBehavior() != null;
+		case UMLPackage.USE_CASE__INTERFACE_REALIZATION:
+			return !getInterfaceRealizations().isEmpty();
+		case UMLPackage.USE_CASE__OWNED_BEHAVIOR:
+			return !getOwnedBehaviors().isEmpty();
+		case UMLPackage.USE_CASE__EXTEND:
+			return !getExtends().isEmpty();
+		case UMLPackage.USE_CASE__EXTENSION_POINT:
+			return !getExtensionPoints().isEmpty();
+		case UMLPackage.USE_CASE__INCLUDE:
+			return !getIncludes().isEmpty();
+		case UMLPackage.USE_CASE__SUBJECT:
+			return !getSubjects().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -1050,296 +953,233 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.USE_CASE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.USE_CASE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.USE_CASE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.USE_CASE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.USE_CASE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.USE_CASE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.USE_CASE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.USE_CASE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.USE_CASE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.USE_CASE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.USE_CASE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.USE_CASE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.USE_CASE___GET_MODEL :
-				return getModel();
-			case UMLPackage.USE_CASE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.USE_CASE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.USE_CASE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.USE_CASE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.USE_CASE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.USE_CASE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.USE_CASE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.USE_CASE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.USE_CASE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.USE_CASE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.USE_CASE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.USE_CASE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.USE_CASE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.USE_CASE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.USE_CASE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.USE_CASE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.USE_CASE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.USE_CASE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.USE_CASE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.USE_CASE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.USE_CASE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.USE_CASE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.USE_CASE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.USE_CASE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.USE_CASE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.USE_CASE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.USE_CASE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.USE_CASE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.USE_CASE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.USE_CASE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.USE_CASE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.USE_CASE___SEPARATOR :
-				return separator();
-			case UMLPackage.USE_CASE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.USE_CASE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP :
-				return validateMembersDistinguishable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP :
-				return validateCannotImportOwnedMembers(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND :
-				return createElementImport(
-					(PackageableElement) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.USE_CASE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND :
-				return createPackageImport(
-					(org.eclipse.uml2.uml.Package) arguments.get(0),
-					(VisibilityKind) arguments.get(1));
-			case UMLPackage.USE_CASE___GET_IMPORTED_ELEMENTS :
-				return getImportedElements();
-			case UMLPackage.USE_CASE___GET_IMPORTED_PACKAGES :
-				return getImportedPackages();
-			case UMLPackage.USE_CASE___GET_OWNED_MEMBERS :
-				return getOwnedMembers();
-			case UMLPackage.USE_CASE___EXCLUDE_COLLISIONS__ELIST :
-				return excludeCollisions(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.USE_CASE___GET_NAMES_OF_MEMBER__NAMEDELEMENT :
-				return getNamesOfMember((NamedElement) arguments.get(0));
-			case UMLPackage.USE_CASE___IMPORT_MEMBERS__ELIST :
-				return importMembers(
-					(EList<PackageableElement>) arguments.get(0));
-			case UMLPackage.USE_CASE___GET_IMPORTED_MEMBERS :
-				return getImportedMembers();
-			case UMLPackage.USE_CASE___MEMBERS_ARE_DISTINGUISHABLE :
-				return membersAreDistinguishable();
-			case UMLPackage.USE_CASE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.USE_CASE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.USE_CASE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.USE_CASE___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.USE_CASE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT :
-				return createAssociation((Boolean) arguments.get(0),
-					(AggregationKind) arguments.get(1),
-					(String) arguments.get(2), (Integer) arguments.get(3),
-					(Integer) arguments.get(4), (Type) arguments.get(5),
-					(Boolean) arguments.get(6),
-					(AggregationKind) arguments.get(7),
-					(String) arguments.get(8), (Integer) arguments.get(9),
-					(Integer) arguments.get(10));
-			case UMLPackage.USE_CASE___GET_ASSOCIATIONS :
-				return getAssociations();
-			case UMLPackage.USE_CASE___CONFORMS_TO__TYPE :
-				return conformsTo((Type) arguments.get(0));
-			case UMLPackage.USE_CASE___IS_TEMPLATE :
-				return isTemplate();
-			case UMLPackage.USE_CASE___PARAMETERABLE_ELEMENTS :
-				return parameterableElements();
-			case UMLPackage.USE_CASE___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateSpecializeType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP :
-				return validateMapsToGeneralizationSet(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP :
-				return validateNonFinalParents(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP :
-				return validateNoCyclesInGeneralization(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___GET_ALL_ATTRIBUTES :
-				return getAllAttributes();
-			case UMLPackage.USE_CASE___GET_ALL_OPERATIONS :
-				return getAllOperations();
-			case UMLPackage.USE_CASE___GET_ALL_USED_INTERFACES :
-				return getAllUsedInterfaces();
-			case UMLPackage.USE_CASE___GET_OPERATION__STRING_ELIST_ELIST :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2));
-			case UMLPackage.USE_CASE___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN :
-				return getOperation((String) arguments.get(0),
-					(EList<String>) arguments.get(1),
-					(EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
-			case UMLPackage.USE_CASE___GET_OPERATIONS :
-				return getOperations();
-			case UMLPackage.USE_CASE___GET_USED_INTERFACES :
-				return getUsedInterfaces();
-			case UMLPackage.USE_CASE___ALL_FEATURES :
-				return allFeatures();
-			case UMLPackage.USE_CASE___ALL_PARENTS :
-				return allParents();
-			case UMLPackage.USE_CASE___GET_GENERALS :
-				return getGenerals();
-			case UMLPackage.USE_CASE___HAS_VISIBILITY_OF__NAMEDELEMENT :
-				return hasVisibilityOf((NamedElement) arguments.get(0));
-			case UMLPackage.USE_CASE___INHERIT__ELIST :
-				return inherit((EList<NamedElement>) arguments.get(0));
-			case UMLPackage.USE_CASE___INHERITABLE_MEMBERS__CLASSIFIER :
-				return inheritableMembers((Classifier) arguments.get(0));
-			case UMLPackage.USE_CASE___GET_INHERITED_MEMBERS :
-				return getInheritedMembers();
-			case UMLPackage.USE_CASE___MAY_SPECIALIZE_TYPE__CLASSIFIER :
-				return maySpecializeType((Classifier) arguments.get(0));
-			case UMLPackage.USE_CASE___PARENTS :
-				return parents();
-			case UMLPackage.USE_CASE___DIRECTLY_REALIZED_INTERFACES :
-				return directlyRealizedInterfaces();
-			case UMLPackage.USE_CASE___DIRECTLY_USED_INTERFACES :
-				return directlyUsedInterfaces();
-			case UMLPackage.USE_CASE___ALL_REALIZED_INTERFACES :
-				return allRealizedInterfaces();
-			case UMLPackage.USE_CASE___ALL_USED_INTERFACES :
-				return allUsedInterfaces();
-			case UMLPackage.USE_CASE___IS_SUBSTITUTABLE_FOR__CLASSIFIER :
-				return isSubstitutableFor((Classifier) arguments.get(0));
-			case UMLPackage.USE_CASE___ALL_ATTRIBUTES :
-				return allAttributes();
-			case UMLPackage.USE_CASE___ALL_SLOTTABLE_FEATURES :
-				return allSlottableFeatures();
-			case UMLPackage.USE_CASE___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateClassBehavior((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___GET_ALL_IMPLEMENTED_INTERFACES :
-				return getAllImplementedInterfaces();
-			case UMLPackage.USE_CASE___GET_IMPLEMENTED_INTERFACES :
-				return getImplementedInterfaces();
-			case UMLPackage.USE_CASE___VALIDATE_BINARY_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP :
-				return validateBinaryAssociations(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___VALIDATE_NO_ASSOCIATION_TO_USE_CASE__DIAGNOSTICCHAIN_MAP :
-				return validateNoAssociationToUseCase(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___VALIDATE_CANNOT_INCLUDE_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateCannotIncludeSelf(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___VALIDATE_MUST_HAVE_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateMustHaveName((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.USE_CASE___ALL_INCLUDED_USE_CASES :
-				return allIncludedUseCases();
+		case UMLPackage.USE_CASE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.USE_CASE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.USE_CASE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.USE_CASE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.USE_CASE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.USE_CASE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.USE_CASE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.USE_CASE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.USE_CASE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.USE_CASE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.USE_CASE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.USE_CASE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.USE_CASE___GET_MODEL:
+			return getModel();
+		case UMLPackage.USE_CASE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.USE_CASE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.USE_CASE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.USE_CASE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.USE_CASE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.USE_CASE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.USE_CASE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.USE_CASE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.USE_CASE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.USE_CASE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.USE_CASE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.USE_CASE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.USE_CASE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.USE_CASE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.USE_CASE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.USE_CASE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.USE_CASE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.USE_CASE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.USE_CASE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.USE_CASE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.USE_CASE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.USE_CASE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.USE_CASE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.USE_CASE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.USE_CASE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.USE_CASE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.USE_CASE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.USE_CASE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.USE_CASE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.USE_CASE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.USE_CASE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.USE_CASE___SEPARATOR:
+			return separator();
+		case UMLPackage.USE_CASE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.USE_CASE___VALIDATE_MEMBERS_DISTINGUISHABLE__DIAGNOSTICCHAIN_MAP:
+			return validateMembersDistinguishable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___VALIDATE_CANNOT_IMPORT_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___VALIDATE_CANNOT_IMPORT_OWNED_MEMBERS__DIAGNOSTICCHAIN_MAP:
+			return validateCannotImportOwnedMembers((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___CREATE_ELEMENT_IMPORT__PACKAGEABLEELEMENT_VISIBILITYKIND:
+			return createElementImport((PackageableElement) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.USE_CASE___CREATE_PACKAGE_IMPORT__PACKAGE_VISIBILITYKIND:
+			return createPackageImport((org.eclipse.uml2.uml.Package) arguments.get(0), (VisibilityKind) arguments.get(1));
+		case UMLPackage.USE_CASE___GET_IMPORTED_ELEMENTS:
+			return getImportedElements();
+		case UMLPackage.USE_CASE___GET_IMPORTED_PACKAGES:
+			return getImportedPackages();
+		case UMLPackage.USE_CASE___GET_OWNED_MEMBERS:
+			return getOwnedMembers();
+		case UMLPackage.USE_CASE___EXCLUDE_COLLISIONS__ELIST:
+			return excludeCollisions((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.USE_CASE___GET_NAMES_OF_MEMBER__NAMEDELEMENT:
+			return getNamesOfMember((NamedElement) arguments.get(0));
+		case UMLPackage.USE_CASE___IMPORT_MEMBERS__ELIST:
+			return importMembers((EList<PackageableElement>) arguments.get(0));
+		case UMLPackage.USE_CASE___GET_IMPORTED_MEMBERS:
+			return getImportedMembers();
+		case UMLPackage.USE_CASE___MEMBERS_ARE_DISTINGUISHABLE:
+			return membersAreDistinguishable();
+		case UMLPackage.USE_CASE___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.USE_CASE___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.USE_CASE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.USE_CASE___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.USE_CASE___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___CREATE_ASSOCIATION__BOOLEAN_AGGREGATIONKIND_STRING_INT_INT_TYPE_BOOLEAN_AGGREGATIONKIND_STRING_INT_INT:
+			return createAssociation((Boolean) arguments.get(0), (AggregationKind) arguments.get(1), (String) arguments.get(2), (Integer) arguments.get(3), (Integer) arguments.get(4), (Type) arguments.get(5), (Boolean) arguments.get(6),
+					(AggregationKind) arguments.get(7), (String) arguments.get(8), (Integer) arguments.get(9), (Integer) arguments.get(10));
+		case UMLPackage.USE_CASE___GET_ASSOCIATIONS:
+			return getAssociations();
+		case UMLPackage.USE_CASE___CONFORMS_TO__TYPE:
+			return conformsTo((Type) arguments.get(0));
+		case UMLPackage.USE_CASE___IS_TEMPLATE:
+			return isTemplate();
+		case UMLPackage.USE_CASE___PARAMETERABLE_ELEMENTS:
+			return parameterableElements();
+		case UMLPackage.USE_CASE___VALIDATE_SPECIALIZE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateSpecializeType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___VALIDATE_MAPS_TO_GENERALIZATION_SET__DIAGNOSTICCHAIN_MAP:
+			return validateMapsToGeneralizationSet((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___VALIDATE_NON_FINAL_PARENTS__DIAGNOSTICCHAIN_MAP:
+			return validateNonFinalParents((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___VALIDATE_NO_CYCLES_IN_GENERALIZATION__DIAGNOSTICCHAIN_MAP:
+			return validateNoCyclesInGeneralization((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___GET_ALL_ATTRIBUTES:
+			return getAllAttributes();
+		case UMLPackage.USE_CASE___GET_ALL_OPERATIONS:
+			return getAllOperations();
+		case UMLPackage.USE_CASE___GET_ALL_USED_INTERFACES:
+			return getAllUsedInterfaces();
+		case UMLPackage.USE_CASE___GET_OPERATION__STRING_ELIST_ELIST:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2));
+		case UMLPackage.USE_CASE___GET_OPERATION__STRING_ELIST_ELIST_BOOLEAN:
+			return getOperation((String) arguments.get(0), (EList<String>) arguments.get(1), (EList<Type>) arguments.get(2), (Boolean) arguments.get(3));
+		case UMLPackage.USE_CASE___GET_OPERATIONS:
+			return getOperations();
+		case UMLPackage.USE_CASE___GET_USED_INTERFACES:
+			return getUsedInterfaces();
+		case UMLPackage.USE_CASE___ALL_FEATURES:
+			return allFeatures();
+		case UMLPackage.USE_CASE___ALL_PARENTS:
+			return allParents();
+		case UMLPackage.USE_CASE___GET_GENERALS:
+			return getGenerals();
+		case UMLPackage.USE_CASE___HAS_VISIBILITY_OF__NAMEDELEMENT:
+			return hasVisibilityOf((NamedElement) arguments.get(0));
+		case UMLPackage.USE_CASE___INHERIT__ELIST:
+			return inherit((EList<NamedElement>) arguments.get(0));
+		case UMLPackage.USE_CASE___INHERITABLE_MEMBERS__CLASSIFIER:
+			return inheritableMembers((Classifier) arguments.get(0));
+		case UMLPackage.USE_CASE___GET_INHERITED_MEMBERS:
+			return getInheritedMembers();
+		case UMLPackage.USE_CASE___MAY_SPECIALIZE_TYPE__CLASSIFIER:
+			return maySpecializeType((Classifier) arguments.get(0));
+		case UMLPackage.USE_CASE___PARENTS:
+			return parents();
+		case UMLPackage.USE_CASE___DIRECTLY_REALIZED_INTERFACES:
+			return directlyRealizedInterfaces();
+		case UMLPackage.USE_CASE___DIRECTLY_USED_INTERFACES:
+			return directlyUsedInterfaces();
+		case UMLPackage.USE_CASE___ALL_REALIZED_INTERFACES:
+			return allRealizedInterfaces();
+		case UMLPackage.USE_CASE___ALL_USED_INTERFACES:
+			return allUsedInterfaces();
+		case UMLPackage.USE_CASE___IS_SUBSTITUTABLE_FOR__CLASSIFIER:
+			return isSubstitutableFor((Classifier) arguments.get(0));
+		case UMLPackage.USE_CASE___ALL_ATTRIBUTES:
+			return allAttributes();
+		case UMLPackage.USE_CASE___ALL_SLOTTABLE_FEATURES:
+			return allSlottableFeatures();
+		case UMLPackage.USE_CASE___VALIDATE_CLASS_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateClassBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___GET_ALL_IMPLEMENTED_INTERFACES:
+			return getAllImplementedInterfaces();
+		case UMLPackage.USE_CASE___GET_IMPLEMENTED_INTERFACES:
+			return getImplementedInterfaces();
+		case UMLPackage.USE_CASE___VALIDATE_BINARY_ASSOCIATIONS__DIAGNOSTICCHAIN_MAP:
+			return validateBinaryAssociations((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___VALIDATE_NO_ASSOCIATION_TO_USE_CASE__DIAGNOSTICCHAIN_MAP:
+			return validateNoAssociationToUseCase((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___VALIDATE_CANNOT_INCLUDE_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateCannotIncludeSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___VALIDATE_MUST_HAVE_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateMustHaveName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.USE_CASE___ALL_INCLUDED_USE_CASES:
+			return allIncludedUseCases();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1351,9 +1191,10 @@
 	 */
 	@Override
 	public boolean isSetOwnedMembers() {
-		return super.isSetOwnedMembers() || eIsSet(UMLPackage.USE_CASE__EXTEND)
-			|| eIsSet(UMLPackage.USE_CASE__EXTENSION_POINT)
-			|| eIsSet(UMLPackage.USE_CASE__INCLUDE);
+		return super.isSetOwnedMembers()
+				|| eIsSet(UMLPackage.USE_CASE__EXTEND)
+				|| eIsSet(UMLPackage.USE_CASE__EXTENSION_POINT)
+				|| eIsSet(UMLPackage.USE_CASE__INCLUDE);
 	}
 
 	/**
@@ -1364,9 +1205,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[]{
-		UMLPackage.USE_CASE__OWNED_RULE, UMLPackage.USE_CASE__OWNED_USE_CASE,
-		UMLPackage.USE_CASE__OWNED_BEHAVIOR, UMLPackage.USE_CASE__EXTEND,
-		UMLPackage.USE_CASE__EXTENSION_POINT, UMLPackage.USE_CASE__INCLUDE};
+	protected static final int[] OWNED_MEMBER_ESUBSETS = new int[] { UMLPackage.USE_CASE__OWNED_RULE, UMLPackage.USE_CASE__OWNED_USE_CASE, UMLPackage.USE_CASE__OWNED_BEHAVIOR, UMLPackage.USE_CASE__EXTEND, UMLPackage.USE_CASE__EXTENSION_POINT,
+			UMLPackage.USE_CASE__INCLUDE };
 
 } //UseCaseImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ValuePinImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ValuePinImpl.java
index 502f08a..bdc47a8 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ValuePinImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ValuePinImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.util.InternalEList;
 
@@ -105,20 +108,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.VALUE_PIN__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.VALUE_PIN__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.VALUE_PIN__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.VALUE_PIN__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -129,11 +125,8 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.VALUE_PIN__OWNED_COMMENT,
-		UMLPackage.VALUE_PIN__NAME_EXPRESSION,
-		UMLPackage.VALUE_PIN__UPPER_BOUND, UMLPackage.VALUE_PIN__LOWER_VALUE,
-		UMLPackage.VALUE_PIN__UPPER_VALUE, UMLPackage.VALUE_PIN__VALUE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.VALUE_PIN__OWNED_COMMENT, UMLPackage.VALUE_PIN__NAME_EXPRESSION, UMLPackage.VALUE_PIN__UPPER_BOUND, UMLPackage.VALUE_PIN__LOWER_VALUE, UMLPackage.VALUE_PIN__UPPER_VALUE,
+			UMLPackage.VALUE_PIN__VALUE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -141,9 +134,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.VALUE_PIN__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VALUE_PIN__VALUE, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.VALUE_PIN__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VALUE_PIN__VALUE, true, true);
 	}
 
 	/**
@@ -152,9 +143,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.VALUE_PIN__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VALUE_PIN__VALUE, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.VALUE_PIN__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VALUE_PIN__VALUE, false, true);
 	}
 
 	/**
@@ -164,8 +153,7 @@
 	 */
 	public NotificationChain basicSetValue(ValueSpecification newValue,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newValue,
-			UMLPackage.VALUE_PIN__VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newValue, UMLPackage.VALUE_PIN__VALUE, msgs);
 		return msgs;
 	}
 
@@ -175,8 +163,7 @@
 	 * @generated
 	 */
 	public void setValue(ValueSpecification newValue) {
-		eDynamicSet(UMLPackage.VALUE_PIN__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VALUE_PIN__VALUE, newValue);
+		eDynamicSet(UMLPackage.VALUE_PIN__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VALUE_PIN__VALUE, newValue);
 	}
 
 	/**
@@ -202,8 +189,7 @@
 	 */
 	public boolean validateCompatibleType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ValuePinOperations.validateCompatibleType(this, diagnostics,
-			context);
+		return ValuePinOperations.validateCompatibleType(this, diagnostics, context);
 	}
 
 	/**
@@ -213,8 +199,7 @@
 	 */
 	public boolean validateNoIncomingEdges(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ValuePinOperations.validateNoIncomingEdges(this, diagnostics,
-			context);
+		return ValuePinOperations.validateNoIncomingEdges(this, diagnostics, context);
 	}
 
 	/**
@@ -226,36 +211,30 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.VALUE_PIN__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.VALUE_PIN__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.VALUE_PIN__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.VALUE_PIN__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.VALUE_PIN__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.VALUE_PIN__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.VALUE_PIN__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.VALUE_PIN__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.VALUE_PIN__UPPER_BOUND :
-				return basicSetUpperBound(null, msgs);
-			case UMLPackage.VALUE_PIN__LOWER_VALUE :
-				return basicSetLowerValue(null, msgs);
-			case UMLPackage.VALUE_PIN__UPPER_VALUE :
-				return basicSetUpperValue(null, msgs);
-			case UMLPackage.VALUE_PIN__VALUE :
-				return basicSetValue(null, msgs);
+		case UMLPackage.VALUE_PIN__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VALUE_PIN__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VALUE_PIN__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.VALUE_PIN__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VALUE_PIN__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.VALUE_PIN__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VALUE_PIN__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VALUE_PIN__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VALUE_PIN__UPPER_BOUND:
+			return basicSetUpperBound(null, msgs);
+		case UMLPackage.VALUE_PIN__LOWER_VALUE:
+			return basicSetLowerValue(null, msgs);
+		case UMLPackage.VALUE_PIN__UPPER_VALUE:
+			return basicSetUpperValue(null, msgs);
+		case UMLPackage.VALUE_PIN__VALUE:
+			return basicSetValue(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -268,98 +247,98 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.VALUE_PIN__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.VALUE_PIN__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.VALUE_PIN__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.VALUE_PIN__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.VALUE_PIN__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.VALUE_PIN__NAME :
-				return getName();
-			case UMLPackage.VALUE_PIN__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.VALUE_PIN__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.VALUE_PIN__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.VALUE_PIN__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.VALUE_PIN__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.VALUE_PIN__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.VALUE_PIN__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.VALUE_PIN__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.VALUE_PIN__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.VALUE_PIN__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.VALUE_PIN__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.VALUE_PIN__INCOMING :
-				return getIncomings();
-			case UMLPackage.VALUE_PIN__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.VALUE_PIN__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.VALUE_PIN__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.VALUE_PIN__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.VALUE_PIN__IN_STATE :
-				return getInStates();
-			case UMLPackage.VALUE_PIN__IS_CONTROL_TYPE :
-				return isControlType();
-			case UMLPackage.VALUE_PIN__ORDERING :
-				return getOrdering();
-			case UMLPackage.VALUE_PIN__SELECTION :
-				if (resolve)
-					return getSelection();
-				return basicGetSelection();
-			case UMLPackage.VALUE_PIN__UPPER_BOUND :
-				if (resolve)
-					return getUpperBound();
-				return basicGetUpperBound();
-			case UMLPackage.VALUE_PIN__IS_ORDERED :
-				return isOrdered();
-			case UMLPackage.VALUE_PIN__IS_UNIQUE :
-				return isUnique();
-			case UMLPackage.VALUE_PIN__LOWER :
-				return getLower();
-			case UMLPackage.VALUE_PIN__LOWER_VALUE :
-				if (resolve)
-					return getLowerValue();
-				return basicGetLowerValue();
-			case UMLPackage.VALUE_PIN__UPPER :
-				return getUpper();
-			case UMLPackage.VALUE_PIN__UPPER_VALUE :
-				if (resolve)
-					return getUpperValue();
-				return basicGetUpperValue();
-			case UMLPackage.VALUE_PIN__IS_CONTROL :
-				return isControl();
-			case UMLPackage.VALUE_PIN__VALUE :
-				if (resolve)
-					return getValue();
-				return basicGetValue();
+		case UMLPackage.VALUE_PIN__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.VALUE_PIN__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.VALUE_PIN__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.VALUE_PIN__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.VALUE_PIN__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.VALUE_PIN__NAME:
+			return getName();
+		case UMLPackage.VALUE_PIN__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.VALUE_PIN__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.VALUE_PIN__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.VALUE_PIN__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.VALUE_PIN__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.VALUE_PIN__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.VALUE_PIN__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.VALUE_PIN__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.VALUE_PIN__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.VALUE_PIN__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.VALUE_PIN__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.VALUE_PIN__INCOMING:
+			return getIncomings();
+		case UMLPackage.VALUE_PIN__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.VALUE_PIN__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.VALUE_PIN__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.VALUE_PIN__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.VALUE_PIN__IN_STATE:
+			return getInStates();
+		case UMLPackage.VALUE_PIN__IS_CONTROL_TYPE:
+			return isControlType();
+		case UMLPackage.VALUE_PIN__ORDERING:
+			return getOrdering();
+		case UMLPackage.VALUE_PIN__SELECTION:
+			if (resolve)
+				return getSelection();
+			return basicGetSelection();
+		case UMLPackage.VALUE_PIN__UPPER_BOUND:
+			if (resolve)
+				return getUpperBound();
+			return basicGetUpperBound();
+		case UMLPackage.VALUE_PIN__IS_ORDERED:
+			return isOrdered();
+		case UMLPackage.VALUE_PIN__IS_UNIQUE:
+			return isUnique();
+		case UMLPackage.VALUE_PIN__LOWER:
+			return getLower();
+		case UMLPackage.VALUE_PIN__LOWER_VALUE:
+			if (resolve)
+				return getLowerValue();
+			return basicGetLowerValue();
+		case UMLPackage.VALUE_PIN__UPPER:
+			return getUpper();
+		case UMLPackage.VALUE_PIN__UPPER_VALUE:
+			if (resolve)
+				return getUpperValue();
+			return basicGetUpperValue();
+		case UMLPackage.VALUE_PIN__IS_CONTROL:
+			return isControl();
+		case UMLPackage.VALUE_PIN__VALUE:
+			if (resolve)
+				return getValue();
+			return basicGetValue();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -373,102 +352,95 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.VALUE_PIN__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__IN_STATE :
-				getInStates().clear();
-				getInStates().addAll((Collection<? extends State>) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__IS_CONTROL_TYPE :
-				setIsControlType((Boolean) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__ORDERING :
-				setOrdering((ObjectNodeOrderingKind) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__SELECTION :
-				setSelection((Behavior) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__UPPER_BOUND :
-				setUpperBound((ValueSpecification) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__IS_ORDERED :
-				setIsOrdered((Boolean) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__IS_UNIQUE :
-				setIsUnique((Boolean) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__LOWER :
-				setLower((Integer) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__LOWER_VALUE :
-				setLowerValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__UPPER :
-				setUpper((Integer) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__UPPER_VALUE :
-				setUpperValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__IS_CONTROL :
-				setIsControl((Boolean) newValue);
-				return;
-			case UMLPackage.VALUE_PIN__VALUE :
-				setValue((ValueSpecification) newValue);
-				return;
+		case UMLPackage.VALUE_PIN__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__IN_STATE:
+			getInStates().clear();
+			getInStates().addAll((Collection<? extends State>) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__IS_CONTROL_TYPE:
+			setIsControlType((Boolean) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__ORDERING:
+			setOrdering((ObjectNodeOrderingKind) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__SELECTION:
+			setSelection((Behavior) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__UPPER_BOUND:
+			setUpperBound((ValueSpecification) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__IS_ORDERED:
+			setIsOrdered((Boolean) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__IS_UNIQUE:
+			setIsUnique((Boolean) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__LOWER:
+			setLower((Integer) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__LOWER_VALUE:
+			setLowerValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__UPPER:
+			setUpper((Integer) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__UPPER_VALUE:
+			setUpperValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__IS_CONTROL:
+			setIsControl((Boolean) newValue);
+			return;
+		case UMLPackage.VALUE_PIN__VALUE:
+			setValue((ValueSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -481,87 +453,87 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.VALUE_PIN__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.VALUE_PIN__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.VALUE_PIN__NAME :
-				unsetName();
-				return;
-			case UMLPackage.VALUE_PIN__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.VALUE_PIN__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.VALUE_PIN__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.VALUE_PIN__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.VALUE_PIN__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.VALUE_PIN__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.VALUE_PIN__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.VALUE_PIN__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.VALUE_PIN__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.VALUE_PIN__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.VALUE_PIN__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.VALUE_PIN__IN_STATE :
-				getInStates().clear();
-				return;
-			case UMLPackage.VALUE_PIN__IS_CONTROL_TYPE :
-				setIsControlType(IS_CONTROL_TYPE_EDEFAULT);
-				return;
-			case UMLPackage.VALUE_PIN__ORDERING :
-				setOrdering(ORDERING_EDEFAULT);
-				return;
-			case UMLPackage.VALUE_PIN__SELECTION :
-				setSelection((Behavior) null);
-				return;
-			case UMLPackage.VALUE_PIN__UPPER_BOUND :
-				setUpperBound((ValueSpecification) null);
-				return;
-			case UMLPackage.VALUE_PIN__IS_ORDERED :
-				setIsOrdered(IS_ORDERED_EDEFAULT);
-				return;
-			case UMLPackage.VALUE_PIN__IS_UNIQUE :
-				setIsUnique(IS_UNIQUE_EDEFAULT);
-				return;
-			case UMLPackage.VALUE_PIN__LOWER :
-				setLower(LOWER_EDEFAULT);
-				return;
-			case UMLPackage.VALUE_PIN__LOWER_VALUE :
-				setLowerValue((ValueSpecification) null);
-				return;
-			case UMLPackage.VALUE_PIN__UPPER :
-				setUpper(UPPER_EDEFAULT);
-				return;
-			case UMLPackage.VALUE_PIN__UPPER_VALUE :
-				setUpperValue((ValueSpecification) null);
-				return;
-			case UMLPackage.VALUE_PIN__IS_CONTROL :
-				setIsControl(IS_CONTROL_EDEFAULT);
-				return;
-			case UMLPackage.VALUE_PIN__VALUE :
-				setValue((ValueSpecification) null);
-				return;
+		case UMLPackage.VALUE_PIN__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.VALUE_PIN__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.VALUE_PIN__NAME:
+			unsetName();
+			return;
+		case UMLPackage.VALUE_PIN__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.VALUE_PIN__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.VALUE_PIN__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.VALUE_PIN__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.VALUE_PIN__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.VALUE_PIN__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.VALUE_PIN__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.VALUE_PIN__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.VALUE_PIN__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.VALUE_PIN__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.VALUE_PIN__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.VALUE_PIN__IN_STATE:
+			getInStates().clear();
+			return;
+		case UMLPackage.VALUE_PIN__IS_CONTROL_TYPE:
+			setIsControlType(IS_CONTROL_TYPE_EDEFAULT);
+			return;
+		case UMLPackage.VALUE_PIN__ORDERING:
+			setOrdering(ORDERING_EDEFAULT);
+			return;
+		case UMLPackage.VALUE_PIN__SELECTION:
+			setSelection((Behavior) null);
+			return;
+		case UMLPackage.VALUE_PIN__UPPER_BOUND:
+			setUpperBound((ValueSpecification) null);
+			return;
+		case UMLPackage.VALUE_PIN__IS_ORDERED:
+			setIsOrdered(IS_ORDERED_EDEFAULT);
+			return;
+		case UMLPackage.VALUE_PIN__IS_UNIQUE:
+			setIsUnique(IS_UNIQUE_EDEFAULT);
+			return;
+		case UMLPackage.VALUE_PIN__LOWER:
+			setLower(LOWER_EDEFAULT);
+			return;
+		case UMLPackage.VALUE_PIN__LOWER_VALUE:
+			setLowerValue((ValueSpecification) null);
+			return;
+		case UMLPackage.VALUE_PIN__UPPER:
+			setUpper(UPPER_EDEFAULT);
+			return;
+		case UMLPackage.VALUE_PIN__UPPER_VALUE:
+			setUpperValue((ValueSpecification) null);
+			return;
+		case UMLPackage.VALUE_PIN__IS_CONTROL:
+			setIsControl(IS_CONTROL_EDEFAULT);
+			return;
+		case UMLPackage.VALUE_PIN__VALUE:
+			setValue((ValueSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -574,78 +546,76 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.VALUE_PIN__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.VALUE_PIN__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.VALUE_PIN__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.VALUE_PIN__OWNER :
-				return isSetOwner();
-			case UMLPackage.VALUE_PIN__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.VALUE_PIN__NAME :
-				return isSetName();
-			case UMLPackage.VALUE_PIN__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.VALUE_PIN__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.VALUE_PIN__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.VALUE_PIN__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.VALUE_PIN__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.VALUE_PIN__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.VALUE_PIN__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.VALUE_PIN__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.VALUE_PIN__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.VALUE_PIN__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.VALUE_PIN__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.VALUE_PIN__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.VALUE_PIN__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.VALUE_PIN__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.VALUE_PIN__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.VALUE_PIN__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.VALUE_PIN__IN_STATE :
-				return !getInStates().isEmpty();
-			case UMLPackage.VALUE_PIN__IS_CONTROL_TYPE :
-				return isControlType() != IS_CONTROL_TYPE_EDEFAULT;
-			case UMLPackage.VALUE_PIN__ORDERING :
-				return getOrdering() != ORDERING_EDEFAULT;
-			case UMLPackage.VALUE_PIN__SELECTION :
-				return basicGetSelection() != null;
-			case UMLPackage.VALUE_PIN__UPPER_BOUND :
-				return basicGetUpperBound() != null;
-			case UMLPackage.VALUE_PIN__IS_ORDERED :
-				return isOrdered() != IS_ORDERED_EDEFAULT;
-			case UMLPackage.VALUE_PIN__IS_UNIQUE :
-				return isUnique() != IS_UNIQUE_EDEFAULT;
-			case UMLPackage.VALUE_PIN__LOWER :
-				return getLower() != LOWER_EDEFAULT;
-			case UMLPackage.VALUE_PIN__LOWER_VALUE :
-				return basicGetLowerValue() != null;
-			case UMLPackage.VALUE_PIN__UPPER :
-				return getUpper() != UPPER_EDEFAULT;
-			case UMLPackage.VALUE_PIN__UPPER_VALUE :
-				return basicGetUpperValue() != null;
-			case UMLPackage.VALUE_PIN__IS_CONTROL :
-				return isControl() != IS_CONTROL_EDEFAULT;
-			case UMLPackage.VALUE_PIN__VALUE :
-				return basicGetValue() != null;
+		case UMLPackage.VALUE_PIN__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.VALUE_PIN__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.VALUE_PIN__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.VALUE_PIN__OWNER:
+			return isSetOwner();
+		case UMLPackage.VALUE_PIN__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.VALUE_PIN__NAME:
+			return isSetName();
+		case UMLPackage.VALUE_PIN__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.VALUE_PIN__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.VALUE_PIN__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.VALUE_PIN__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.VALUE_PIN__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.VALUE_PIN__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.VALUE_PIN__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.VALUE_PIN__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.VALUE_PIN__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.VALUE_PIN__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.VALUE_PIN__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.VALUE_PIN__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.VALUE_PIN__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.VALUE_PIN__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.VALUE_PIN__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.VALUE_PIN__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.VALUE_PIN__IN_STATE:
+			return !getInStates().isEmpty();
+		case UMLPackage.VALUE_PIN__IS_CONTROL_TYPE:
+			return isControlType() != IS_CONTROL_TYPE_EDEFAULT;
+		case UMLPackage.VALUE_PIN__ORDERING:
+			return getOrdering() != ORDERING_EDEFAULT;
+		case UMLPackage.VALUE_PIN__SELECTION:
+			return basicGetSelection() != null;
+		case UMLPackage.VALUE_PIN__UPPER_BOUND:
+			return basicGetUpperBound() != null;
+		case UMLPackage.VALUE_PIN__IS_ORDERED:
+			return isOrdered() != IS_ORDERED_EDEFAULT;
+		case UMLPackage.VALUE_PIN__IS_UNIQUE:
+			return isUnique() != IS_UNIQUE_EDEFAULT;
+		case UMLPackage.VALUE_PIN__LOWER:
+			return getLower() != LOWER_EDEFAULT;
+		case UMLPackage.VALUE_PIN__LOWER_VALUE:
+			return basicGetLowerValue() != null;
+		case UMLPackage.VALUE_PIN__UPPER:
+			return getUpper() != UPPER_EDEFAULT;
+		case UMLPackage.VALUE_PIN__UPPER_VALUE:
+			return basicGetUpperValue() != null;
+		case UMLPackage.VALUE_PIN__IS_CONTROL:
+			return isControl() != IS_CONTROL_EDEFAULT;
+		case UMLPackage.VALUE_PIN__VALUE:
+			return basicGetValue() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -660,220 +630,172 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.VALUE_PIN___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.VALUE_PIN___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.VALUE_PIN___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_PIN___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.VALUE_PIN___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.VALUE_PIN___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.VALUE_PIN___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.VALUE_PIN___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.VALUE_PIN___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.VALUE_PIN___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.VALUE_PIN___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VALUE_PIN___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_PIN___GET_MODEL :
-				return getModel();
-			case UMLPackage.VALUE_PIN___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.VALUE_PIN___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.VALUE_PIN___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.VALUE_PIN___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.VALUE_PIN___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.VALUE_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.VALUE_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.VALUE_PIN___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_PIN___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.VALUE_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.VALUE_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.VALUE_PIN___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VALUE_PIN___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.VALUE_PIN___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VALUE_PIN___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_PIN___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_PIN___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_PIN___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.VALUE_PIN___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.VALUE_PIN___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_PIN___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.VALUE_PIN___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.VALUE_PIN___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.VALUE_PIN___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.VALUE_PIN___GET_LABEL :
-				return getLabel();
-			case UMLPackage.VALUE_PIN___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.VALUE_PIN___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.VALUE_PIN___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.VALUE_PIN___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.VALUE_PIN___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.VALUE_PIN___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.VALUE_PIN___SEPARATOR :
-				return separator();
-			case UMLPackage.VALUE_PIN___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.VALUE_PIN___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.VALUE_PIN___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.VALUE_PIN___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.VALUE_PIN___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP :
-				return validateInputOutputParameter(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP :
-				return validateSelectionBehavior(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateObjectFlowEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-				return validateUpperGeLower((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-				return validateLowerGe0((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationNoSideEffects(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationConstant(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-				return validateLowerIsInteger(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-				return validateUpperIsUnlimitedNatural(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___SET_LOWER__INT :
-				setLower((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.VALUE_PIN___SET_UPPER__INT :
-				setUpper((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.VALUE_PIN___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-				return compatibleWith((MultiplicityElement) arguments.get(0));
-			case UMLPackage.VALUE_PIN___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-				return includesMultiplicity(
-					(MultiplicityElement) arguments.get(0));
-			case UMLPackage.VALUE_PIN___IS__INT_INT :
-				return is((Integer) arguments.get(0),
-					(Integer) arguments.get(1));
-			case UMLPackage.VALUE_PIN___IS_MULTIVALUED :
-				return isMultivalued();
-			case UMLPackage.VALUE_PIN___GET_LOWER :
-				return getLower();
-			case UMLPackage.VALUE_PIN___LOWER_BOUND :
-				return lowerBound();
-			case UMLPackage.VALUE_PIN___GET_UPPER :
-				return getUpper();
-			case UMLPackage.VALUE_PIN___UPPER_BOUND :
-				return upperBound();
-			case UMLPackage.VALUE_PIN___VALIDATE_CONTROL_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateControlPins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_NOT_UNIQUE__DIAGNOSTICCHAIN_MAP :
-				return validateNotUnique((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_OUTGOING_EDGES_STRUCTURED_ONLY__DIAGNOSTICCHAIN_MAP :
-				return validateOutgoingEdgesStructuredOnly(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_NO_INCOMING_EDGES__DIAGNOSTICCHAIN_MAP :
-				return validateNoIncomingEdges(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_PIN___VALIDATE_COMPATIBLE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateCompatibleType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.VALUE_PIN___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.VALUE_PIN___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_PIN___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.VALUE_PIN___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.VALUE_PIN___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.VALUE_PIN___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.VALUE_PIN___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.VALUE_PIN___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.VALUE_PIN___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.VALUE_PIN___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VALUE_PIN___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_PIN___GET_MODEL:
+			return getModel();
+		case UMLPackage.VALUE_PIN___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.VALUE_PIN___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.VALUE_PIN___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.VALUE_PIN___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.VALUE_PIN___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.VALUE_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.VALUE_PIN___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.VALUE_PIN___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_PIN___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.VALUE_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.VALUE_PIN___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.VALUE_PIN___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VALUE_PIN___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.VALUE_PIN___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VALUE_PIN___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_PIN___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_PIN___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_PIN___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.VALUE_PIN___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.VALUE_PIN___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_PIN___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.VALUE_PIN___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.VALUE_PIN___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.VALUE_PIN___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.VALUE_PIN___GET_LABEL:
+			return getLabel();
+		case UMLPackage.VALUE_PIN___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.VALUE_PIN___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.VALUE_PIN___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.VALUE_PIN___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.VALUE_PIN___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.VALUE_PIN___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.VALUE_PIN___SEPARATOR:
+			return separator();
+		case UMLPackage.VALUE_PIN___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.VALUE_PIN___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.VALUE_PIN___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.VALUE_PIN___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.VALUE_PIN___VALIDATE_INPUT_OUTPUT_PARAMETER__DIAGNOSTICCHAIN_MAP:
+			return validateInputOutputParameter((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_SELECTION_BEHAVIOR__DIAGNOSTICCHAIN_MAP:
+			return validateSelectionBehavior((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_OBJECT_FLOW_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateObjectFlowEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+			return validateUpperGeLower((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+			return validateLowerGe0((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationConstant((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+			return validateLowerIsInteger((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+			return validateUpperIsUnlimitedNatural((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___SET_LOWER__INT:
+			setLower((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.VALUE_PIN___SET_UPPER__INT:
+			setUpper((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.VALUE_PIN___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+			return compatibleWith((MultiplicityElement) arguments.get(0));
+		case UMLPackage.VALUE_PIN___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+			return includesMultiplicity((MultiplicityElement) arguments.get(0));
+		case UMLPackage.VALUE_PIN___IS__INT_INT:
+			return is((Integer) arguments.get(0), (Integer) arguments.get(1));
+		case UMLPackage.VALUE_PIN___IS_MULTIVALUED:
+			return isMultivalued();
+		case UMLPackage.VALUE_PIN___GET_LOWER:
+			return getLower();
+		case UMLPackage.VALUE_PIN___LOWER_BOUND:
+			return lowerBound();
+		case UMLPackage.VALUE_PIN___GET_UPPER:
+			return getUpper();
+		case UMLPackage.VALUE_PIN___UPPER_BOUND:
+			return upperBound();
+		case UMLPackage.VALUE_PIN___VALIDATE_CONTROL_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateControlPins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_NOT_UNIQUE__DIAGNOSTICCHAIN_MAP:
+			return validateNotUnique((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_OUTGOING_EDGES_STRUCTURED_ONLY__DIAGNOSTICCHAIN_MAP:
+			return validateOutgoingEdgesStructuredOnly((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_NO_INCOMING_EDGES__DIAGNOSTICCHAIN_MAP:
+			return validateNoIncomingEdges((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_PIN___VALIDATE_COMPATIBLE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateCompatibleType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -886,7 +808,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.VALUE_PIN__VALUE);
+				|| eIsSet(UMLPackage.VALUE_PIN__VALUE);
 	}
 
 } //ValuePinImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ValueSpecificationActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ValueSpecificationActionImpl.java
index 43071d1..34b9b77 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ValueSpecificationActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ValueSpecificationActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -108,19 +111,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this,
-						UMLPackage.VALUE_SPECIFICATION_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.VALUE_SPECIFICATION_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.VALUE_SPECIFICATION_ACTION__OUTPUT, OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.VALUE_SPECIFICATION_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -129,10 +126,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VALUE_SPECIFICATION_ACTION__VALUE, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VALUE_SPECIFICATION_ACTION__VALUE, true, true);
 	}
 
 	/**
@@ -141,10 +135,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VALUE_SPECIFICATION_ACTION__VALUE, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VALUE_SPECIFICATION_ACTION__VALUE, false, true);
 	}
 
 	/**
@@ -154,8 +145,7 @@
 	 */
 	public NotificationChain basicSetValue(ValueSpecification newValue,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newValue,
-			UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newValue, UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE, msgs);
 		return msgs;
 	}
 
@@ -165,10 +155,7 @@
 	 * @generated
 	 */
 	public void setValue(ValueSpecification newValue) {
-		eDynamicSet(
-			UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VALUE_SPECIFICATION_ACTION__VALUE, newValue);
+		eDynamicSet(UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VALUE_SPECIFICATION_ACTION__VALUE, newValue);
 	}
 
 	/**
@@ -193,10 +180,7 @@
 	 * @generated
 	 */
 	public OutputPin getResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VALUE_SPECIFICATION_ACTION__RESULT, true, true);
+		return (OutputPin) eDynamicGet(UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VALUE_SPECIFICATION_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -205,11 +189,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VALUE_SPECIFICATION_ACTION__RESULT, false,
-			true);
+		return (OutputPin) eDynamicGet(UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VALUE_SPECIFICATION_ACTION__RESULT, false, true);
 	}
 
 	/**
@@ -219,8 +199,7 @@
 	 */
 	public NotificationChain basicSetResult(OutputPin newResult,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newResult,
-			UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newResult, UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT, msgs);
 		return msgs;
 	}
 
@@ -230,10 +209,7 @@
 	 * @generated
 	 */
 	public void setResult(OutputPin newResult) {
-		eDynamicSet(
-			UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VALUE_SPECIFICATION_ACTION__RESULT, newResult);
+		eDynamicSet(UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VALUE_SPECIFICATION_ACTION__RESULT, newResult);
 	}
 
 	/**
@@ -242,8 +218,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setResult(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -259,8 +234,7 @@
 	 */
 	public boolean validateCompatibleType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ValueSpecificationActionOperations.validateCompatibleType(this,
-			diagnostics, context);
+		return ValueSpecificationActionOperations.validateCompatibleType(this, diagnostics, context);
 	}
 
 	/**
@@ -270,8 +244,7 @@
 	 */
 	public boolean validateMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return ValueSpecificationActionOperations.validateMultiplicity(this,
-			diagnostics, context);
+		return ValueSpecificationActionOperations.validateMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -283,41 +256,32 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT :
-				return basicSetResult(null, msgs);
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE :
-				return basicSetValue(null, msgs);
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT:
+			return basicSetResult(null, msgs);
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE:
+			return basicSetValue(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -330,82 +294,82 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME :
-				return getName();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE :
-				if (resolve)
-					return getValue();
-				return basicGetValue();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME:
+			return getName();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE:
+			if (resolve)
+				return getValue();
+			return basicGetValue();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -419,83 +383,73 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE :
-				setValue((ValueSpecification) newValue);
-				return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE:
+			setValue((ValueSpecification) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -508,63 +462,63 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE :
-				setValue((ValueSpecification) null);
-				return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE:
+			setValue((ValueSpecification) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -577,68 +531,66 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT :
-				return basicGetResult() != null;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE :
-				return basicGetValue() != null;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT:
+			return basicGetResult() != null;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE:
+			return basicGetValue() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -653,159 +605,134 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_COMPATIBLE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateCompatibleType(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION_ACTION___VALIDATE_COMPATIBLE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateCompatibleType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -818,8 +745,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -832,21 +758,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this,
-						UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_ELEMENT,
-			OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -857,15 +775,9 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_COMMENT,
-		UMLPackage.VALUE_SPECIFICATION_ACTION__NAME_EXPRESSION,
-		UMLPackage.VALUE_SPECIFICATION_ACTION__HANDLER,
-		UMLPackage.VALUE_SPECIFICATION_ACTION__INPUT,
-		UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_POSTCONDITION,
-		UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_PRECONDITION,
-		UMLPackage.VALUE_SPECIFICATION_ACTION__OUTPUT,
-		UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.VALUE_SPECIFICATION_ACTION__OWNED_COMMENT, UMLPackage.VALUE_SPECIFICATION_ACTION__NAME_EXPRESSION, UMLPackage.VALUE_SPECIFICATION_ACTION__HANDLER,
+			UMLPackage.VALUE_SPECIFICATION_ACTION__INPUT, UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_POSTCONDITION, UMLPackage.VALUE_SPECIFICATION_ACTION__LOCAL_PRECONDITION, UMLPackage.VALUE_SPECIFICATION_ACTION__OUTPUT,
+			UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -875,7 +787,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT);
+				|| eIsSet(UMLPackage.VALUE_SPECIFICATION_ACTION__RESULT);
 	}
 
 	/**
@@ -886,7 +798,7 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE);
+				|| eIsSet(UMLPackage.VALUE_SPECIFICATION_ACTION__VALUE);
 	}
 
 } //ValueSpecificationActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ValueSpecificationImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ValueSpecificationImpl.java
index 9f52748..bf95694 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ValueSpecificationImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/ValueSpecificationImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -16,10 +16,16 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.NamedElement;
 import org.eclipse.uml2.uml.Namespace;
@@ -77,9 +83,7 @@
 	 * @generated
 	 */
 	public Type getType() {
-		return (Type) eDynamicGet(
-			UMLPackage.VALUE_SPECIFICATION__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TYPED_ELEMENT__TYPE, true, true);
+		return (Type) eDynamicGet(UMLPackage.VALUE_SPECIFICATION__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TYPED_ELEMENT__TYPE, true, true);
 	}
 
 	/**
@@ -88,9 +92,7 @@
 	 * @generated
 	 */
 	public Type basicGetType() {
-		return (Type) eDynamicGet(
-			UMLPackage.VALUE_SPECIFICATION__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TYPED_ELEMENT__TYPE, false, true);
+		return (Type) eDynamicGet(UMLPackage.VALUE_SPECIFICATION__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TYPED_ELEMENT__TYPE, false, true);
 	}
 
 	/**
@@ -99,9 +101,7 @@
 	 * @generated
 	 */
 	public void setType(Type newType) {
-		eDynamicSet(
-			UMLPackage.VALUE_SPECIFICATION__TYPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.TYPED_ELEMENT__TYPE, newType);
+		eDynamicSet(UMLPackage.VALUE_SPECIFICATION__TYPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.TYPED_ELEMENT__TYPE, newType);
 	}
 
 	/**
@@ -185,44 +185,44 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.VALUE_SPECIFICATION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.VALUE_SPECIFICATION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.VALUE_SPECIFICATION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.VALUE_SPECIFICATION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.VALUE_SPECIFICATION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.VALUE_SPECIFICATION__NAME :
-				return getName();
-			case UMLPackage.VALUE_SPECIFICATION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.VALUE_SPECIFICATION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.VALUE_SPECIFICATION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.VALUE_SPECIFICATION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.VALUE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.VALUE_SPECIFICATION__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.VALUE_SPECIFICATION__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
+		case UMLPackage.VALUE_SPECIFICATION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.VALUE_SPECIFICATION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.VALUE_SPECIFICATION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.VALUE_SPECIFICATION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.VALUE_SPECIFICATION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.VALUE_SPECIFICATION__NAME:
+			return getName();
+		case UMLPackage.VALUE_SPECIFICATION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.VALUE_SPECIFICATION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.VALUE_SPECIFICATION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.VALUE_SPECIFICATION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.VALUE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.VALUE_SPECIFICATION__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.VALUE_SPECIFICATION__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -236,34 +236,32 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.VALUE_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION__TYPE :
-				setType((Type) newValue);
-				return;
+		case UMLPackage.VALUE_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION__TYPE:
+			setType((Type) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -276,30 +274,30 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.VALUE_SPECIFICATION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.VALUE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.VALUE_SPECIFICATION__TYPE :
-				setType((Type) null);
-				return;
+		case UMLPackage.VALUE_SPECIFICATION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.VALUE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.VALUE_SPECIFICATION__TYPE:
+			setType((Type) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -312,34 +310,32 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.VALUE_SPECIFICATION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.VALUE_SPECIFICATION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.VALUE_SPECIFICATION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.VALUE_SPECIFICATION__OWNER :
-				return isSetOwner();
-			case UMLPackage.VALUE_SPECIFICATION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.VALUE_SPECIFICATION__NAME :
-				return isSetName();
-			case UMLPackage.VALUE_SPECIFICATION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.VALUE_SPECIFICATION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.VALUE_SPECIFICATION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.VALUE_SPECIFICATION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.VALUE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.VALUE_SPECIFICATION__TEMPLATE_PARAMETER :
-				return basicGetTemplateParameter() != null;
-			case UMLPackage.VALUE_SPECIFICATION__TYPE :
-				return basicGetType() != null;
+		case UMLPackage.VALUE_SPECIFICATION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.VALUE_SPECIFICATION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.VALUE_SPECIFICATION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.VALUE_SPECIFICATION__OWNER:
+			return isSetOwner();
+		case UMLPackage.VALUE_SPECIFICATION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.VALUE_SPECIFICATION__NAME:
+			return isSetName();
+		case UMLPackage.VALUE_SPECIFICATION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.VALUE_SPECIFICATION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.VALUE_SPECIFICATION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.VALUE_SPECIFICATION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.VALUE_SPECIFICATION__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.VALUE_SPECIFICATION__TEMPLATE_PARAMETER:
+			return basicGetTemplateParameter() != null;
+		case UMLPackage.VALUE_SPECIFICATION__TYPE:
+			return basicGetType() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -354,10 +350,10 @@
 			Class<?> baseClass) {
 		if (baseClass == TypedElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.VALUE_SPECIFICATION__TYPE :
-					return UMLPackage.TYPED_ELEMENT__TYPE;
-				default :
-					return -1;
+			case UMLPackage.VALUE_SPECIFICATION__TYPE:
+				return UMLPackage.TYPED_ELEMENT__TYPE;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -373,10 +369,10 @@
 			Class<?> baseClass) {
 		if (baseClass == TypedElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.TYPED_ELEMENT__TYPE :
-					return UMLPackage.VALUE_SPECIFICATION__TYPE;
-				default :
-					return -1;
+			case UMLPackage.TYPED_ELEMENT__TYPE:
+				return UMLPackage.VALUE_SPECIFICATION__TYPE;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -392,148 +388,130 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.VALUE_SPECIFICATION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.VALUE_SPECIFICATION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.VALUE_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.VALUE_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.VALUE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___GET_MODEL :
-				return getModel();
-			case UMLPackage.VALUE_SPECIFICATION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.VALUE_SPECIFICATION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.VALUE_SPECIFICATION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.VALUE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.VALUE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.VALUE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.VALUE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.VALUE_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.VALUE_SPECIFICATION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.VALUE_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.VALUE_SPECIFICATION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.VALUE_SPECIFICATION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.VALUE_SPECIFICATION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.VALUE_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.VALUE_SPECIFICATION___SEPARATOR :
-				return separator();
-			case UMLPackage.VALUE_SPECIFICATION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.VALUE_SPECIFICATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.VALUE_SPECIFICATION___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.VALUE_SPECIFICATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateNamespaceNeedsVisibility(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VALUE_SPECIFICATION___BOOLEAN_VALUE :
-				return booleanValue();
-			case UMLPackage.VALUE_SPECIFICATION___INTEGER_VALUE :
-				return integerValue();
-			case UMLPackage.VALUE_SPECIFICATION___IS_COMPUTABLE :
-				return isComputable();
-			case UMLPackage.VALUE_SPECIFICATION___IS_NULL :
-				return isNull();
-			case UMLPackage.VALUE_SPECIFICATION___REAL_VALUE :
-				return realValue();
-			case UMLPackage.VALUE_SPECIFICATION___STRING_VALUE :
-				return stringValue();
-			case UMLPackage.VALUE_SPECIFICATION___UNLIMITED_VALUE :
-				return unlimitedValue();
+		case UMLPackage.VALUE_SPECIFICATION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.VALUE_SPECIFICATION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.VALUE_SPECIFICATION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.VALUE_SPECIFICATION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.VALUE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___GET_MODEL:
+			return getModel();
+		case UMLPackage.VALUE_SPECIFICATION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.VALUE_SPECIFICATION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.VALUE_SPECIFICATION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.VALUE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.VALUE_SPECIFICATION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.VALUE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.VALUE_SPECIFICATION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.VALUE_SPECIFICATION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.VALUE_SPECIFICATION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.VALUE_SPECIFICATION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.VALUE_SPECIFICATION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.VALUE_SPECIFICATION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.VALUE_SPECIFICATION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.VALUE_SPECIFICATION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.VALUE_SPECIFICATION___SEPARATOR:
+			return separator();
+		case UMLPackage.VALUE_SPECIFICATION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.VALUE_SPECIFICATION___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.VALUE_SPECIFICATION___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.VALUE_SPECIFICATION___VALIDATE_NAMESPACE_NEEDS_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateNamespaceNeedsVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VALUE_SPECIFICATION___BOOLEAN_VALUE:
+			return booleanValue();
+		case UMLPackage.VALUE_SPECIFICATION___INTEGER_VALUE:
+			return integerValue();
+		case UMLPackage.VALUE_SPECIFICATION___IS_COMPUTABLE:
+			return isComputable();
+		case UMLPackage.VALUE_SPECIFICATION___IS_NULL:
+			return isNull();
+		case UMLPackage.VALUE_SPECIFICATION___REAL_VALUE:
+			return realValue();
+		case UMLPackage.VALUE_SPECIFICATION___STRING_VALUE:
+			return stringValue();
+		case UMLPackage.VALUE_SPECIFICATION___UNLIMITED_VALUE:
+			return unlimitedValue();
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/VariableActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/VariableActionImpl.java
index a2b69e7..5e09244 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/VariableActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/VariableActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,11 +17,17 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
+
 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;
+
+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;
@@ -85,9 +91,7 @@
 	 * @generated
 	 */
 	public Variable getVariable() {
-		return (Variable) eDynamicGet(
-			UMLPackage.VARIABLE_ACTION__VARIABLE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VARIABLE_ACTION__VARIABLE, true, true);
+		return (Variable) eDynamicGet(UMLPackage.VARIABLE_ACTION__VARIABLE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VARIABLE_ACTION__VARIABLE, true, true);
 	}
 
 	/**
@@ -96,9 +100,7 @@
 	 * @generated
 	 */
 	public Variable basicGetVariable() {
-		return (Variable) eDynamicGet(
-			UMLPackage.VARIABLE_ACTION__VARIABLE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VARIABLE_ACTION__VARIABLE, false, true);
+		return (Variable) eDynamicGet(UMLPackage.VARIABLE_ACTION__VARIABLE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VARIABLE_ACTION__VARIABLE, false, true);
 	}
 
 	/**
@@ -107,9 +109,7 @@
 	 * @generated
 	 */
 	public void setVariable(Variable newVariable) {
-		eDynamicSet(
-			UMLPackage.VARIABLE_ACTION__VARIABLE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VARIABLE_ACTION__VARIABLE, newVariable);
+		eDynamicSet(UMLPackage.VARIABLE_ACTION__VARIABLE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VARIABLE_ACTION__VARIABLE, newVariable);
 	}
 
 	/**
@@ -119,8 +119,7 @@
 	 */
 	public boolean validateScopeOfVariable(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return VariableActionOperations.validateScopeOfVariable(this,
-			diagnostics, context);
+		return VariableActionOperations.validateScopeOfVariable(this, diagnostics, context);
 	}
 
 	/**
@@ -131,78 +130,78 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.VARIABLE_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.VARIABLE_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.VARIABLE_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.VARIABLE_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.VARIABLE_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.VARIABLE_ACTION__NAME :
-				return getName();
-			case UMLPackage.VARIABLE_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.VARIABLE_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.VARIABLE_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.VARIABLE_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.VARIABLE_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.VARIABLE_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.VARIABLE_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.VARIABLE_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.VARIABLE_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.VARIABLE_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.VARIABLE_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.VARIABLE_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.VARIABLE_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.VARIABLE_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.VARIABLE_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.VARIABLE_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.VARIABLE_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.VARIABLE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.VARIABLE_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.VARIABLE_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.VARIABLE_ACTION__VARIABLE :
-				if (resolve)
-					return getVariable();
-				return basicGetVariable();
+		case UMLPackage.VARIABLE_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.VARIABLE_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.VARIABLE_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.VARIABLE_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.VARIABLE_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.VARIABLE_ACTION__NAME:
+			return getName();
+		case UMLPackage.VARIABLE_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.VARIABLE_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.VARIABLE_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.VARIABLE_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.VARIABLE_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.VARIABLE_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.VARIABLE_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.VARIABLE_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.VARIABLE_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.VARIABLE_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.VARIABLE_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.VARIABLE_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.VARIABLE_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.VARIABLE_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.VARIABLE_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.VARIABLE_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.VARIABLE_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.VARIABLE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.VARIABLE_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.VARIABLE_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.VARIABLE_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.VARIABLE_ACTION__VARIABLE:
+			if (resolve)
+				return getVariable();
+			return basicGetVariable();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -216,80 +215,70 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.VARIABLE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.VARIABLE_ACTION__VARIABLE :
-				setVariable((Variable) newValue);
-				return;
+		case UMLPackage.VARIABLE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.VARIABLE_ACTION__VARIABLE:
+			setVariable((Variable) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -302,60 +291,60 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.VARIABLE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.VARIABLE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.VARIABLE_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.VARIABLE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.VARIABLE_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.VARIABLE_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.VARIABLE_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.VARIABLE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.VARIABLE_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.VARIABLE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.VARIABLE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.VARIABLE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.VARIABLE_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.VARIABLE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.VARIABLE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.VARIABLE_ACTION__VARIABLE :
-				setVariable((Variable) null);
-				return;
+		case UMLPackage.VARIABLE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.VARIABLE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.VARIABLE_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.VARIABLE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.VARIABLE_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.VARIABLE_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.VARIABLE_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.VARIABLE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.VARIABLE_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.VARIABLE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.VARIABLE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.VARIABLE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.VARIABLE_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.VARIABLE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.VARIABLE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.VARIABLE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.VARIABLE_ACTION__VARIABLE:
+			setVariable((Variable) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -368,66 +357,64 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.VARIABLE_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.VARIABLE_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.VARIABLE_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.VARIABLE_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.VARIABLE_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.VARIABLE_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.VARIABLE_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.VARIABLE_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.VARIABLE_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.VARIABLE_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.VARIABLE_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.VARIABLE_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.VARIABLE_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.VARIABLE_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.VARIABLE_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.VARIABLE_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.VARIABLE_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.VARIABLE_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.VARIABLE_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.VARIABLE_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.VARIABLE_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.VARIABLE_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.VARIABLE_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.VARIABLE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.VARIABLE_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.VARIABLE_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.VARIABLE_ACTION__VARIABLE :
-				return basicGetVariable() != null;
+		case UMLPackage.VARIABLE_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.VARIABLE_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.VARIABLE_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.VARIABLE_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.VARIABLE_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.VARIABLE_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.VARIABLE_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.VARIABLE_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.VARIABLE_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.VARIABLE_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.VARIABLE_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.VARIABLE_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.VARIABLE_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.VARIABLE_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.VARIABLE_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.VARIABLE_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.VARIABLE_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.VARIABLE_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.VARIABLE_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.VARIABLE_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.VARIABLE_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.VARIABLE_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.VARIABLE_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.VARIABLE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.VARIABLE_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.VARIABLE_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.VARIABLE_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.VARIABLE_ACTION__VARIABLE:
+			return basicGetVariable() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -442,156 +429,132 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.VARIABLE_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.VARIABLE_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.VARIABLE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.VARIABLE_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.VARIABLE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VARIABLE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.VARIABLE_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.VARIABLE_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.VARIABLE_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.VARIABLE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.VARIABLE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.VARIABLE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.VARIABLE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VARIABLE_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VARIABLE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.VARIABLE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.VARIABLE_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.VARIABLE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.VARIABLE_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.VARIABLE_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.VARIABLE_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.VARIABLE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.VARIABLE_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.VARIABLE_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.VARIABLE_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.VARIABLE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.VARIABLE_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.VARIABLE_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.VARIABLE_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.VARIABLE_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.VARIABLE_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.VARIABLE_ACTION___VALIDATE_SCOPE_OF_VARIABLE__DIAGNOSTICCHAIN_MAP :
-				return validateScopeOfVariable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.VARIABLE_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.VARIABLE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.VARIABLE_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.VARIABLE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VARIABLE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.VARIABLE_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.VARIABLE_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.VARIABLE_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.VARIABLE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.VARIABLE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.VARIABLE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.VARIABLE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VARIABLE_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VARIABLE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.VARIABLE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.VARIABLE_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.VARIABLE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.VARIABLE_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.VARIABLE_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.VARIABLE_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.VARIABLE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.VARIABLE_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.VARIABLE_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.VARIABLE_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.VARIABLE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.VARIABLE_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.VARIABLE_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.VARIABLE_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.VARIABLE_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.VARIABLE_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.VARIABLE_ACTION___VALIDATE_SCOPE_OF_VARIABLE__DIAGNOSTICCHAIN_MAP:
+			return validateScopeOfVariable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/VariableImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/VariableImpl.java
index 614cf7c..43c4142 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/VariableImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/VariableImpl.java
@@ -1,14 +1,14 @@
 /*
- * Copyright (c) 2005, 2017 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, Embarcadero Technologies, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 204200
- *   Kenn Hussey - 286329, 323181, 519572
+ *   Kenn Hussey - 286329, 323181, 519572, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -18,6 +18,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -28,8 +29,11 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.common.util.CacheAdapter;
@@ -152,19 +156,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<Element> ownedElements = (EList<Element>) cache.get(eResource,
-				this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT);
+			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>(
-						Element.class, this, UMLPackage.VARIABLE__OWNED_ELEMENT,
-						OWNED_ELEMENT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ELEMENT__OWNED_ELEMENT, ownedElements = new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.VARIABLE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS));
 			}
 			return ownedElements;
 		}
-		return new DerivedUnionEObjectEList<Element>(Element.class, this,
-			UMLPackage.VARIABLE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
+		return new DerivedUnionEObjectEList<Element>(Element.class, this, UMLPackage.VARIABLE__OWNED_ELEMENT, OWNED_ELEMENT_ESUBSETS);
 	}
 
 	/**
@@ -173,9 +171,7 @@
 	 * @generated
 	 */
 	public boolean isOrdered() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.VARIABLE__IS_ORDERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.VARIABLE__IS_ORDERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, true, true);
 	}
 
 	/**
@@ -184,8 +180,7 @@
 	 * @generated
 	 */
 	public void setIsOrdered(boolean newIsOrdered) {
-		eDynamicSet(UMLPackage.VARIABLE__IS_ORDERED - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, newIsOrdered);
+		eDynamicSet(UMLPackage.VARIABLE__IS_ORDERED - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED, newIsOrdered);
 	}
 
 	/**
@@ -194,9 +189,7 @@
 	 * @generated
 	 */
 	public boolean isUnique() {
-		return (Boolean) eDynamicGet(
-			UMLPackage.VARIABLE__IS_UNIQUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, true, true);
+		return (Boolean) eDynamicGet(UMLPackage.VARIABLE__IS_UNIQUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, true, true);
 	}
 
 	/**
@@ -205,8 +198,7 @@
 	 * @generated
 	 */
 	public void setIsUnique(boolean newIsUnique) {
-		eDynamicSet(UMLPackage.VARIABLE__IS_UNIQUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, newIsUnique);
+		eDynamicSet(UMLPackage.VARIABLE__IS_UNIQUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE, newIsUnique);
 	}
 
 	/**
@@ -251,9 +243,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getUpperValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.VARIABLE__UPPER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.VARIABLE__UPPER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, true, true);
 	}
 
 	/**
@@ -262,9 +252,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetUpperValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.VARIABLE__UPPER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.VARIABLE__UPPER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, false, true);
 	}
 
 	/**
@@ -274,8 +262,7 @@
 	 */
 	public NotificationChain basicSetUpperValue(
 			ValueSpecification newUpperValue, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newUpperValue,
-			UMLPackage.VARIABLE__UPPER_VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newUpperValue, UMLPackage.VARIABLE__UPPER_VALUE, msgs);
 		return msgs;
 	}
 
@@ -285,9 +272,7 @@
 	 * @generated
 	 */
 	public void setUpperValue(ValueSpecification newUpperValue) {
-		eDynamicSet(UMLPackage.VARIABLE__UPPER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE,
-			newUpperValue);
+		eDynamicSet(UMLPackage.VARIABLE__UPPER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__UPPER_VALUE, newUpperValue);
 	}
 
 	/**
@@ -312,9 +297,7 @@
 	 * @generated
 	 */
 	public ValueSpecification getLowerValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.VARIABLE__LOWER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, true, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.VARIABLE__LOWER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, true, true);
 	}
 
 	/**
@@ -323,9 +306,7 @@
 	 * @generated
 	 */
 	public ValueSpecification basicGetLowerValue() {
-		return (ValueSpecification) eDynamicGet(
-			UMLPackage.VARIABLE__LOWER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, false, true);
+		return (ValueSpecification) eDynamicGet(UMLPackage.VARIABLE__LOWER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, false, true);
 	}
 
 	/**
@@ -335,8 +316,7 @@
 	 */
 	public NotificationChain basicSetLowerValue(
 			ValueSpecification newLowerValue, NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newLowerValue,
-			UMLPackage.VARIABLE__LOWER_VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newLowerValue, UMLPackage.VARIABLE__LOWER_VALUE, msgs);
 		return msgs;
 	}
 
@@ -346,9 +326,7 @@
 	 * @generated
 	 */
 	public void setLowerValue(ValueSpecification newLowerValue) {
-		eDynamicSet(UMLPackage.VARIABLE__LOWER_VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE,
-			newLowerValue);
+		eDynamicSet(UMLPackage.VARIABLE__LOWER_VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.MULTIPLICITY_ELEMENT__LOWER_VALUE, newLowerValue);
 	}
 
 	/**
@@ -375,9 +353,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -386,9 +362,7 @@
 	 * @generated
 	 */
 	public Activity getActivityScope() {
-		return (Activity) eDynamicGet(
-			UMLPackage.VARIABLE__ACTIVITY_SCOPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VARIABLE__ACTIVITY_SCOPE, true, true);
+		return (Activity) eDynamicGet(UMLPackage.VARIABLE__ACTIVITY_SCOPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VARIABLE__ACTIVITY_SCOPE, true, true);
 	}
 
 	/**
@@ -397,9 +371,7 @@
 	 * @generated
 	 */
 	public Activity basicGetActivityScope() {
-		return (Activity) eDynamicGet(
-			UMLPackage.VARIABLE__ACTIVITY_SCOPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VARIABLE__ACTIVITY_SCOPE, false, true);
+		return (Activity) eDynamicGet(UMLPackage.VARIABLE__ACTIVITY_SCOPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VARIABLE__ACTIVITY_SCOPE, false, true);
 	}
 
 	/**
@@ -409,8 +381,7 @@
 	 */
 	public NotificationChain basicSetActivityScope(Activity newActivityScope,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newActivityScope,
-			UMLPackage.VARIABLE__ACTIVITY_SCOPE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newActivityScope, UMLPackage.VARIABLE__ACTIVITY_SCOPE, msgs);
 		return msgs;
 	}
 
@@ -420,8 +391,7 @@
 	 * @generated
 	 */
 	public void setActivityScope(Activity newActivityScope) {
-		eDynamicSet(UMLPackage.VARIABLE__ACTIVITY_SCOPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VARIABLE__ACTIVITY_SCOPE, newActivityScope);
+		eDynamicSet(UMLPackage.VARIABLE__ACTIVITY_SCOPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VARIABLE__ACTIVITY_SCOPE, newActivityScope);
 	}
 
 	/**
@@ -430,9 +400,7 @@
 	 * @generated
 	 */
 	public StructuredActivityNode getScope() {
-		return (StructuredActivityNode) eDynamicGet(
-			UMLPackage.VARIABLE__SCOPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VARIABLE__SCOPE, true, true);
+		return (StructuredActivityNode) eDynamicGet(UMLPackage.VARIABLE__SCOPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VARIABLE__SCOPE, true, true);
 	}
 
 	/**
@@ -441,9 +409,7 @@
 	 * @generated
 	 */
 	public StructuredActivityNode basicGetScope() {
-		return (StructuredActivityNode) eDynamicGet(
-			UMLPackage.VARIABLE__SCOPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VARIABLE__SCOPE, false, true);
+		return (StructuredActivityNode) eDynamicGet(UMLPackage.VARIABLE__SCOPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VARIABLE__SCOPE, false, true);
 	}
 
 	/**
@@ -453,8 +419,7 @@
 	 */
 	public NotificationChain basicSetScope(StructuredActivityNode newScope,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newScope,
-			UMLPackage.VARIABLE__SCOPE, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newScope, UMLPackage.VARIABLE__SCOPE, msgs);
 		return msgs;
 	}
 
@@ -464,8 +429,7 @@
 	 * @generated
 	 */
 	public void setScope(StructuredActivityNode newScope) {
-		eDynamicSet(UMLPackage.VARIABLE__SCOPE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VARIABLE__SCOPE, newScope);
+		eDynamicSet(UMLPackage.VARIABLE__SCOPE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VARIABLE__SCOPE, newScope);
 	}
 
 	/**
@@ -475,8 +439,7 @@
 	 */
 	public boolean validateLowerGe0(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations.validateLowerGe0(this, diagnostics,
-			context);
+		return MultiplicityElementOperations.validateLowerGe0(this, diagnostics, context);
 	}
 
 	/**
@@ -486,8 +449,7 @@
 	 */
 	public boolean validateUpperGeLower(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations.validateUpperGeLower(this,
-			diagnostics, context);
+		return MultiplicityElementOperations.validateUpperGeLower(this, diagnostics, context);
 	}
 
 	/**
@@ -497,9 +459,7 @@
 	 */
 	public boolean validateValueSpecificationNoSideEffects(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return MultiplicityElementOperations
-			.validateValueSpecificationNoSideEffects(this, diagnostics,
-				context);
+		return MultiplicityElementOperations.validateValueSpecificationNoSideEffects(this, diagnostics, context);
 	}
 
 	/**
@@ -509,8 +469,7 @@
 	 */
 	public boolean validateValueSpecificationConstant(
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return MultiplicityElementOperations
-			.validateValueSpecificationConstant(this, diagnostics, context);
+		return MultiplicityElementOperations.validateValueSpecificationConstant(this, diagnostics, context);
 	}
 
 	/**
@@ -520,8 +479,7 @@
 	 */
 	public boolean validateLowerIsInteger(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations.validateLowerIsInteger(this,
-			diagnostics, context);
+		return MultiplicityElementOperations.validateLowerIsInteger(this, diagnostics, context);
 	}
 
 	/**
@@ -531,8 +489,7 @@
 	 */
 	public boolean validateUpperIsUnlimitedNatural(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return MultiplicityElementOperations
-			.validateUpperIsUnlimitedNatural(this, diagnostics, context);
+		return MultiplicityElementOperations.validateUpperIsUnlimitedNatural(this, diagnostics, context);
 	}
 
 	/**
@@ -608,31 +565,25 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.VARIABLE__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetOwningTemplateParameter(
-					(TemplateParameter) otherEnd, msgs);
-			case UMLPackage.VARIABLE__TEMPLATE_PARAMETER :
-				TemplateParameter templateParameter = basicGetTemplateParameter();
-				if (templateParameter != null)
-					msgs = ((InternalEObject) templateParameter).eInverseRemove(
-						this,
-						UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT,
-						TemplateParameter.class, msgs);
-				return basicSetTemplateParameter((TemplateParameter) otherEnd,
-					msgs);
-			case UMLPackage.VARIABLE__ACTIVITY_SCOPE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetActivityScope((Activity) otherEnd, msgs);
-			case UMLPackage.VARIABLE__SCOPE :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetScope((StructuredActivityNode) otherEnd, msgs);
+		case UMLPackage.VARIABLE__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetOwningTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.VARIABLE__TEMPLATE_PARAMETER:
+			TemplateParameter templateParameter = basicGetTemplateParameter();
+			if (templateParameter != null)
+				msgs = ((InternalEObject) templateParameter).eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+			return basicSetTemplateParameter((TemplateParameter) otherEnd, msgs);
+		case UMLPackage.VARIABLE__ACTIVITY_SCOPE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetActivityScope((Activity) otherEnd, msgs);
+		case UMLPackage.VARIABLE__SCOPE:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetScope((StructuredActivityNode) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -646,26 +597,24 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.VARIABLE__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.VARIABLE__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.VARIABLE__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER :
-				return basicSetOwningTemplateParameter(null, msgs);
-			case UMLPackage.VARIABLE__TEMPLATE_PARAMETER :
-				return basicSetTemplateParameter(null, msgs);
-			case UMLPackage.VARIABLE__LOWER_VALUE :
-				return basicSetLowerValue(null, msgs);
-			case UMLPackage.VARIABLE__UPPER_VALUE :
-				return basicSetUpperValue(null, msgs);
-			case UMLPackage.VARIABLE__ACTIVITY_SCOPE :
-				return basicSetActivityScope(null, msgs);
-			case UMLPackage.VARIABLE__SCOPE :
-				return basicSetScope(null, msgs);
+		case UMLPackage.VARIABLE__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VARIABLE__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VARIABLE__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER:
+			return basicSetOwningTemplateParameter(null, msgs);
+		case UMLPackage.VARIABLE__TEMPLATE_PARAMETER:
+			return basicSetTemplateParameter(null, msgs);
+		case UMLPackage.VARIABLE__LOWER_VALUE:
+			return basicSetLowerValue(null, msgs);
+		case UMLPackage.VARIABLE__UPPER_VALUE:
+			return basicSetUpperValue(null, msgs);
+		case UMLPackage.VARIABLE__ACTIVITY_SCOPE:
+			return basicSetActivityScope(null, msgs);
+		case UMLPackage.VARIABLE__SCOPE:
+			return basicSetScope(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -679,17 +628,12 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT,
-					TemplateParameter.class, msgs);
-			case UMLPackage.VARIABLE__ACTIVITY_SCOPE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.ACTIVITY__VARIABLE, Activity.class, msgs);
-			case UMLPackage.VARIABLE__SCOPE :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE,
-					StructuredActivityNode.class, msgs);
+		case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.TEMPLATE_PARAMETER__OWNED_PARAMETERED_ELEMENT, TemplateParameter.class, msgs);
+		case UMLPackage.VARIABLE__ACTIVITY_SCOPE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.ACTIVITY__VARIABLE, Activity.class, msgs);
+		case UMLPackage.VARIABLE__SCOPE:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.STRUCTURED_ACTIVITY_NODE__VARIABLE, StructuredActivityNode.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -702,70 +646,70 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.VARIABLE__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.VARIABLE__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.VARIABLE__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.VARIABLE__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.VARIABLE__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.VARIABLE__NAME :
-				return getName();
-			case UMLPackage.VARIABLE__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.VARIABLE__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.VARIABLE__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.VARIABLE__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.VARIABLE__TYPE :
-				if (resolve)
-					return getType();
-				return basicGetType();
-			case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER :
-				if (resolve)
-					return getOwningTemplateParameter();
-				return basicGetOwningTemplateParameter();
-			case UMLPackage.VARIABLE__TEMPLATE_PARAMETER :
-				if (resolve)
-					return getTemplateParameter();
-				return basicGetTemplateParameter();
-			case UMLPackage.VARIABLE__END :
-				return getEnds();
-			case UMLPackage.VARIABLE__IS_ORDERED :
-				return isOrdered();
-			case UMLPackage.VARIABLE__IS_UNIQUE :
-				return isUnique();
-			case UMLPackage.VARIABLE__LOWER :
-				return getLower();
-			case UMLPackage.VARIABLE__LOWER_VALUE :
-				if (resolve)
-					return getLowerValue();
-				return basicGetLowerValue();
-			case UMLPackage.VARIABLE__UPPER :
-				return getUpper();
-			case UMLPackage.VARIABLE__UPPER_VALUE :
-				if (resolve)
-					return getUpperValue();
-				return basicGetUpperValue();
-			case UMLPackage.VARIABLE__ACTIVITY_SCOPE :
-				if (resolve)
-					return getActivityScope();
-				return basicGetActivityScope();
-			case UMLPackage.VARIABLE__SCOPE :
-				if (resolve)
-					return getScope();
-				return basicGetScope();
+		case UMLPackage.VARIABLE__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.VARIABLE__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.VARIABLE__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.VARIABLE__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.VARIABLE__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.VARIABLE__NAME:
+			return getName();
+		case UMLPackage.VARIABLE__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.VARIABLE__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.VARIABLE__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.VARIABLE__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.VARIABLE__TYPE:
+			if (resolve)
+				return getType();
+			return basicGetType();
+		case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER:
+			if (resolve)
+				return getOwningTemplateParameter();
+			return basicGetOwningTemplateParameter();
+		case UMLPackage.VARIABLE__TEMPLATE_PARAMETER:
+			if (resolve)
+				return getTemplateParameter();
+			return basicGetTemplateParameter();
+		case UMLPackage.VARIABLE__END:
+			return getEnds();
+		case UMLPackage.VARIABLE__IS_ORDERED:
+			return isOrdered();
+		case UMLPackage.VARIABLE__IS_UNIQUE:
+			return isUnique();
+		case UMLPackage.VARIABLE__LOWER:
+			return getLower();
+		case UMLPackage.VARIABLE__LOWER_VALUE:
+			if (resolve)
+				return getLowerValue();
+			return basicGetLowerValue();
+		case UMLPackage.VARIABLE__UPPER:
+			return getUpper();
+		case UMLPackage.VARIABLE__UPPER_VALUE:
+			if (resolve)
+				return getUpperValue();
+			return basicGetUpperValue();
+		case UMLPackage.VARIABLE__ACTIVITY_SCOPE:
+			if (resolve)
+				return getActivityScope();
+			return basicGetActivityScope();
+		case UMLPackage.VARIABLE__SCOPE:
+			if (resolve)
+				return getScope();
+			return basicGetScope();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -779,58 +723,56 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.VARIABLE__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.VARIABLE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.VARIABLE__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.VARIABLE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.VARIABLE__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.VARIABLE__TYPE :
-				setType((Type) newValue);
-				return;
-			case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.VARIABLE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) newValue);
-				return;
-			case UMLPackage.VARIABLE__IS_ORDERED :
-				setIsOrdered((Boolean) newValue);
-				return;
-			case UMLPackage.VARIABLE__IS_UNIQUE :
-				setIsUnique((Boolean) newValue);
-				return;
-			case UMLPackage.VARIABLE__LOWER :
-				setLower((Integer) newValue);
-				return;
-			case UMLPackage.VARIABLE__LOWER_VALUE :
-				setLowerValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.VARIABLE__UPPER :
-				setUpper((Integer) newValue);
-				return;
-			case UMLPackage.VARIABLE__UPPER_VALUE :
-				setUpperValue((ValueSpecification) newValue);
-				return;
-			case UMLPackage.VARIABLE__ACTIVITY_SCOPE :
-				setActivityScope((Activity) newValue);
-				return;
-			case UMLPackage.VARIABLE__SCOPE :
-				setScope((StructuredActivityNode) newValue);
-				return;
+		case UMLPackage.VARIABLE__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.VARIABLE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.VARIABLE__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.VARIABLE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.VARIABLE__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.VARIABLE__TYPE:
+			setType((Type) newValue);
+			return;
+		case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.VARIABLE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) newValue);
+			return;
+		case UMLPackage.VARIABLE__IS_ORDERED:
+			setIsOrdered((Boolean) newValue);
+			return;
+		case UMLPackage.VARIABLE__IS_UNIQUE:
+			setIsUnique((Boolean) newValue);
+			return;
+		case UMLPackage.VARIABLE__LOWER:
+			setLower((Integer) newValue);
+			return;
+		case UMLPackage.VARIABLE__LOWER_VALUE:
+			setLowerValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.VARIABLE__UPPER:
+			setUpper((Integer) newValue);
+			return;
+		case UMLPackage.VARIABLE__UPPER_VALUE:
+			setUpperValue((ValueSpecification) newValue);
+			return;
+		case UMLPackage.VARIABLE__ACTIVITY_SCOPE:
+			setActivityScope((Activity) newValue);
+			return;
+		case UMLPackage.VARIABLE__SCOPE:
+			setScope((StructuredActivityNode) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -843,54 +785,54 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.VARIABLE__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.VARIABLE__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.VARIABLE__NAME :
-				unsetName();
-				return;
-			case UMLPackage.VARIABLE__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.VARIABLE__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.VARIABLE__TYPE :
-				setType((Type) null);
-				return;
-			case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER :
-				setOwningTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.VARIABLE__TEMPLATE_PARAMETER :
-				setTemplateParameter((TemplateParameter) null);
-				return;
-			case UMLPackage.VARIABLE__IS_ORDERED :
-				setIsOrdered(IS_ORDERED_EDEFAULT);
-				return;
-			case UMLPackage.VARIABLE__IS_UNIQUE :
-				setIsUnique(IS_UNIQUE_EDEFAULT);
-				return;
-			case UMLPackage.VARIABLE__LOWER :
-				setLower(LOWER_EDEFAULT);
-				return;
-			case UMLPackage.VARIABLE__LOWER_VALUE :
-				setLowerValue((ValueSpecification) null);
-				return;
-			case UMLPackage.VARIABLE__UPPER :
-				setUpper(UPPER_EDEFAULT);
-				return;
-			case UMLPackage.VARIABLE__UPPER_VALUE :
-				setUpperValue((ValueSpecification) null);
-				return;
-			case UMLPackage.VARIABLE__ACTIVITY_SCOPE :
-				setActivityScope((Activity) null);
-				return;
-			case UMLPackage.VARIABLE__SCOPE :
-				setScope((StructuredActivityNode) null);
-				return;
+		case UMLPackage.VARIABLE__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.VARIABLE__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.VARIABLE__NAME:
+			unsetName();
+			return;
+		case UMLPackage.VARIABLE__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.VARIABLE__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.VARIABLE__TYPE:
+			setType((Type) null);
+			return;
+		case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER:
+			setOwningTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.VARIABLE__TEMPLATE_PARAMETER:
+			setTemplateParameter((TemplateParameter) null);
+			return;
+		case UMLPackage.VARIABLE__IS_ORDERED:
+			setIsOrdered(IS_ORDERED_EDEFAULT);
+			return;
+		case UMLPackage.VARIABLE__IS_UNIQUE:
+			setIsUnique(IS_UNIQUE_EDEFAULT);
+			return;
+		case UMLPackage.VARIABLE__LOWER:
+			setLower(LOWER_EDEFAULT);
+			return;
+		case UMLPackage.VARIABLE__LOWER_VALUE:
+			setLowerValue((ValueSpecification) null);
+			return;
+		case UMLPackage.VARIABLE__UPPER:
+			setUpper(UPPER_EDEFAULT);
+			return;
+		case UMLPackage.VARIABLE__UPPER_VALUE:
+			setUpperValue((ValueSpecification) null);
+			return;
+		case UMLPackage.VARIABLE__ACTIVITY_SCOPE:
+			setActivityScope((Activity) null);
+			return;
+		case UMLPackage.VARIABLE__SCOPE:
+			setScope((StructuredActivityNode) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -903,52 +845,50 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.VARIABLE__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.VARIABLE__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.VARIABLE__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.VARIABLE__OWNER :
-				return isSetOwner();
-			case UMLPackage.VARIABLE__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.VARIABLE__NAME :
-				return isSetName();
-			case UMLPackage.VARIABLE__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.VARIABLE__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.VARIABLE__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.VARIABLE__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.VARIABLE__TYPE :
-				return basicGetType() != null;
-			case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER :
-				return basicGetOwningTemplateParameter() != null;
-			case UMLPackage.VARIABLE__TEMPLATE_PARAMETER :
-				return isSetTemplateParameter();
-			case UMLPackage.VARIABLE__END :
-				return !getEnds().isEmpty();
-			case UMLPackage.VARIABLE__IS_ORDERED :
-				return isOrdered() != IS_ORDERED_EDEFAULT;
-			case UMLPackage.VARIABLE__IS_UNIQUE :
-				return isUnique() != IS_UNIQUE_EDEFAULT;
-			case UMLPackage.VARIABLE__LOWER :
-				return getLower() != LOWER_EDEFAULT;
-			case UMLPackage.VARIABLE__LOWER_VALUE :
-				return basicGetLowerValue() != null;
-			case UMLPackage.VARIABLE__UPPER :
-				return getUpper() != UPPER_EDEFAULT;
-			case UMLPackage.VARIABLE__UPPER_VALUE :
-				return basicGetUpperValue() != null;
-			case UMLPackage.VARIABLE__ACTIVITY_SCOPE :
-				return basicGetActivityScope() != null;
-			case UMLPackage.VARIABLE__SCOPE :
-				return basicGetScope() != null;
+		case UMLPackage.VARIABLE__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.VARIABLE__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.VARIABLE__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.VARIABLE__OWNER:
+			return isSetOwner();
+		case UMLPackage.VARIABLE__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.VARIABLE__NAME:
+			return isSetName();
+		case UMLPackage.VARIABLE__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.VARIABLE__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.VARIABLE__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.VARIABLE__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.VARIABLE__TYPE:
+			return basicGetType() != null;
+		case UMLPackage.VARIABLE__OWNING_TEMPLATE_PARAMETER:
+			return basicGetOwningTemplateParameter() != null;
+		case UMLPackage.VARIABLE__TEMPLATE_PARAMETER:
+			return isSetTemplateParameter();
+		case UMLPackage.VARIABLE__END:
+			return !getEnds().isEmpty();
+		case UMLPackage.VARIABLE__IS_ORDERED:
+			return isOrdered() != IS_ORDERED_EDEFAULT;
+		case UMLPackage.VARIABLE__IS_UNIQUE:
+			return isUnique() != IS_UNIQUE_EDEFAULT;
+		case UMLPackage.VARIABLE__LOWER:
+			return getLower() != LOWER_EDEFAULT;
+		case UMLPackage.VARIABLE__LOWER_VALUE:
+			return basicGetLowerValue() != null;
+		case UMLPackage.VARIABLE__UPPER:
+			return getUpper() != UPPER_EDEFAULT;
+		case UMLPackage.VARIABLE__UPPER_VALUE:
+			return basicGetUpperValue() != null;
+		case UMLPackage.VARIABLE__ACTIVITY_SCOPE:
+			return basicGetActivityScope() != null;
+		case UMLPackage.VARIABLE__SCOPE:
+			return basicGetScope() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -963,20 +903,20 @@
 			Class<?> baseClass) {
 		if (baseClass == MultiplicityElement.class) {
 			switch (derivedFeatureID) {
-				case UMLPackage.VARIABLE__IS_ORDERED :
-					return UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED;
-				case UMLPackage.VARIABLE__IS_UNIQUE :
-					return UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE;
-				case UMLPackage.VARIABLE__LOWER :
-					return UMLPackage.MULTIPLICITY_ELEMENT__LOWER;
-				case UMLPackage.VARIABLE__LOWER_VALUE :
-					return UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE;
-				case UMLPackage.VARIABLE__UPPER :
-					return UMLPackage.MULTIPLICITY_ELEMENT__UPPER;
-				case UMLPackage.VARIABLE__UPPER_VALUE :
-					return UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE;
-				default :
-					return -1;
+			case UMLPackage.VARIABLE__IS_ORDERED:
+				return UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED;
+			case UMLPackage.VARIABLE__IS_UNIQUE:
+				return UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE;
+			case UMLPackage.VARIABLE__LOWER:
+				return UMLPackage.MULTIPLICITY_ELEMENT__LOWER;
+			case UMLPackage.VARIABLE__LOWER_VALUE:
+				return UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE;
+			case UMLPackage.VARIABLE__UPPER:
+				return UMLPackage.MULTIPLICITY_ELEMENT__UPPER;
+			case UMLPackage.VARIABLE__UPPER_VALUE:
+				return UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE;
+			default:
+				return -1;
 			}
 		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
@@ -992,20 +932,20 @@
 			Class<?> baseClass) {
 		if (baseClass == MultiplicityElement.class) {
 			switch (baseFeatureID) {
-				case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED :
-					return UMLPackage.VARIABLE__IS_ORDERED;
-				case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE :
-					return UMLPackage.VARIABLE__IS_UNIQUE;
-				case UMLPackage.MULTIPLICITY_ELEMENT__LOWER :
-					return UMLPackage.VARIABLE__LOWER;
-				case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE :
-					return UMLPackage.VARIABLE__LOWER_VALUE;
-				case UMLPackage.MULTIPLICITY_ELEMENT__UPPER :
-					return UMLPackage.VARIABLE__UPPER;
-				case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE :
-					return UMLPackage.VARIABLE__UPPER_VALUE;
-				default :
-					return -1;
+			case UMLPackage.MULTIPLICITY_ELEMENT__IS_ORDERED:
+				return UMLPackage.VARIABLE__IS_ORDERED;
+			case UMLPackage.MULTIPLICITY_ELEMENT__IS_UNIQUE:
+				return UMLPackage.VARIABLE__IS_UNIQUE;
+			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER:
+				return UMLPackage.VARIABLE__LOWER;
+			case UMLPackage.MULTIPLICITY_ELEMENT__LOWER_VALUE:
+				return UMLPackage.VARIABLE__LOWER_VALUE;
+			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER:
+				return UMLPackage.VARIABLE__UPPER;
+			case UMLPackage.MULTIPLICITY_ELEMENT__UPPER_VALUE:
+				return UMLPackage.VARIABLE__UPPER_VALUE;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
@@ -1020,40 +960,40 @@
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
 		if (baseClass == MultiplicityElement.class) {
 			switch (baseOperationID) {
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.VARIABLE___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.VARIABLE___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.VARIABLE___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.VARIABLE___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.VARIABLE___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-					return UMLPackage.VARIABLE___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP;
-				case UMLPackage.MULTIPLICITY_ELEMENT___SET_LOWER__INT :
-					return UMLPackage.VARIABLE___SET_LOWER__INT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___SET_UPPER__INT :
-					return UMLPackage.VARIABLE___SET_UPPER__INT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-					return UMLPackage.VARIABLE___COMPATIBLE_WITH__MULTIPLICITYELEMENT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-					return UMLPackage.VARIABLE___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___IS__INT_INT :
-					return UMLPackage.VARIABLE___IS__INT_INT;
-				case UMLPackage.MULTIPLICITY_ELEMENT___IS_MULTIVALUED :
-					return UMLPackage.VARIABLE___IS_MULTIVALUED;
-				case UMLPackage.MULTIPLICITY_ELEMENT___GET_LOWER :
-					return UMLPackage.VARIABLE___GET_LOWER;
-				case UMLPackage.MULTIPLICITY_ELEMENT___LOWER_BOUND :
-					return UMLPackage.VARIABLE___LOWER_BOUND;
-				case UMLPackage.MULTIPLICITY_ELEMENT___GET_UPPER :
-					return UMLPackage.VARIABLE___GET_UPPER;
-				case UMLPackage.MULTIPLICITY_ELEMENT___UPPER_BOUND :
-					return UMLPackage.VARIABLE___UPPER_BOUND;
-				default :
-					return -1;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.VARIABLE___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.VARIABLE___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.VARIABLE___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.VARIABLE___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.VARIABLE___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+				return UMLPackage.VARIABLE___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP;
+			case UMLPackage.MULTIPLICITY_ELEMENT___SET_LOWER__INT:
+				return UMLPackage.VARIABLE___SET_LOWER__INT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___SET_UPPER__INT:
+				return UMLPackage.VARIABLE___SET_UPPER__INT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+				return UMLPackage.VARIABLE___COMPATIBLE_WITH__MULTIPLICITYELEMENT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+				return UMLPackage.VARIABLE___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___IS__INT_INT:
+				return UMLPackage.VARIABLE___IS__INT_INT;
+			case UMLPackage.MULTIPLICITY_ELEMENT___IS_MULTIVALUED:
+				return UMLPackage.VARIABLE___IS_MULTIVALUED;
+			case UMLPackage.MULTIPLICITY_ELEMENT___GET_LOWER:
+				return UMLPackage.VARIABLE___GET_LOWER;
+			case UMLPackage.MULTIPLICITY_ELEMENT___LOWER_BOUND:
+				return UMLPackage.VARIABLE___LOWER_BOUND;
+			case UMLPackage.MULTIPLICITY_ELEMENT___GET_UPPER:
+				return UMLPackage.VARIABLE___GET_UPPER;
+			case UMLPackage.MULTIPLICITY_ELEMENT___UPPER_BOUND:
+				return UMLPackage.VARIABLE___UPPER_BOUND;
+			default:
+				return -1;
 			}
 		}
 		return super.eDerivedOperationID(baseOperationID, baseClass);
@@ -1069,180 +1009,152 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.VARIABLE___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.VARIABLE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.VARIABLE___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.VARIABLE___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.VARIABLE___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.VARIABLE___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.VARIABLE___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.VARIABLE___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.VARIABLE___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.VARIABLE___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.VARIABLE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VARIABLE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.VARIABLE___GET_MODEL :
-				return getModel();
-			case UMLPackage.VARIABLE___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.VARIABLE___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.VARIABLE___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.VARIABLE___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.VARIABLE___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.VARIABLE___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.VARIABLE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.VARIABLE___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.VARIABLE___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.VARIABLE___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.VARIABLE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.VARIABLE___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VARIABLE___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.VARIABLE___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VARIABLE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.VARIABLE___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.VARIABLE___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.VARIABLE___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.VARIABLE___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.VARIABLE___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.VARIABLE___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.VARIABLE___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.VARIABLE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.VARIABLE___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.VARIABLE___GET_LABEL :
-				return getLabel();
-			case UMLPackage.VARIABLE___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.VARIABLE___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.VARIABLE___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.VARIABLE___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.VARIABLE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.VARIABLE___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.VARIABLE___SEPARATOR :
-				return separator();
-			case UMLPackage.VARIABLE___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.VARIABLE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT :
-				return isCompatibleWith(
-					(ParameterableElement) arguments.get(0));
-			case UMLPackage.VARIABLE___IS_TEMPLATE_PARAMETER :
-				return isTemplateParameter();
-			case UMLPackage.VARIABLE___GET_ENDS :
-				return getEnds();
-			case UMLPackage.VARIABLE___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP :
-				return validateUpperGeLower((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP :
-				return validateLowerGe0((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationNoSideEffects(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP :
-				return validateValueSpecificationConstant(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP :
-				return validateLowerIsInteger(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP :
-				return validateUpperIsUnlimitedNatural(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VARIABLE___SET_LOWER__INT :
-				setLower((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.VARIABLE___SET_UPPER__INT :
-				setUpper((Integer) arguments.get(0));
-				return null;
-			case UMLPackage.VARIABLE___COMPATIBLE_WITH__MULTIPLICITYELEMENT :
-				return compatibleWith((MultiplicityElement) arguments.get(0));
-			case UMLPackage.VARIABLE___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT :
-				return includesMultiplicity(
-					(MultiplicityElement) arguments.get(0));
-			case UMLPackage.VARIABLE___IS__INT_INT :
-				return is((Integer) arguments.get(0),
-					(Integer) arguments.get(1));
-			case UMLPackage.VARIABLE___IS_MULTIVALUED :
-				return isMultivalued();
-			case UMLPackage.VARIABLE___GET_LOWER :
-				return getLower();
-			case UMLPackage.VARIABLE___LOWER_BOUND :
-				return lowerBound();
-			case UMLPackage.VARIABLE___GET_UPPER :
-				return getUpper();
-			case UMLPackage.VARIABLE___UPPER_BOUND :
-				return upperBound();
-			case UMLPackage.VARIABLE___IS_ACCESSIBLE_BY__ACTION :
-				return isAccessibleBy((Action) arguments.get(0));
+		case UMLPackage.VARIABLE___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.VARIABLE___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.VARIABLE___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.VARIABLE___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.VARIABLE___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.VARIABLE___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.VARIABLE___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.VARIABLE___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.VARIABLE___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.VARIABLE___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.VARIABLE___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VARIABLE___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.VARIABLE___GET_MODEL:
+			return getModel();
+		case UMLPackage.VARIABLE___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.VARIABLE___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.VARIABLE___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.VARIABLE___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.VARIABLE___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.VARIABLE___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.VARIABLE___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.VARIABLE___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.VARIABLE___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.VARIABLE___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.VARIABLE___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.VARIABLE___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VARIABLE___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.VARIABLE___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VARIABLE___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.VARIABLE___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.VARIABLE___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.VARIABLE___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.VARIABLE___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.VARIABLE___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.VARIABLE___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.VARIABLE___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.VARIABLE___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.VARIABLE___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.VARIABLE___GET_LABEL:
+			return getLabel();
+		case UMLPackage.VARIABLE___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.VARIABLE___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.VARIABLE___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.VARIABLE___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.VARIABLE___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.VARIABLE___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.VARIABLE___SEPARATOR:
+			return separator();
+		case UMLPackage.VARIABLE___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.VARIABLE___IS_COMPATIBLE_WITH__PARAMETERABLEELEMENT:
+			return isCompatibleWith((ParameterableElement) arguments.get(0));
+		case UMLPackage.VARIABLE___IS_TEMPLATE_PARAMETER:
+			return isTemplateParameter();
+		case UMLPackage.VARIABLE___GET_ENDS:
+			return getEnds();
+		case UMLPackage.VARIABLE___VALIDATE_UPPER_GE_LOWER__DIAGNOSTICCHAIN_MAP:
+			return validateUpperGeLower((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE___VALIDATE_LOWER_GE0__DIAGNOSTICCHAIN_MAP:
+			return validateLowerGe0((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE___VALIDATE_VALUE_SPECIFICATION_NO_SIDE_EFFECTS__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationNoSideEffects((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE___VALIDATE_VALUE_SPECIFICATION_CONSTANT__DIAGNOSTICCHAIN_MAP:
+			return validateValueSpecificationConstant((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE___VALIDATE_LOWER_IS_INTEGER__DIAGNOSTICCHAIN_MAP:
+			return validateLowerIsInteger((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE___VALIDATE_UPPER_IS_UNLIMITED_NATURAL__DIAGNOSTICCHAIN_MAP:
+			return validateUpperIsUnlimitedNatural((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VARIABLE___SET_LOWER__INT:
+			setLower((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.VARIABLE___SET_UPPER__INT:
+			setUpper((Integer) arguments.get(0));
+			return null;
+		case UMLPackage.VARIABLE___COMPATIBLE_WITH__MULTIPLICITYELEMENT:
+			return compatibleWith((MultiplicityElement) arguments.get(0));
+		case UMLPackage.VARIABLE___INCLUDES_MULTIPLICITY__MULTIPLICITYELEMENT:
+			return includesMultiplicity((MultiplicityElement) arguments.get(0));
+		case UMLPackage.VARIABLE___IS__INT_INT:
+			return is((Integer) arguments.get(0), (Integer) arguments.get(1));
+		case UMLPackage.VARIABLE___IS_MULTIVALUED:
+			return isMultivalued();
+		case UMLPackage.VARIABLE___GET_LOWER:
+			return getLower();
+		case UMLPackage.VARIABLE___LOWER_BOUND:
+			return lowerBound();
+		case UMLPackage.VARIABLE___GET_UPPER:
+			return getUpper();
+		case UMLPackage.VARIABLE___UPPER_BOUND:
+			return upperBound();
+		case UMLPackage.VARIABLE___IS_ACCESSIBLE_BY__ACTION:
+			return isAccessibleBy((Action) arguments.get(0));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -1255,10 +1167,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[]{
-		UMLPackage.VARIABLE__OWNED_COMMENT,
-		UMLPackage.VARIABLE__NAME_EXPRESSION, UMLPackage.VARIABLE__LOWER_VALUE,
-		UMLPackage.VARIABLE__UPPER_VALUE};
+	protected static final int[] OWNED_ELEMENT_ESUBSETS = new int[] { UMLPackage.VARIABLE__OWNED_COMMENT, UMLPackage.VARIABLE__NAME_EXPRESSION, UMLPackage.VARIABLE__LOWER_VALUE, UMLPackage.VARIABLE__UPPER_VALUE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -1268,8 +1177,8 @@
 	@Override
 	public boolean isSetOwnedElements() {
 		return super.isSetOwnedElements()
-			|| eIsSet(UMLPackage.VARIABLE__LOWER_VALUE)
-			|| eIsSet(UMLPackage.VARIABLE__UPPER_VALUE);
+				|| eIsSet(UMLPackage.VARIABLE__LOWER_VALUE)
+				|| eIsSet(UMLPackage.VARIABLE__UPPER_VALUE);
 	}
 
 	/**
@@ -1298,8 +1207,8 @@
 	@Override
 	public boolean isSetNamespace() {
 		return super.isSetNamespace()
-			|| eIsSet(UMLPackage.VARIABLE__ACTIVITY_SCOPE)
-			|| eIsSet(UMLPackage.VARIABLE__SCOPE);
+				|| eIsSet(UMLPackage.VARIABLE__ACTIVITY_SCOPE)
+				|| eIsSet(UMLPackage.VARIABLE__SCOPE);
 	}
 
 } //VariableImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/VertexImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/VertexImpl.java
index 8e25e61..004e399 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/VertexImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/VertexImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -16,6 +16,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -25,6 +26,9 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.uml2.uml.Comment;
@@ -89,9 +93,7 @@
 	@Override
 	public Namespace getNamespace() {
 		Namespace namespace = basicGetNamespace();
-		return namespace != null && namespace.eIsProxy()
-			? (Namespace) eResolveProxy((InternalEObject) namespace)
-			: namespace;
+		return namespace != null && namespace.eIsProxy() ? (Namespace) eResolveProxy((InternalEObject) namespace) : namespace;
 	}
 
 	/**
@@ -119,12 +121,10 @@
 	 */
 	public Transition getOutgoing(String name, boolean ignoreCase,
 			EClass eClass) {
-		outgoingLoop : for (Transition outgoing : getOutgoings()) {
+		outgoingLoop: for (Transition outgoing : getOutgoings()) {
 			if (eClass != null && !eClass.isInstance(outgoing))
 				continue outgoingLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(outgoing.getName())
-				: name.equals(outgoing.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(outgoing.getName()) : name.equals(outgoing.getName())))
 				continue outgoingLoop;
 			return outgoing;
 		}
@@ -156,12 +156,10 @@
 	 */
 	public Transition getIncoming(String name, boolean ignoreCase,
 			EClass eClass) {
-		incomingLoop : for (Transition incoming : getIncomings()) {
+		incomingLoop: for (Transition incoming : getIncomings()) {
 			if (eClass != null && !eClass.isInstance(incoming))
 				continue incomingLoop;
-			if (name != null && !(ignoreCase
-				? name.equalsIgnoreCase(incoming.getName())
-				: name.equals(incoming.getName())))
+			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(incoming.getName()) : name.equals(incoming.getName())))
 				continue incomingLoop;
 			return incoming;
 		}
@@ -174,9 +172,7 @@
 	 * @generated
 	 */
 	public Region getContainer() {
-		return (Region) eDynamicGet(
-			UMLPackage.VERTEX__CONTAINER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VERTEX__CONTAINER, true, true);
+		return (Region) eDynamicGet(UMLPackage.VERTEX__CONTAINER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VERTEX__CONTAINER, true, true);
 	}
 
 	/**
@@ -185,9 +181,7 @@
 	 * @generated
 	 */
 	public Region basicGetContainer() {
-		return (Region) eDynamicGet(
-			UMLPackage.VERTEX__CONTAINER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VERTEX__CONTAINER, false, true);
+		return (Region) eDynamicGet(UMLPackage.VERTEX__CONTAINER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VERTEX__CONTAINER, false, true);
 	}
 
 	/**
@@ -197,8 +191,7 @@
 	 */
 	public NotificationChain basicSetContainer(Region newContainer,
 			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newContainer,
-			UMLPackage.VERTEX__CONTAINER, msgs);
+		msgs = eBasicSetContainer((InternalEObject) newContainer, UMLPackage.VERTEX__CONTAINER, msgs);
 		return msgs;
 	}
 
@@ -208,8 +201,7 @@
 	 * @generated
 	 */
 	public void setContainer(Region newContainer) {
-		eDynamicSet(UMLPackage.VERTEX__CONTAINER - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.VERTEX__CONTAINER, newContainer);
+		eDynamicSet(UMLPackage.VERTEX__CONTAINER - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.VERTEX__CONTAINER, newContainer);
 	}
 
 	/**
@@ -249,13 +241,12 @@
 	public NotificationChain eInverseAdd(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.VERTEX__EANNOTATIONS :
-				return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations())
-					.basicAdd(otherEnd, msgs);
-			case UMLPackage.VERTEX__CONTAINER :
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetContainer((Region) otherEnd, msgs);
+		case UMLPackage.VERTEX__EANNOTATIONS:
+			return ((InternalEList<InternalEObject>) (InternalEList<?>) getEAnnotations()).basicAdd(otherEnd, msgs);
+		case UMLPackage.VERTEX__CONTAINER:
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			return basicSetContainer((Region) otherEnd, msgs);
 		}
 		return eDynamicInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -269,16 +260,14 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.VERTEX__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.VERTEX__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.VERTEX__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.VERTEX__CONTAINER :
-				return basicSetContainer(null, msgs);
+		case UMLPackage.VERTEX__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VERTEX__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.VERTEX__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.VERTEX__CONTAINER:
+			return basicSetContainer(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -292,9 +281,8 @@
 	public NotificationChain eBasicRemoveFromContainerFeature(
 			NotificationChain msgs) {
 		switch (eContainerFeatureID()) {
-			case UMLPackage.VERTEX__CONTAINER :
-				return eInternalContainer().eInverseRemove(this,
-					UMLPackage.REGION__SUBVERTEX, Region.class, msgs);
+		case UMLPackage.VERTEX__CONTAINER:
+			return eInternalContainer().eInverseRemove(this, UMLPackage.REGION__SUBVERTEX, Region.class, msgs);
 		}
 		return eDynamicBasicRemoveFromContainer(msgs);
 	}
@@ -307,40 +295,40 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.VERTEX__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.VERTEX__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.VERTEX__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.VERTEX__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.VERTEX__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.VERTEX__NAME :
-				return getName();
-			case UMLPackage.VERTEX__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.VERTEX__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.VERTEX__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.VERTEX__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.VERTEX__CONTAINER :
-				if (resolve)
-					return getContainer();
-				return basicGetContainer();
-			case UMLPackage.VERTEX__INCOMING :
-				return getIncomings();
-			case UMLPackage.VERTEX__OUTGOING :
-				return getOutgoings();
+		case UMLPackage.VERTEX__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.VERTEX__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.VERTEX__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.VERTEX__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.VERTEX__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.VERTEX__NAME:
+			return getName();
+		case UMLPackage.VERTEX__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.VERTEX__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.VERTEX__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.VERTEX__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.VERTEX__CONTAINER:
+			if (resolve)
+				return getContainer();
+			return basicGetContainer();
+		case UMLPackage.VERTEX__INCOMING:
+			return getIncomings();
+		case UMLPackage.VERTEX__OUTGOING:
+			return getOutgoings();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -354,28 +342,26 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.VERTEX__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.VERTEX__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.VERTEX__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.VERTEX__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.VERTEX__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.VERTEX__CONTAINER :
-				setContainer((Region) newValue);
-				return;
+		case UMLPackage.VERTEX__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.VERTEX__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.VERTEX__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.VERTEX__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.VERTEX__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.VERTEX__CONTAINER:
+			setContainer((Region) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -388,24 +374,24 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.VERTEX__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.VERTEX__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.VERTEX__NAME :
-				unsetName();
-				return;
-			case UMLPackage.VERTEX__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.VERTEX__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.VERTEX__CONTAINER :
-				setContainer((Region) null);
-				return;
+		case UMLPackage.VERTEX__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.VERTEX__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.VERTEX__NAME:
+			unsetName();
+			return;
+		case UMLPackage.VERTEX__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.VERTEX__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.VERTEX__CONTAINER:
+			setContainer((Region) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -418,34 +404,32 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.VERTEX__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.VERTEX__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.VERTEX__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.VERTEX__OWNER :
-				return isSetOwner();
-			case UMLPackage.VERTEX__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.VERTEX__NAME :
-				return isSetName();
-			case UMLPackage.VERTEX__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.VERTEX__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.VERTEX__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.VERTEX__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.VERTEX__CONTAINER :
-				return basicGetContainer() != null;
-			case UMLPackage.VERTEX__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.VERTEX__OUTGOING :
-				return !getOutgoings().isEmpty();
+		case UMLPackage.VERTEX__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.VERTEX__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.VERTEX__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.VERTEX__OWNER:
+			return isSetOwner();
+		case UMLPackage.VERTEX__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.VERTEX__NAME:
+			return isSetName();
+		case UMLPackage.VERTEX__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.VERTEX__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.VERTEX__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.VERTEX__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.VERTEX__CONTAINER:
+			return basicGetContainer() != null;
+		case UMLPackage.VERTEX__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.VERTEX__OUTGOING:
+			return !getOutgoings().isEmpty();
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -460,135 +444,120 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.VERTEX___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.VERTEX___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VERTEX___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VERTEX___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.VERTEX___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.VERTEX___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.VERTEX___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.VERTEX___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.VERTEX___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.VERTEX___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.VERTEX___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.VERTEX___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.VERTEX___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VERTEX___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.VERTEX___GET_MODEL :
-				return getModel();
-			case UMLPackage.VERTEX___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.VERTEX___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.VERTEX___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.VERTEX___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.VERTEX___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.VERTEX___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.VERTEX___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.VERTEX___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.VERTEX___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.VERTEX___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.VERTEX___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.VERTEX___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VERTEX___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.VERTEX___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.VERTEX___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.VERTEX___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.VERTEX___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.VERTEX___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.VERTEX___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.VERTEX___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.VERTEX___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.VERTEX___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.VERTEX___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VERTEX___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VERTEX___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.VERTEX___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.VERTEX___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.VERTEX___GET_LABEL :
-				return getLabel();
-			case UMLPackage.VERTEX___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.VERTEX___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.VERTEX___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.VERTEX___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.VERTEX___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.VERTEX___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.VERTEX___SEPARATOR :
-				return separator();
-			case UMLPackage.VERTEX___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.VERTEX___CONTAINING_STATE_MACHINE :
-				return containingStateMachine();
-			case UMLPackage.VERTEX___GET_INCOMINGS :
-				return getIncomings();
-			case UMLPackage.VERTEX___GET_OUTGOINGS :
-				return getOutgoings();
-			case UMLPackage.VERTEX___IS_CONTAINED_IN_STATE__STATE :
-				return isContainedInState((State) arguments.get(0));
-			case UMLPackage.VERTEX___IS_CONTAINED_IN_REGION__REGION :
-				return isContainedInRegion((Region) arguments.get(0));
+		case UMLPackage.VERTEX___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.VERTEX___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VERTEX___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VERTEX___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.VERTEX___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.VERTEX___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.VERTEX___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.VERTEX___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.VERTEX___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.VERTEX___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.VERTEX___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.VERTEX___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.VERTEX___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VERTEX___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.VERTEX___GET_MODEL:
+			return getModel();
+		case UMLPackage.VERTEX___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.VERTEX___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.VERTEX___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.VERTEX___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.VERTEX___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.VERTEX___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.VERTEX___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.VERTEX___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.VERTEX___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.VERTEX___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.VERTEX___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.VERTEX___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VERTEX___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.VERTEX___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.VERTEX___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.VERTEX___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.VERTEX___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.VERTEX___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.VERTEX___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.VERTEX___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.VERTEX___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.VERTEX___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.VERTEX___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VERTEX___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VERTEX___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.VERTEX___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.VERTEX___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.VERTEX___GET_LABEL:
+			return getLabel();
+		case UMLPackage.VERTEX___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.VERTEX___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.VERTEX___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.VERTEX___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.VERTEX___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.VERTEX___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.VERTEX___SEPARATOR:
+			return separator();
+		case UMLPackage.VERTEX___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.VERTEX___CONTAINING_STATE_MACHINE:
+			return containingStateMachine();
+		case UMLPackage.VERTEX___GET_INCOMINGS:
+			return getIncomings();
+		case UMLPackage.VERTEX___GET_OUTGOINGS:
+			return getOutgoings();
+		case UMLPackage.VERTEX___IS_CONTAINED_IN_STATE__STATE:
+			return isContainedInState((State) arguments.get(0));
+		case UMLPackage.VERTEX___IS_CONTAINED_IN_REGION__REGION:
+			return isContainedInRegion((Region) arguments.get(0));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -614,7 +583,8 @@
 	 */
 	@Override
 	public boolean isSetNamespace() {
-		return super.isSetNamespace() || eIsSet(UMLPackage.VERTEX__CONTAINER);
+		return super.isSetNamespace()
+				|| eIsSet(UMLPackage.VERTEX__CONTAINER);
 	}
 
 } //VertexImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/WriteLinkActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/WriteLinkActionImpl.java
index 34aa733..65f63e5 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/WriteLinkActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/WriteLinkActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -67,8 +67,7 @@
 	 */
 	public boolean validateAllowAccess(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return WriteLinkActionOperations.validateAllowAccess(this, diagnostics,
-			context);
+		return WriteLinkActionOperations.validateAllowAccess(this, diagnostics, context);
 	}
 
 	/**
@@ -81,167 +80,140 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.WRITE_LINK_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_LINK_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_LINK_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.WRITE_LINK_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.WRITE_LINK_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.WRITE_LINK_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.WRITE_LINK_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.WRITE_LINK_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.WRITE_LINK_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.WRITE_LINK_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.WRITE_LINK_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.WRITE_LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.WRITE_LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.WRITE_LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.WRITE_LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.WRITE_LINK_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.WRITE_LINK_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.WRITE_LINK_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.WRITE_LINK_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.WRITE_LINK_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_LINK_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_LINK_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_LINK_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.WRITE_LINK_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.WRITE_LINK_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.WRITE_LINK_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.WRITE_LINK_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.WRITE_LINK_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.WRITE_LINK_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.WRITE_LINK_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.WRITE_LINK_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_LINK_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_LINK_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_LINK_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.WRITE_LINK_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.WRITE_LINK_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.WRITE_LINK_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.WRITE_LINK_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.WRITE_LINK_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.WRITE_LINK_ACTION___VALIDATE_SAME_PINS__DIAGNOSTICCHAIN_MAP :
-				return validateSamePins((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_LINK_ACTION___VALIDATE_SAME_ASSOCIATION__DIAGNOSTICCHAIN_MAP :
-				return validateSameAssociation(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_LINK_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP :
-				return validateNotStatic((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_LINK_ACTION___ASSOCIATION :
-				return association();
-			case UMLPackage.WRITE_LINK_ACTION___VALIDATE_ALLOW_ACCESS__DIAGNOSTICCHAIN_MAP :
-				return validateAllowAccess((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.WRITE_LINK_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.WRITE_LINK_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.WRITE_LINK_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.WRITE_LINK_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.WRITE_LINK_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.WRITE_LINK_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.WRITE_LINK_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.WRITE_LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.WRITE_LINK_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.WRITE_LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.WRITE_LINK_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.WRITE_LINK_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.WRITE_LINK_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.WRITE_LINK_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.WRITE_LINK_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.WRITE_LINK_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.WRITE_LINK_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.WRITE_LINK_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.WRITE_LINK_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.WRITE_LINK_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.WRITE_LINK_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.WRITE_LINK_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.WRITE_LINK_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.WRITE_LINK_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.WRITE_LINK_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.WRITE_LINK_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.WRITE_LINK_ACTION___VALIDATE_SAME_PINS__DIAGNOSTICCHAIN_MAP:
+			return validateSamePins((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___VALIDATE_SAME_ASSOCIATION__DIAGNOSTICCHAIN_MAP:
+			return validateSameAssociation((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP:
+			return validateNotStatic((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_LINK_ACTION___ASSOCIATION:
+			return association();
+		case UMLPackage.WRITE_LINK_ACTION___VALIDATE_ALLOW_ACCESS__DIAGNOSTICCHAIN_MAP:
+			return validateAllowAccess((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/WriteStructuralFeatureActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/WriteStructuralFeatureActionImpl.java
index b1271d2..22609ea 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/WriteStructuralFeatureActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/WriteStructuralFeatureActionImpl.java
@@ -1,13 +1,13 @@
 /*
  * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -108,19 +111,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -129,11 +126,7 @@
 	 * @generated
 	 */
 	public InputPin getValue() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE, true,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE, true, true);
 	}
 
 	/**
@@ -142,11 +135,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetValue() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE, false,
-			true);
+		return (InputPin) eDynamicGet(UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE, false, true);
 	}
 
 	/**
@@ -156,8 +145,7 @@
 	 */
 	public NotificationChain basicSetValue(InputPin newValue,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newValue,
-			UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newValue, UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE, msgs);
 		return msgs;
 	}
 
@@ -167,11 +155,7 @@
 	 * @generated
 	 */
 	public void setValue(InputPin newValue) {
-		eDynamicSet(
-			UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE,
-			newValue);
+		eDynamicSet(UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE, newValue);
 	}
 
 	/**
@@ -204,11 +188,7 @@
 	 * @generated
 	 */
 	public OutputPin getResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT, true,
-			true);
+		return (OutputPin) eDynamicGet(UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT, true, true);
 	}
 
 	/**
@@ -217,11 +197,7 @@
 	 * @generated
 	 */
 	public OutputPin basicGetResult() {
-		return (OutputPin) eDynamicGet(
-			UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT, false,
-			true);
+		return (OutputPin) eDynamicGet(UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT, false, true);
 	}
 
 	/**
@@ -231,8 +207,7 @@
 	 */
 	public NotificationChain basicSetResult(OutputPin newResult,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newResult,
-			UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newResult, UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT, msgs);
 		return msgs;
 	}
 
@@ -242,11 +217,7 @@
 	 * @generated
 	 */
 	public void setResult(OutputPin newResult) {
-		eDynamicSet(
-			UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT
-				- ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT,
-			newResult);
+		eDynamicSet(UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT, newResult);
 	}
 
 	/**
@@ -255,8 +226,7 @@
 	 * @generated
 	 */
 	public OutputPin createResult(String name, Type type) {
-		OutputPin newResult = (OutputPin) create(
-			UMLPackage.Literals.OUTPUT_PIN);
+		OutputPin newResult = (OutputPin) create(UMLPackage.Literals.OUTPUT_PIN);
 		setResult(newResult);
 		if (name != null)
 			newResult.setName(name);
@@ -272,8 +242,7 @@
 	 */
 	public boolean validateTypeOfResult(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return WriteStructuralFeatureActionOperations.validateTypeOfResult(this,
-			diagnostics, context);
+		return WriteStructuralFeatureActionOperations.validateTypeOfResult(this, diagnostics, context);
 	}
 
 	/**
@@ -283,8 +252,7 @@
 	 */
 	public boolean validateMultiplicityOfResult(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return WriteStructuralFeatureActionOperations
-			.validateMultiplicityOfResult(this, diagnostics, context);
+		return WriteStructuralFeatureActionOperations.validateMultiplicityOfResult(this, diagnostics, context);
 	}
 
 	/**
@@ -294,8 +262,7 @@
 	 */
 	public boolean validateTypeOfValue(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return WriteStructuralFeatureActionOperations.validateTypeOfValue(this,
-			diagnostics, context);
+		return WriteStructuralFeatureActionOperations.validateTypeOfValue(this, diagnostics, context);
 	}
 
 	/**
@@ -305,8 +272,7 @@
 	 */
 	public boolean validateMultiplicityOfValue(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return WriteStructuralFeatureActionOperations
-			.validateMultiplicityOfValue(this, diagnostics, context);
+		return WriteStructuralFeatureActionOperations.validateMultiplicityOfValue(this, diagnostics, context);
 	}
 
 	/**
@@ -318,43 +284,34 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OBJECT :
-				return basicSetObject(null, msgs);
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT :
-				return basicSetResult(null, msgs);
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE :
-				return basicSetValue(null, msgs);
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OBJECT:
+			return basicSetObject(null, msgs);
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT:
+			return basicSetResult(null, msgs);
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE:
+			return basicSetValue(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -367,90 +324,90 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME :
-				return getName();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OBJECT :
-				if (resolve)
-					return getObject();
-				return basicGetObject();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				if (resolve)
-					return getStructuralFeature();
-				return basicGetStructuralFeature();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT :
-				if (resolve)
-					return getResult();
-				return basicGetResult();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE :
-				if (resolve)
-					return getValue();
-				return basicGetValue();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME:
+			return getName();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OBJECT:
+			if (resolve)
+				return getObject();
+			return basicGetObject();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			if (resolve)
+				return getStructuralFeature();
+			return basicGetStructuralFeature();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT:
+			if (resolve)
+				return getResult();
+			return basicGetResult();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE:
+			if (resolve)
+				return getValue();
+			return basicGetValue();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -464,89 +421,79 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OBJECT :
-				setObject((InputPin) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				setStructuralFeature((StructuralFeature) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT :
-				setResult((OutputPin) newValue);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE :
-				setValue((InputPin) newValue);
-				return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OBJECT:
+			setObject((InputPin) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			setStructuralFeature((StructuralFeature) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT:
+			setResult((OutputPin) newValue);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE:
+			setValue((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -559,69 +506,69 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OBJECT :
-				setObject((InputPin) null);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				setStructuralFeature((StructuralFeature) null);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT :
-				setResult((OutputPin) null);
-				return;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE :
-				setValue((InputPin) null);
-				return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OBJECT:
+			setObject((InputPin) null);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			setStructuralFeature((StructuralFeature) null);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT:
+			setResult((OutputPin) null);
+			return;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE:
+			setValue((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -634,72 +581,70 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OBJECT :
-				return basicGetObject() != null;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE :
-				return basicGetStructuralFeature() != null;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT :
-				return basicGetResult() != null;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE :
-				return basicGetValue() != null;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OBJECT:
+			return basicGetObject() != null;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__STRUCTURAL_FEATURE:
+			return basicGetStructuralFeature() != null;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT:
+			return basicGetResult() != null;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE:
+			return basicGetValue() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -714,182 +659,148 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_OBJECT_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateObjectType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP :
-				return validateVisibility((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP :
-				return validateNotStatic((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_ONE_FEATURING_CLASSIFIER__DIAGNOSTICCHAIN_MAP :
-				return validateOneFeaturingClassifier(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_MULTIPLICITY_OF_RESULT__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfResult(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_TYPE_OF_VALUE__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfValue((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_MULTIPLICITY_OF_VALUE__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicityOfValue(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_TYPE_OF_RESULT__DIAGNOSTICCHAIN_MAP :
-				return validateTypeOfResult((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_OBJECT_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateObjectType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_VISIBILITY__DIAGNOSTICCHAIN_MAP:
+			return validateVisibility((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_NOT_STATIC__DIAGNOSTICCHAIN_MAP:
+			return validateNotStatic((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_ONE_FEATURING_CLASSIFIER__DIAGNOSTICCHAIN_MAP:
+			return validateOneFeaturingClassifier((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_MULTIPLICITY_OF_RESULT__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfResult((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_TYPE_OF_VALUE__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfValue((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_MULTIPLICITY_OF_VALUE__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicityOfValue((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION___VALIDATE_TYPE_OF_RESULT__DIAGNOSTICCHAIN_MAP:
+			return validateTypeOfResult((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -905,20 +816,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<OutputPin> outputs = (EList<OutputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__OUTPUT);
+			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>(
-						OutputPin.class, this,
-						UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTPUT,
-						OUTPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__OUTPUT, outputs = new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTPUT, OUTPUT_ESUBSETS));
 			}
 			return outputs;
 		}
-		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this,
-			UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTPUT,
-			OUTPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<OutputPin>(OutputPin.class, this, UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OUTPUT, OUTPUT_ESUBSETS);
 	}
 
 	/**
@@ -929,8 +833,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] OUTPUT_ESUBSETS = new int[]{
-		UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT};
+	protected static final int[] OUTPUT_ESUBSETS = new int[] { UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT };
 
 	/**
 	 * The array of subset feature identifiers for the '{@link #getInputs() <em>Input</em>}' reference list.
@@ -940,9 +843,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OBJECT,
-		UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__OBJECT, UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -952,7 +853,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE);
+				|| eIsSet(UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__VALUE);
 	}
 
 	/**
@@ -963,7 +864,7 @@
 	@Override
 	public boolean isSetOutputs() {
 		return super.isSetOutputs()
-			|| eIsSet(UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT);
+				|| eIsSet(UMLPackage.WRITE_STRUCTURAL_FEATURE_ACTION__RESULT);
 	}
 
 } //WriteStructuralFeatureActionImpl
diff --git a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/WriteVariableActionImpl.java b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/WriteVariableActionImpl.java
index 65c933b..60932bd 100644
--- a/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/WriteVariableActionImpl.java
+++ b/cdo/bundles/uml/org.eclipse.uml2.uml.cdo/src/org/eclipse/uml2/uml/cdo/internal/impl/WriteVariableActionImpl.java
@@ -1,13 +1,13 @@
 /*
- * Copyright (c) 2005, 2016 IBM Corporation, CEA, and others.
+ * Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+ * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/epl-v20.html
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey - 286329, 323181
+ *   Kenn Hussey - 286329, 323181, 535301
  *   Kenn Hussey (CEA) - 327039, 351774, 418466, 451350, 485756
  *
  */
@@ -17,6 +17,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.DiagnosticChain;
@@ -27,6 +28,8 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
 import org.eclipse.emf.ecore.resource.Resource;
 
 import org.eclipse.emf.ecore.util.InternalEList;
@@ -105,19 +108,13 @@
 		if (cache != null) {
 			Resource eResource = eResource();
 			@SuppressWarnings("unchecked")
-			EList<InputPin> inputs = (EList<InputPin>) cache.get(eResource,
-				this, UMLPackage.Literals.ACTION__INPUT);
+			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>(
-						InputPin.class, this,
-						UMLPackage.WRITE_VARIABLE_ACTION__INPUT,
-						INPUT_ESUBSETS));
+				cache.put(eResource, this, UMLPackage.Literals.ACTION__INPUT, inputs = new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.WRITE_VARIABLE_ACTION__INPUT, INPUT_ESUBSETS));
 			}
 			return inputs;
 		}
-		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this,
-			UMLPackage.WRITE_VARIABLE_ACTION__INPUT, INPUT_ESUBSETS);
+		return new DerivedUnionEObjectEList<InputPin>(InputPin.class, this, UMLPackage.WRITE_VARIABLE_ACTION__INPUT, INPUT_ESUBSETS);
 	}
 
 	/**
@@ -126,9 +123,7 @@
 	 * @generated
 	 */
 	public InputPin getValue() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.WRITE_VARIABLE_ACTION__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.WRITE_VARIABLE_ACTION__VALUE, true, true);
+		return (InputPin) eDynamicGet(UMLPackage.WRITE_VARIABLE_ACTION__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.WRITE_VARIABLE_ACTION__VALUE, true, true);
 	}
 
 	/**
@@ -137,9 +132,7 @@
 	 * @generated
 	 */
 	public InputPin basicGetValue() {
-		return (InputPin) eDynamicGet(
-			UMLPackage.WRITE_VARIABLE_ACTION__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.WRITE_VARIABLE_ACTION__VALUE, false, true);
+		return (InputPin) eDynamicGet(UMLPackage.WRITE_VARIABLE_ACTION__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.WRITE_VARIABLE_ACTION__VALUE, false, true);
 	}
 
 	/**
@@ -149,8 +142,7 @@
 	 */
 	public NotificationChain basicSetValue(InputPin newValue,
 			NotificationChain msgs) {
-		msgs = eDynamicInverseAdd((InternalEObject) newValue,
-			UMLPackage.WRITE_VARIABLE_ACTION__VALUE, msgs);
+		msgs = eDynamicInverseAdd((InternalEObject) newValue, UMLPackage.WRITE_VARIABLE_ACTION__VALUE, msgs);
 		return msgs;
 	}
 
@@ -160,9 +152,7 @@
 	 * @generated
 	 */
 	public void setValue(InputPin newValue) {
-		eDynamicSet(
-			UMLPackage.WRITE_VARIABLE_ACTION__VALUE - ESTATIC_FEATURE_COUNT,
-			UMLPackage.Literals.WRITE_VARIABLE_ACTION__VALUE, newValue);
+		eDynamicSet(UMLPackage.WRITE_VARIABLE_ACTION__VALUE - ESTATIC_FEATURE_COUNT, UMLPackage.Literals.WRITE_VARIABLE_ACTION__VALUE, newValue);
 	}
 
 	/**
@@ -196,8 +186,7 @@
 	 */
 	public boolean validateValueType(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return WriteVariableActionOperations.validateValueType(this,
-			diagnostics, context);
+		return WriteVariableActionOperations.validateValueType(this, diagnostics, context);
 	}
 
 	/**
@@ -207,8 +196,7 @@
 	 */
 	public boolean validateMultiplicity(DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		return WriteVariableActionOperations.validateMultiplicity(this,
-			diagnostics, context);
+		return WriteVariableActionOperations.validateMultiplicity(this, diagnostics, context);
 	}
 
 	/**
@@ -220,39 +208,30 @@
 	public NotificationChain eInverseRemove(InternalEObject otherEnd,
 			int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case UMLPackage.WRITE_VARIABLE_ACTION__EANNOTATIONS :
-				return ((InternalEList<?>) getEAnnotations())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_COMMENT :
-				return ((InternalEList<?>) getOwnedComments())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.WRITE_VARIABLE_ACTION__NAME_EXPRESSION :
-				return basicSetNameExpression(null, msgs);
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return ((InternalEList<?>) getInInterruptibleRegions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_STRUCTURED_NODE :
-				return basicSetInStructuredNode(null, msgs);
-			case UMLPackage.WRITE_VARIABLE_ACTION__INCOMING :
-				return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.WRITE_VARIABLE_ACTION__OUTGOING :
-				return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_PARTITION :
-				return ((InternalEList<?>) getInPartitions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.WRITE_VARIABLE_ACTION__HANDLER :
-				return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd,
-					msgs);
-			case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				return ((InternalEList<?>) getLocalPostconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_PRECONDITION :
-				return ((InternalEList<?>) getLocalPreconditions())
-					.basicRemove(otherEnd, msgs);
-			case UMLPackage.WRITE_VARIABLE_ACTION__VALUE :
-				return basicSetValue(null, msgs);
+		case UMLPackage.WRITE_VARIABLE_ACTION__EANNOTATIONS:
+			return ((InternalEList<?>) getEAnnotations()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_COMMENT:
+			return ((InternalEList<?>) getOwnedComments()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_VARIABLE_ACTION__NAME_EXPRESSION:
+			return basicSetNameExpression(null, msgs);
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return ((InternalEList<?>) getInInterruptibleRegions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_STRUCTURED_NODE:
+			return basicSetInStructuredNode(null, msgs);
+		case UMLPackage.WRITE_VARIABLE_ACTION__INCOMING:
+			return ((InternalEList<?>) getIncomings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_VARIABLE_ACTION__OUTGOING:
+			return ((InternalEList<?>) getOutgoings()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_PARTITION:
+			return ((InternalEList<?>) getInPartitions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_VARIABLE_ACTION__HANDLER:
+			return ((InternalEList<?>) getHandlers()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_POSTCONDITION:
+			return ((InternalEList<?>) getLocalPostconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_PRECONDITION:
+			return ((InternalEList<?>) getLocalPreconditions()).basicRemove(otherEnd, msgs);
+		case UMLPackage.WRITE_VARIABLE_ACTION__VALUE:
+			return basicSetValue(null, msgs);
 		}
 		return eDynamicInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -265,82 +244,82 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case UMLPackage.WRITE_VARIABLE_ACTION__EANNOTATIONS :
-				return getEAnnotations();
-			case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_COMMENT :
-				return getOwnedComments();
-			case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_ELEMENT :
-				return getOwnedElements();
-			case UMLPackage.WRITE_VARIABLE_ACTION__OWNER :
-				if (resolve)
-					return getOwner();
-				return basicGetOwner();
-			case UMLPackage.WRITE_VARIABLE_ACTION__CLIENT_DEPENDENCY :
-				return getClientDependencies();
-			case UMLPackage.WRITE_VARIABLE_ACTION__NAME :
-				return getName();
-			case UMLPackage.WRITE_VARIABLE_ACTION__NAME_EXPRESSION :
-				if (resolve)
-					return getNameExpression();
-				return basicGetNameExpression();
-			case UMLPackage.WRITE_VARIABLE_ACTION__NAMESPACE :
-				if (resolve)
-					return getNamespace();
-				return basicGetNamespace();
-			case UMLPackage.WRITE_VARIABLE_ACTION__QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.WRITE_VARIABLE_ACTION__VISIBILITY :
-				return getVisibility();
-			case UMLPackage.WRITE_VARIABLE_ACTION__IS_LEAF :
-				return isLeaf();
-			case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINED_ELEMENT :
-				return getRedefinedElements();
-			case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINITION_CONTEXT :
-				return getRedefinitionContexts();
-			case UMLPackage.WRITE_VARIABLE_ACTION__ACTIVITY :
-				if (resolve)
-					return getActivity();
-				return basicGetActivity();
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_GROUP :
-				return getInGroups();
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return getInInterruptibleRegions();
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_STRUCTURED_NODE :
-				if (resolve)
-					return getInStructuredNode();
-				return basicGetInStructuredNode();
-			case UMLPackage.WRITE_VARIABLE_ACTION__INCOMING :
-				return getIncomings();
-			case UMLPackage.WRITE_VARIABLE_ACTION__OUTGOING :
-				return getOutgoings();
-			case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINED_NODE :
-				return getRedefinedNodes();
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_PARTITION :
-				return getInPartitions();
-			case UMLPackage.WRITE_VARIABLE_ACTION__HANDLER :
-				return getHandlers();
-			case UMLPackage.WRITE_VARIABLE_ACTION__CONTEXT :
-				if (resolve)
-					return getContext();
-				return basicGetContext();
-			case UMLPackage.WRITE_VARIABLE_ACTION__INPUT :
-				return getInputs();
-			case UMLPackage.WRITE_VARIABLE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant();
-			case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				return getLocalPostconditions();
-			case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_PRECONDITION :
-				return getLocalPreconditions();
-			case UMLPackage.WRITE_VARIABLE_ACTION__OUTPUT :
-				return getOutputs();
-			case UMLPackage.WRITE_VARIABLE_ACTION__VARIABLE :
-				if (resolve)
-					return getVariable();
-				return basicGetVariable();
-			case UMLPackage.WRITE_VARIABLE_ACTION__VALUE :
-				if (resolve)
-					return getValue();
-				return basicGetValue();
+		case UMLPackage.WRITE_VARIABLE_ACTION__EANNOTATIONS:
+			return getEAnnotations();
+		case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_COMMENT:
+			return getOwnedComments();
+		case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_ELEMENT:
+			return getOwnedElements();
+		case UMLPackage.WRITE_VARIABLE_ACTION__OWNER:
+			if (resolve)
+				return getOwner();
+			return basicGetOwner();
+		case UMLPackage.WRITE_VARIABLE_ACTION__CLIENT_DEPENDENCY:
+			return getClientDependencies();
+		case UMLPackage.WRITE_VARIABLE_ACTION__NAME:
+			return getName();
+		case UMLPackage.WRITE_VARIABLE_ACTION__NAME_EXPRESSION:
+			if (resolve)
+				return getNameExpression();
+			return basicGetNameExpression();
+		case UMLPackage.WRITE_VARIABLE_ACTION__NAMESPACE:
+			if (resolve)
+				return getNamespace();
+			return basicGetNamespace();
+		case UMLPackage.WRITE_VARIABLE_ACTION__QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.WRITE_VARIABLE_ACTION__VISIBILITY:
+			return getVisibility();
+		case UMLPackage.WRITE_VARIABLE_ACTION__IS_LEAF:
+			return isLeaf();
+		case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINED_ELEMENT:
+			return getRedefinedElements();
+		case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINITION_CONTEXT:
+			return getRedefinitionContexts();
+		case UMLPackage.WRITE_VARIABLE_ACTION__ACTIVITY:
+			if (resolve)
+				return getActivity();
+			return basicGetActivity();
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_GROUP:
+			return getInGroups();
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return getInInterruptibleRegions();
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_STRUCTURED_NODE:
+			if (resolve)
+				return getInStructuredNode();
+			return basicGetInStructuredNode();
+		case UMLPackage.WRITE_VARIABLE_ACTION__INCOMING:
+			return getIncomings();
+		case UMLPackage.WRITE_VARIABLE_ACTION__OUTGOING:
+			return getOutgoings();
+		case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINED_NODE:
+			return getRedefinedNodes();
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_PARTITION:
+			return getInPartitions();
+		case UMLPackage.WRITE_VARIABLE_ACTION__HANDLER:
+			return getHandlers();
+		case UMLPackage.WRITE_VARIABLE_ACTION__CONTEXT:
+			if (resolve)
+				return getContext();
+			return basicGetContext();
+		case UMLPackage.WRITE_VARIABLE_ACTION__INPUT:
+			return getInputs();
+		case UMLPackage.WRITE_VARIABLE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant();
+		case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_POSTCONDITION:
+			return getLocalPostconditions();
+		case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_PRECONDITION:
+			return getLocalPreconditions();
+		case UMLPackage.WRITE_VARIABLE_ACTION__OUTPUT:
+			return getOutputs();
+		case UMLPackage.WRITE_VARIABLE_ACTION__VARIABLE:
+			if (resolve)
+				return getVariable();
+			return basicGetVariable();
+		case UMLPackage.WRITE_VARIABLE_ACTION__VALUE:
+			if (resolve)
+				return getValue();
+			return basicGetValue();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
 	}
@@ -354,83 +333,73 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case UMLPackage.WRITE_VARIABLE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				getEAnnotations()
-					.addAll((Collection<? extends EAnnotation>) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				getOwnedComments()
-					.addAll((Collection<? extends Comment>) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__NAME :
-				setName((String) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__VISIBILITY :
-				setVisibility((VisibilityKind) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__IS_LEAF :
-				setIsLeaf((Boolean) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__ACTIVITY :
-				setActivity((Activity) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				getInInterruptibleRegions().addAll(
-					(Collection<? extends InterruptibleActivityRegion>) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__INCOMING :
-				getIncomings().clear();
-				getIncomings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				getOutgoings()
-					.addAll((Collection<? extends ActivityEdge>) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				getRedefinedNodes()
-					.addAll((Collection<? extends ActivityNode>) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				getInPartitions()
-					.addAll((Collection<? extends ActivityPartition>) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__HANDLER :
-				getHandlers().clear();
-				getHandlers()
-					.addAll((Collection<? extends ExceptionHandler>) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant((Boolean) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				getLocalPostconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				getLocalPreconditions()
-					.addAll((Collection<? extends Constraint>) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__VARIABLE :
-				setVariable((Variable) newValue);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__VALUE :
-				setValue((InputPin) newValue);
-				return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			getEAnnotations().addAll((Collection<? extends EAnnotation>) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			getOwnedComments().addAll((Collection<? extends Comment>) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__NAME:
+			setName((String) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__VISIBILITY:
+			setVisibility((VisibilityKind) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__IS_LEAF:
+			setIsLeaf((Boolean) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__ACTIVITY:
+			setActivity((Activity) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			getInInterruptibleRegions().addAll((Collection<? extends InterruptibleActivityRegion>) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__INCOMING:
+			getIncomings().clear();
+			getIncomings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			getOutgoings().addAll((Collection<? extends ActivityEdge>) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			getRedefinedNodes().addAll((Collection<? extends ActivityNode>) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			getInPartitions().addAll((Collection<? extends ActivityPartition>) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__HANDLER:
+			getHandlers().clear();
+			getHandlers().addAll((Collection<? extends ExceptionHandler>) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant((Boolean) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			getLocalPostconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			getLocalPreconditions().addAll((Collection<? extends Constraint>) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__VARIABLE:
+			setVariable((Variable) newValue);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__VALUE:
+			setValue((InputPin) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
 	}
@@ -443,63 +412,63 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case UMLPackage.WRITE_VARIABLE_ACTION__EANNOTATIONS :
-				getEAnnotations().clear();
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_COMMENT :
-				getOwnedComments().clear();
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__NAME :
-				unsetName();
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__NAME_EXPRESSION :
-				setNameExpression((StringExpression) null);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__VISIBILITY :
-				unsetVisibility();
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__IS_LEAF :
-				setIsLeaf(IS_LEAF_EDEFAULT);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__ACTIVITY :
-				setActivity((Activity) null);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				getInInterruptibleRegions().clear();
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_STRUCTURED_NODE :
-				setInStructuredNode((StructuredActivityNode) null);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__INCOMING :
-				getIncomings().clear();
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__OUTGOING :
-				getOutgoings().clear();
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINED_NODE :
-				getRedefinedNodes().clear();
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_PARTITION :
-				getInPartitions().clear();
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__HANDLER :
-				getHandlers().clear();
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__IS_LOCALLY_REENTRANT :
-				setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				getLocalPostconditions().clear();
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_PRECONDITION :
-				getLocalPreconditions().clear();
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__VARIABLE :
-				setVariable((Variable) null);
-				return;
-			case UMLPackage.WRITE_VARIABLE_ACTION__VALUE :
-				setValue((InputPin) null);
-				return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__EANNOTATIONS:
+			getEAnnotations().clear();
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_COMMENT:
+			getOwnedComments().clear();
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__NAME:
+			unsetName();
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__NAME_EXPRESSION:
+			setNameExpression((StringExpression) null);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__VISIBILITY:
+			unsetVisibility();
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__IS_LEAF:
+			setIsLeaf(IS_LEAF_EDEFAULT);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__ACTIVITY:
+			setActivity((Activity) null);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION:
+			getInInterruptibleRegions().clear();
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_STRUCTURED_NODE:
+			setInStructuredNode((StructuredActivityNode) null);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__INCOMING:
+			getIncomings().clear();
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__OUTGOING:
+			getOutgoings().clear();
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINED_NODE:
+			getRedefinedNodes().clear();
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_PARTITION:
+			getInPartitions().clear();
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__HANDLER:
+			getHandlers().clear();
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__IS_LOCALLY_REENTRANT:
+			setIsLocallyReentrant(IS_LOCALLY_REENTRANT_EDEFAULT);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_POSTCONDITION:
+			getLocalPostconditions().clear();
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_PRECONDITION:
+			getLocalPreconditions().clear();
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__VARIABLE:
+			setVariable((Variable) null);
+			return;
+		case UMLPackage.WRITE_VARIABLE_ACTION__VALUE:
+			setValue((InputPin) null);
+			return;
 		}
 		eDynamicUnset(featureID);
 	}
@@ -512,68 +481,66 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case UMLPackage.WRITE_VARIABLE_ACTION__EANNOTATIONS :
-				return !getEAnnotations().isEmpty();
-			case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_COMMENT :
-				return !getOwnedComments().isEmpty();
-			case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_ELEMENT :
-				return isSetOwnedElements();
-			case UMLPackage.WRITE_VARIABLE_ACTION__OWNER :
-				return isSetOwner();
-			case UMLPackage.WRITE_VARIABLE_ACTION__CLIENT_DEPENDENCY :
-				return !getClientDependencies().isEmpty();
-			case UMLPackage.WRITE_VARIABLE_ACTION__NAME :
-				return isSetName();
-			case UMLPackage.WRITE_VARIABLE_ACTION__NAME_EXPRESSION :
-				return basicGetNameExpression() != null;
-			case UMLPackage.WRITE_VARIABLE_ACTION__NAMESPACE :
-				return isSetNamespace();
-			case UMLPackage.WRITE_VARIABLE_ACTION__QUALIFIED_NAME :
-				return QUALIFIED_NAME_EDEFAULT == null
-					? getQualifiedName() != null
-					: !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
-			case UMLPackage.WRITE_VARIABLE_ACTION__VISIBILITY :
-				return isSetVisibility();
-			case UMLPackage.WRITE_VARIABLE_ACTION__IS_LEAF :
-				return isLeaf() != IS_LEAF_EDEFAULT;
-			case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINED_ELEMENT :
-				return isSetRedefinedElements();
-			case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINITION_CONTEXT :
-				return isSetRedefinitionContexts();
-			case UMLPackage.WRITE_VARIABLE_ACTION__ACTIVITY :
-				return basicGetActivity() != null;
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_GROUP :
-				return isSetInGroups();
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION :
-				return !getInInterruptibleRegions().isEmpty();
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_STRUCTURED_NODE :
-				return basicGetInStructuredNode() != null;
-			case UMLPackage.WRITE_VARIABLE_ACTION__INCOMING :
-				return !getIncomings().isEmpty();
-			case UMLPackage.WRITE_VARIABLE_ACTION__OUTGOING :
-				return !getOutgoings().isEmpty();
-			case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINED_NODE :
-				return !getRedefinedNodes().isEmpty();
-			case UMLPackage.WRITE_VARIABLE_ACTION__IN_PARTITION :
-				return !getInPartitions().isEmpty();
-			case UMLPackage.WRITE_VARIABLE_ACTION__HANDLER :
-				return !getHandlers().isEmpty();
-			case UMLPackage.WRITE_VARIABLE_ACTION__CONTEXT :
-				return basicGetContext() != null;
-			case UMLPackage.WRITE_VARIABLE_ACTION__INPUT :
-				return isSetInputs();
-			case UMLPackage.WRITE_VARIABLE_ACTION__IS_LOCALLY_REENTRANT :
-				return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
-			case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_POSTCONDITION :
-				return !getLocalPostconditions().isEmpty();
-			case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_PRECONDITION :
-				return !getLocalPreconditions().isEmpty();
-			case UMLPackage.WRITE_VARIABLE_ACTION__OUTPUT :
-				return isSetOutputs();
-			case UMLPackage.WRITE_VARIABLE_ACTION__VARIABLE :
-				return basicGetVariable() != null;
-			case UMLPackage.WRITE_VARIABLE_ACTION__VALUE :
-				return basicGetValue() != null;
+		case UMLPackage.WRITE_VARIABLE_ACTION__EANNOTATIONS:
+			return !getEAnnotations().isEmpty();
+		case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_COMMENT:
+			return !getOwnedComments().isEmpty();
+		case UMLPackage.WRITE_VARIABLE_ACTION__OWNED_ELEMENT:
+			return isSetOwnedElements();
+		case UMLPackage.WRITE_VARIABLE_ACTION__OWNER:
+			return isSetOwner();
+		case UMLPackage.WRITE_VARIABLE_ACTION__CLIENT_DEPENDENCY:
+			return !getClientDependencies().isEmpty();
+		case UMLPackage.WRITE_VARIABLE_ACTION__NAME:
+			return isSetName();
+		case UMLPackage.WRITE_VARIABLE_ACTION__NAME_EXPRESSION:
+			return basicGetNameExpression() != null;
+		case UMLPackage.WRITE_VARIABLE_ACTION__NAMESPACE:
+			return isSetNamespace();
+		case UMLPackage.WRITE_VARIABLE_ACTION__QUALIFIED_NAME:
+			return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
+		case UMLPackage.WRITE_VARIABLE_ACTION__VISIBILITY:
+			return isSetVisibility();
+		case UMLPackage.WRITE_VARIABLE_ACTION__IS_LEAF:
+			return isLeaf() != IS_LEAF_EDEFAULT;
+		case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINED_ELEMENT:
+			return isSetRedefinedElements();
+		case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINITION_CONTEXT:
+			return isSetRedefinitionContexts();
+		case UMLPackage.WRITE_VARIABLE_ACTION__ACTIVITY:
+			return basicGetActivity() != null;
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_GROUP:
+			return isSetInGroups();
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_INTERRUPTIBLE_REGION:
+			return !getInInterruptibleRegions().isEmpty();
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_STRUCTURED_NODE:
+			return basicGetInStructuredNode() != null;
+		case UMLPackage.WRITE_VARIABLE_ACTION__INCOMING:
+			return !getIncomings().isEmpty();
+		case UMLPackage.WRITE_VARIABLE_ACTION__OUTGOING:
+			return !getOutgoings().isEmpty();
+		case UMLPackage.WRITE_VARIABLE_ACTION__REDEFINED_NODE:
+			return !getRedefinedNodes().isEmpty();
+		case UMLPackage.WRITE_VARIABLE_ACTION__IN_PARTITION:
+			return !getInPartitions().isEmpty();
+		case UMLPackage.WRITE_VARIABLE_ACTION__HANDLER:
+			return !getHandlers().isEmpty();
+		case UMLPackage.WRITE_VARIABLE_ACTION__CONTEXT:
+			return basicGetContext() != null;
+		case UMLPackage.WRITE_VARIABLE_ACTION__INPUT:
+			return isSetInputs();
+		case UMLPackage.WRITE_VARIABLE_ACTION__IS_LOCALLY_REENTRANT:
+			return isLocallyReentrant() != IS_LOCALLY_REENTRANT_EDEFAULT;
+		case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_POSTCONDITION:
+			return !getLocalPostconditions().isEmpty();
+		case UMLPackage.WRITE_VARIABLE_ACTION__LOCAL_PRECONDITION:
+			return !getLocalPreconditions().isEmpty();
+		case UMLPackage.WRITE_VARIABLE_ACTION__OUTPUT:
+			return isSetOutputs();
+		case UMLPackage.WRITE_VARIABLE_ACTION__VARIABLE:
+			return basicGetVariable() != null;
+		case UMLPackage.WRITE_VARIABLE_ACTION__VALUE:
+			return basicGetValue() != null;
 		}
 		return eDynamicIsSet(featureID);
 	}
@@ -588,162 +555,136 @@
 	public Object eInvoke(int operationID, EList<?> arguments)
 			throws InvocationTargetException {
 		switch (operationID) {
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_EANNOTATION__STRING :
-				return getEAnnotation((String) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP :
-				return validateHasOwner((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP :
-				return validateNotOwnSelf((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_VARIABLE_ACTION___ADD_KEYWORD__STRING :
-				return addKeyword((String) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___APPLY_STEREOTYPE__STEREOTYPE :
-				return applyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___CREATE_EANNOTATION__STRING :
-				return createEAnnotation((String) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___DESTROY :
-				destroy();
-				return null;
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_KEYWORDS :
-				return getKeywords();
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING :
-				return getApplicableStereotype((String) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_APPLICABLE_STEREOTYPES :
-				return getApplicableStereotypes();
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_APPLIED_STEREOTYPE__STRING :
-				return getAppliedStereotype((String) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_APPLIED_STEREOTYPES :
-				return getAppliedStereotypes();
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING :
-				return getAppliedSubstereotype((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE :
-				return getAppliedSubstereotypes((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_MODEL :
-				return getModel();
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_NEAREST_PACKAGE :
-				return getNearestPackage();
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_RELATIONSHIPS :
-				return getRelationships();
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_RELATIONSHIPS__ECLASS :
-				return getRelationships((EClass) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_REQUIRED_STEREOTYPE__STRING :
-				return getRequiredStereotype((String) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_REQUIRED_STEREOTYPES :
-				return getRequiredStereotypes();
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS :
-				return getSourceDirectedRelationships();
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getSourceDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE :
-				return getStereotypeApplication((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_STEREOTYPE_APPLICATIONS :
-				return getStereotypeApplications();
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS :
-				return getTargetDirectedRelationships();
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS :
-				return getTargetDirectedRelationships(
-					(EClass) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_VALUE__STEREOTYPE_STRING :
-				return getValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.WRITE_VARIABLE_ACTION___HAS_KEYWORD__STRING :
-				return hasKeyword((String) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___HAS_VALUE__STEREOTYPE_STRING :
-				return hasValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1));
-			case UMLPackage.WRITE_VARIABLE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE :
-				return isStereotypeApplicable((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE :
-				return isStereotypeApplied((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE :
-				return isStereotypeRequired((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___REMOVE_KEYWORD__STRING :
-				return removeKeyword((String) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT :
-				setValue((Stereotype) arguments.get(0),
-					(String) arguments.get(1), arguments.get(2));
-				return null;
-			case UMLPackage.WRITE_VARIABLE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE :
-				return unapplyStereotype((Stereotype) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___ALL_OWNED_ELEMENTS :
-				return allOwnedElements();
-			case UMLPackage.WRITE_VARIABLE_ACTION___MUST_BE_OWNED :
-				return mustBeOwned();
-			case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP :
-				return validateVisibilityNeedsOwnership(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP :
-				return validateHasNoQualifiedName(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_VARIABLE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT :
-				return createDependency((NamedElement) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___CREATE_USAGE__NAMEDELEMENT :
-				return createUsage((NamedElement) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_LABEL :
-				return getLabel();
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_LABEL__BOOLEAN :
-				return getLabel((Boolean) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_NAMESPACE :
-				return getNamespace();
-			case UMLPackage.WRITE_VARIABLE_ACTION___ALL_NAMESPACES :
-				return allNamespaces();
-			case UMLPackage.WRITE_VARIABLE_ACTION___ALL_OWNING_PACKAGES :
-				return allOwningPackages();
-			case UMLPackage.WRITE_VARIABLE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE :
-				return isDistinguishableFrom((NamedElement) arguments.get(0),
-					(Namespace) arguments.get(1));
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_QUALIFIED_NAME :
-				return getQualifiedName();
-			case UMLPackage.WRITE_VARIABLE_ACTION___SEPARATOR :
-				return separator();
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_CLIENT_DEPENDENCIES :
-				return getClientDependencies();
-			case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionConsistent(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP :
-				return validateNonLeafRedefinition(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP :
-				return validateRedefinitionContextValid(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_VARIABLE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT :
-				return isConsistentWith((RedefinableElement) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT :
-				return isRedefinitionContextValid(
-					(RedefinableElement) arguments.get(0));
-			case UMLPackage.WRITE_VARIABLE_ACTION___CONTAINING_ACTIVITY :
-				return containingActivity();
-			case UMLPackage.WRITE_VARIABLE_ACTION___GET_CONTEXT :
-				return getContext();
-			case UMLPackage.WRITE_VARIABLE_ACTION___ALL_ACTIONS :
-				return allActions();
-			case UMLPackage.WRITE_VARIABLE_ACTION___ALL_OWNED_NODES :
-				return allOwnedNodes();
-			case UMLPackage.WRITE_VARIABLE_ACTION___CONTAINING_BEHAVIOR :
-				return containingBehavior();
-			case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_SCOPE_OF_VARIABLE__DIAGNOSTICCHAIN_MAP :
-				return validateScopeOfVariable(
-					(DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_VALUE_TYPE__DIAGNOSTICCHAIN_MAP :
-				return validateValueType((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
-			case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP :
-				return validateMultiplicity((DiagnosticChain) arguments.get(0),
-					(Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_EANNOTATION__STRING:
+			return getEAnnotation((String) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_HAS_OWNER__DIAGNOSTICCHAIN_MAP:
+			return validateHasOwner((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_NOT_OWN_SELF__DIAGNOSTICCHAIN_MAP:
+			return validateNotOwnSelf((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_VARIABLE_ACTION___ADD_KEYWORD__STRING:
+			return addKeyword((String) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___APPLY_STEREOTYPE__STEREOTYPE:
+			return applyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___CREATE_EANNOTATION__STRING:
+			return createEAnnotation((String) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___DESTROY:
+			destroy();
+			return null;
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_KEYWORDS:
+			return getKeywords();
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_APPLICABLE_STEREOTYPE__STRING:
+			return getApplicableStereotype((String) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_APPLICABLE_STEREOTYPES:
+			return getApplicableStereotypes();
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_APPLIED_STEREOTYPE__STRING:
+			return getAppliedStereotype((String) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_APPLIED_STEREOTYPES:
+			return getAppliedStereotypes();
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_APPLIED_SUBSTEREOTYPE__STEREOTYPE_STRING:
+			return getAppliedSubstereotype((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_APPLIED_SUBSTEREOTYPES__STEREOTYPE:
+			return getAppliedSubstereotypes((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_MODEL:
+			return getModel();
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_NEAREST_PACKAGE:
+			return getNearestPackage();
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_RELATIONSHIPS:
+			return getRelationships();
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_RELATIONSHIPS__ECLASS:
+			return getRelationships((EClass) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_REQUIRED_STEREOTYPE__STRING:
+			return getRequiredStereotype((String) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_REQUIRED_STEREOTYPES:
+			return getRequiredStereotypes();
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS:
+			return getSourceDirectedRelationships();
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_SOURCE_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getSourceDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_STEREOTYPE_APPLICATION__STEREOTYPE:
+			return getStereotypeApplication((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_STEREOTYPE_APPLICATIONS:
+			return getStereotypeApplications();
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS:
+			return getTargetDirectedRelationships();
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_TARGET_DIRECTED_RELATIONSHIPS__ECLASS:
+			return getTargetDirectedRelationships((EClass) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_VALUE__STEREOTYPE_STRING:
+			return getValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.WRITE_VARIABLE_ACTION___HAS_KEYWORD__STRING:
+			return hasKeyword((String) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___HAS_VALUE__STEREOTYPE_STRING:
+			return hasValue((Stereotype) arguments.get(0), (String) arguments.get(1));
+		case UMLPackage.WRITE_VARIABLE_ACTION___IS_STEREOTYPE_APPLICABLE__STEREOTYPE:
+			return isStereotypeApplicable((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___IS_STEREOTYPE_APPLIED__STEREOTYPE:
+			return isStereotypeApplied((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___IS_STEREOTYPE_REQUIRED__STEREOTYPE:
+			return isStereotypeRequired((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___REMOVE_KEYWORD__STRING:
+			return removeKeyword((String) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___SET_VALUE__STEREOTYPE_STRING_OBJECT:
+			setValue((Stereotype) arguments.get(0), (String) arguments.get(1), arguments.get(2));
+			return null;
+		case UMLPackage.WRITE_VARIABLE_ACTION___UNAPPLY_STEREOTYPE__STEREOTYPE:
+			return unapplyStereotype((Stereotype) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___ALL_OWNED_ELEMENTS:
+			return allOwnedElements();
+		case UMLPackage.WRITE_VARIABLE_ACTION___MUST_BE_OWNED:
+			return mustBeOwned();
+		case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_VISIBILITY_NEEDS_OWNERSHIP__DIAGNOSTICCHAIN_MAP:
+			return validateVisibilityNeedsOwnership((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_HAS_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_HAS_NO_QUALIFIED_NAME__DIAGNOSTICCHAIN_MAP:
+			return validateHasNoQualifiedName((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_VARIABLE_ACTION___CREATE_DEPENDENCY__NAMEDELEMENT:
+			return createDependency((NamedElement) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___CREATE_USAGE__NAMEDELEMENT:
+			return createUsage((NamedElement) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_LABEL:
+			return getLabel();
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_LABEL__BOOLEAN:
+			return getLabel((Boolean) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_NAMESPACE:
+			return getNamespace();
+		case UMLPackage.WRITE_VARIABLE_ACTION___ALL_NAMESPACES:
+			return allNamespaces();
+		case UMLPackage.WRITE_VARIABLE_ACTION___ALL_OWNING_PACKAGES:
+			return allOwningPackages();
+		case UMLPackage.WRITE_VARIABLE_ACTION___IS_DISTINGUISHABLE_FROM__NAMEDELEMENT_NAMESPACE:
+			return isDistinguishableFrom((NamedElement) arguments.get(0), (Namespace) arguments.get(1));
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_QUALIFIED_NAME:
+			return getQualifiedName();
+		case UMLPackage.WRITE_VARIABLE_ACTION___SEPARATOR:
+			return separator();
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_CLIENT_DEPENDENCIES:
+			return getClientDependencies();
+		case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_REDEFINITION_CONSISTENT__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionConsistent((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_NON_LEAF_REDEFINITION__DIAGNOSTICCHAIN_MAP:
+			return validateNonLeafRedefinition((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_REDEFINITION_CONTEXT_VALID__DIAGNOSTICCHAIN_MAP:
+			return validateRedefinitionContextValid((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_VARIABLE_ACTION___IS_CONSISTENT_WITH__REDEFINABLEELEMENT:
+			return isConsistentWith((RedefinableElement) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___IS_REDEFINITION_CONTEXT_VALID__REDEFINABLEELEMENT:
+			return isRedefinitionContextValid((RedefinableElement) arguments.get(0));
+		case UMLPackage.WRITE_VARIABLE_ACTION___CONTAINING_ACTIVITY:
+			return containingActivity();
+		case UMLPackage.WRITE_VARIABLE_ACTION___GET_CONTEXT:
+			return getContext();
+		case UMLPackage.WRITE_VARIABLE_ACTION___ALL_ACTIONS:
+			return allActions();
+		case UMLPackage.WRITE_VARIABLE_ACTION___ALL_OWNED_NODES:
+			return allOwnedNodes();
+		case UMLPackage.WRITE_VARIABLE_ACTION___CONTAINING_BEHAVIOR:
+			return containingBehavior();
+		case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_SCOPE_OF_VARIABLE__DIAGNOSTICCHAIN_MAP:
+			return validateScopeOfVariable((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_VALUE_TYPE__DIAGNOSTICCHAIN_MAP:
+			return validateValueType((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
+		case UMLPackage.WRITE_VARIABLE_ACTION___VALIDATE_MULTIPLICITY__DIAGNOSTICCHAIN_MAP:
+			return validateMultiplicity((DiagnosticChain) arguments.get(0), (Map<Object, Object>) arguments.get(1));
 		}
 		return eDynamicInvoke(operationID, arguments);
 	}
@@ -756,8 +697,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int[] INPUT_ESUBSETS = new int[]{
-		UMLPackage.WRITE_VARIABLE_ACTION__VALUE};
+	protected static final int[] INPUT_ESUBSETS = new int[] { UMLPackage.WRITE_VARIABLE_ACTION__VALUE };
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -767,7 +707,7 @@
 	@Override
 	public boolean isSetInputs() {
 		return super.isSetInputs()
-			|| eIsSet(UMLPackage.WRITE_VARIABLE_ACTION__VALUE);
+				|| eIsSet(UMLPackage.WRITE_VARIABLE_ACTION__VALUE);
 	}
 
 } //WriteVariableActionImpl
